Zenn
Galirage Inc.
💫

文字数制限のない要約チャットボットの実装方法【Python / LangChain / ChatGPT】

2023/07/28に公開

はじめまして、ますみです!

株式会社Galirage(ガリレージ)という「生成AIに特化して、システム開発・アドバイザリー支援・研修支援をしているIT企業」で、代表をしております^^

自己紹介.png

この記事では、「LangChain」というライブラリを使って、「文字数制限のない要約チャットボットの作り方」を解説します。

ChatGPTやLangChainやについてまだ詳しくない方は、こちらを先にご覧ください◎

https://zenn.dev/umi_mori/books/chatbot-chatgpt
https://zenn.dev/umi_mori/books/prompt-engineer

具体的には、「Map Reduce」「Map Rerank」「Refine」の3つのアルゴリズムの実装方法を説明します。
これらの概念がまだ知らない方は、先に下記の記事をご覧ください。
https://zenn.dev/umi_mori/articles/langchain-chains-long-text-algorithm

1. ゴールとシステム設計

今回の目標は、YouTubeの長文字幕に対して要約ができるチャットボットを作ることです。
そのためのシステム設計について説明します。

  1. YouTubeから字幕情報を取得します。
  2. 取得した字幕情報に対して、「Map Reduce」「Map Rerank」「Refine」の3つのアルゴリズムを適用します。
  3. これらのアルゴリズムを用いて、要約を生成します。

具体的な実装方法としては、Pythonというプログラミング言語を使います。
その中でも、LangChainというライブラリを活用します。

この時、LangChainの中にある「Chains」という機能を使います。
Chainsは、複数のプロンプト入力を実行する機能です。

以上が、今回のゴールとシステム設計の概要です。
次の章では、具体的な実装方法について詳しく説明します。

2. 環境構築

今回必要な環境構築は、次の5つです。

  • LangChainのインストールpip install langchainでインストールします。
  • OpenAIのインストールpip install openaiでインストールします。
  • YouTube字幕取得ライブラリのインストールyoutube-transcript-apiでインストールします。
  • トークン数の計算ライブラリのインストールpip install tiktokenでインストールします。
  • APIキーの設定:OpenAIを使うためには、APIキーが必要です。自分で発行したAPIキーを、指定の場所に設定します。

APIキーの発行方法がわからない方は、下記の記事を参考にしてください。
https://zenn.dev/umi_mori/books/chatbot-chatgpt/viewer/how_to_use_openai_api

具体的なインストール方法は次の通りです。

shell
pip install langchain==0.0.218
pip install openai==0.27.8
pip install youtube-transcript-api==0.6.1
pip install tiktoken==0.4.0

また、APIキーを設定する方法は、次のとおりです。

python
import os

#TODO: APIキーの登録が必要
os.environ["OPENAI_API_KEY"] = "..."

これで、Pythonでプログラムを作る準備が整いました。

3. 「Map Reduce」の実装方法

この章では、「Map Reduce」の実装方法を解説します。

具体的な流れは次の通りです。

  1. 「YoutubeLoader」でYouTubeの動画を読み込みます。
  2. 「CharacterTextSplitter」でテキストを分割します。
  3. 分割したテキストは、ドキュメントのリストとして格納します。
  4. 「load_summarize_chain」モジュールを使い、「map_reduce」を行います。
  5. 生成されたChainを実行します。

実際に、以下のYouTubeの動画に対して、要約をしていきます。
https://www.youtube.com/watch?v=TQvaocfmvaI

具体的なコードは以下のとおりです。

python
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.summarize import load_summarize_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_summarize_chain(
    llm=chat,
    chain_type="map_reduce",
    verbose=True,
)

output = chain(
    inputs=docs,
    return_only_outputs=True,
)["output_text"]

print(output)

print(f"{time.time() - start_time}")

実行すると、字幕情報が5分割され、それぞれに対して要約文が生成されます。
最後に、それらをまとめて要約します。

python
from langchain.schema import HumanMessage

print(chat([HumanMessage(
    content=f"""
    次の文章を和訳して。
    {output}
""")
]).content)

以上が、「Map Reduce」の実装方法です。
この方法を使えば、特定のYouTubeビデオから学習するチャットボットを作成できます。

4. 「Map Rerank」の実装方法

次に、「Map Rerank」の実装方法を解説します。
ただし、現在のところ、この機能はまだ実装されていません。
そのため、実際にはエラーが発生します。

実装方法としては、「chain_type」を「map_rerank」に指定することで、実装できます。

python
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.summarize import load_summarize_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_summarize_chain(
    llm=chat,
    chain_type="map_rerank",
    verbose=True,
)

output = chain(
    inputs=docs,
    return_only_outputs=True,
)["output_text"]

print(output)

print(f"{time.time() - start_time}")

5. 「Refine」の実装方法

最後に、「Refine」の実装方法を学びます。
これは、要約の精度を高いことが見込める手法です。

「chain_type」を「refine」に指定することで実行できます。

python
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.summarize import load_summarize_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_summarize_chain(
    llm=chat,
    chain_type="map_refine",
    verbose=True,
)

output = chain(
    inputs=docs,
    return_only_outputs=True,
)["output_text"]

print(output)

print(f"{time.time() - start_time}")

ちなみに、「Refine」の実行時間は約65秒で、「Map Reduce」は39秒でした。
「Map Reduce」は並列処理が可能ですが、「Refine」は順番に実行する必要があるため、時間が多くかかります。

最後に

最後まで読んでくださり、ありがとうございました!
この記事を通して、少しでもあなたの学びに役立てば幸いです!

宣伝:もしもよかったらご覧ください^^

AIとコミュニケーションする技術(インプレス出版)』という書籍を出版しました🎉

これからの未来において「変わらない知識」を見極めて、生成AIの業界において、読まれ続ける「バイブル」となる本をまとめ上げました。

かなり自信のある一冊なため、もしもよろしければ、ご一読いただけますと幸いです^^

参考文献

https://github.com/hwchase17/langchain

https://colab.research.google.com/drive/1B0p4ibzKx1jcXhXMwgLd4V9vdf9FHvl4?usp=drive_link

https://youtu.be/HZRSFoTCclk

https://zenn.dev/umi_mori/books/chatbot-chatgpt

https://zenn.dev/umi_mori/books/prompt-engineer

https://www.youtube.com/playlist?list=PLakzeSUr4kaL32nyYvr067UgGMjCeRFjP

https://www.youtube.com/playlist?list=PLakzeSUr4kaItFFLVi5DnqFu5gmvZSkcN

https://www.youtube.com/playlist?list=PLakzeSUr4kaIiamwsc0NUo8dV4xAIIq93

Galirage Inc.
Galirage Inc.

Discussion

ログインするとコメントできます