文字数制限のないFAQチャットボットの実装方法【Python / LangChain / ChatGPT】
はじめまして、ますみです!
株式会社Galirage(ガリレージ)という「生成AIに特化して、システム開発・アドバイザリー支援・研修支援をしているIT企業」で、代表をしております^^
この記事では、「LangChain」というライブラリを使って、「文字数制限のないFAQチャットボットの作り方」を解説します。
ChatGPTやLangChainやについてまだ詳しくない方は、こちらを先にご覧ください◎
具体的には、「Map Reduce」「Map Rerank」「Refine」の3つのアルゴリズムの実装方法を説明します。
これらの概念がまだ知らない方は、先に下記の記事をご覧ください。
1. ゴールとシステム設計
今回の目標は、YouTubeの長文字幕に対して質問ができるチャットボットを作ることです。
そのためのシステム設計について説明します。
- YouTubeから字幕情報を取得します。
- 取得した字幕情報に対して、「Map Reduce」「Map Rerank」「Refine」の3つのアルゴリズムを適用します。
- これらのアルゴリズムを用いて、質問に対する回答を生成します。
具体的な実装方法としては、Pythonというプログラミング言語を使います。
その中でも、LangChainというライブラリを活用します。
この時、LangChainの中にある「Chains」という機能を使います。
Chainsは、複数のプロンプト入力を実行する機能です。
以上が、今回のゴールとシステム設計の概要です。
次の章では、具体的な実装方法について詳しく説明します。
2. 環境構築
Pythonでの作業を始める前に、必要なツールを揃えましょう。
まずは、LangChainというライブラリをインストールします。
次に、OpenAIのモデルを使うための準備をします。
最後に、YouTubeの字幕情報を取得するためのライブラリと、Chainで使うライブラリをインストールします。
-
LangChainのインストール:
pip install langchain
でインストールします。 -
OpenAIのインストール:
pip install openai
でインストールします。 -
YouTube字幕取得ライブラリのインストール:
youtube-transcript-api
でインストールします。 -
トークン数の計算ライブラリのインストール:
pip install tiktoken
でインストールします。 - APIキーの設定:OpenAIを使うためには、APIキーが必要です。自分で発行したAPIキーを、指定の場所に設定します。
APIキーの発行方法がわからない方は、下記の記事を参考にしてください。
具体的なインストール方法は次の通りです。
pip install langchain==0.0.149
pip install openai==0.27.6
pip install youtube-transcript-api==0.6.1
pip install tiktoken==0.4.0
また、APIキーを設定する方法は、次のとおりです。
import os
#TODO: APIキーの登録が必要
os.environ["OPENAI_API_KEY"] = "..."
これで、Pythonでプログラムを作る準備が整いました。
3. 「Map Reduce」の実装方法
この章では、「Map Reduce」の実装方法を解説します。
具体的な流れは次の通りです。
- 「YoutubeLoader」でYouTubeの動画を読み込みます。
- 「CharacterTextSplitter」でテキストを分割します。
- 分割したテキストは、ドキュメントのリストとして格納します。
- 「load_qa_chain」モジュールを使い、「map_reduce」を行います。
- 生成されたChainを実行します。
実際に、以下のYouTubeの動画に対して、「YouTubeを学習したChatGPTを実装するために、インストールが必要なライブラリを教えて。」と質問してみましょう。
具体的なコードは以下のとおりです。
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import YoutubeLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.docstore.document import Document
from langchain.chains.question_answering import load_qa_chain
import time
start_time = time.time()
youtube_url = "https://www.youtube.com/watch?v=TQvaocfmvaI"
loader = YoutubeLoader.from_youtube_url(youtube_url, language="ja")
transcript_text = loader.load()[0].page_content
print(f"{transcript_text = }")
print(f"{len(transcript_text) = }")
text_splitter = CharacterTextSplitter(separator=" ", chunk_size=500)
texts = text_splitter.split_text(transcript_text)
print(f"{len(texts) =}")
docs = [Document(page_content=t) for t in texts]
chat = ChatOpenAI(model_name="gpt-3.5-turbo")
chain = load_qa_chain(
llm=chat,
chain_type="map_reduce",
verbose=True,
)
question = "YouTubeを学習したChatGPTを実装するために、インストールが必要なライブラリを教えて。"
output = chain(
{
"input_documents": docs,
"question": question,
},
return_only_outputs=True,
)["output_text"]
print(output)
print(f"{time.time() - start_time}")
このコードを実行すると、YouTubeの動画から字幕が取得され、5分割されます。
「Map Reduce」では、5分割された各塊に対して指示文が実行されます。
最後に、すべてを統合して指示文が実行され、結果が出力されます。
ちなみに、「Map Reduce」の実行には、合計で「52秒」かかりました。
4. 「Map Rerank」の実装方法
次に、「Map Rerank」の実装方法を見ていきましょう。
「Map Rerank」は、「map_reduce」の「chain_type」を「map_rerank」に変更するだけで実装できます。
実行すると、ChatGPTが出す自信度の強さが出力されます。
ちなみに、実行時間は「10秒」でした。
「Map Rerank」の特徴として、以下の点が挙げられます。
- 環境構築に関する部分は全体の文章の中の一部分に集中しているため、「Map Rerank」の方が精度が高いと考えられます。
- 「Map Reduce」よりも「Map Rerank」の方が、最後の統合する時のChatGPTの実行が不要なため、実行時間が短いと考えられます。
それでは、具体的なコードを見ていきましょう。
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import YoutubeLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.docstore.document import Document
from langchain.chains.question_answering import load_qa_chain
import time
start_time = time.time()
youtube_url = "https://www.youtube.com/watch?v=TQvaocfmvaI"
loader = YoutubeLoader.from_youtube_url(youtube_url, language="ja")
transcript_text = loader.load()[0].page_content
print(f"{transcript_text = }")
print(f"{len(transcript_text) = }")
text_splitter = CharacterTextSplitter(separator=" ", chunk_size=500)
texts = text_splitter.split_text(transcript_text)
print(f"{len(texts) =}")
docs = [Document(page_content=t) for t in texts]
chat = ChatOpenAI(model_name="gpt-3.5-turbo")
chain = load_qa_chain(
llm=chat,
chain_type="map_rerank",
verbose=True,
)
question = "YouTubeを学習したChatGPTを実装するために、インストールが必要なライブラリを教えて。"
output = chain(
{
"input_documents": docs,
"question": question,
},
return_only_outputs=True,
)["output_text"]
print(output)
print(f"{time.time() - start_time}")
以上が、「Map Rerank」の実装方法です。
次の章では、「Refine」の実装方法について説明します。
5. 「Refine」の実装方法
最後に、「Refine」の実装方法を見ていきましょう。
具体的な手順としては、「chain_type」を「refine」に設定します。
「Refine」では、1つ目の塊の結果を2つ目の塊にバトンタッチする形になります。
それでは、具体的なコードを見ていきましょう。
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import YoutubeLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.docstore.document import Document
from langchain.chains.question_answering import load_qa_chain
import time
start_time = time.time()
youtube_url = "https://www.youtube.com/watch?v=TQvaocfmvaI"
loader = YoutubeLoader.from_youtube_url(youtube_url, language="ja")
transcript_text = loader.load()[0].page_content
print(f"{transcript_text = }")
print(f"{len(transcript_text) = }")
text_splitter = CharacterTextSplitter(separator=" ", chunk_size=500)
texts = text_splitter.split_text(transcript_text)
print(f"{len(texts) =}")
docs = [Document(page_content=t) for t in texts]
chat = ChatOpenAI(model_name="gpt-3.5-turbo")
chain = load_qa_chain(
llm=chat,
chain_type="refine",
verbose=True,
)
question = "YouTubeを学習したChatGPTを実装するために、インストールが必要なライブラリを教えて。"
output = chain(
{
"input_documents": docs,
"question": question,
},
return_only_outputs=True,
)["output_text"]
print(output)
print(f"{time.time() - start_time}")
出力結果は、英語で表示されます。
そのため、「次の文章を和訳して。」というプロンプトを実行します。
from langchain.schema import HumanMessage
print(chat([HumanMessage(
content=f"""
次の文章を和訳して。
{output}
""")
]).content)
「Refine」を使うと、英語で出力されることが多いため、最後に和訳のプロンプトを挟むことをおすすめします。
ちなみに、「Map Refine」の実行には、合計で「1分7秒」かかりました。
「Refine」は、順番に1つずつ実行する必要があるため、「Map Reduce」と「Map Rerank」よりも時間がかかります。
以上が、「Refine」の実装方法です。
最後に
最後まで読んでくださり、ありがとうございました!
この記事を通して、少しでもあなたの学びに役立てば幸いです!
宣伝:もしもよかったらご覧ください^^
『AIとコミュニケーションする技術(インプレス出版)』という書籍を出版しました🎉
これからの未来において「変わらない知識」を見極めて、生成AIの業界において、読まれ続ける「バイブル」となる本をまとめ上げました。
かなり自信のある一冊なため、もしもよろしければ、ご一読いただけますと幸いです^^
参考文献
Discussion