Closed4

LangChainのQAGenerationChainでQAボットの評価用データをドキュメントから生成する

kun432kun432

QAGenerationChainを使うと、ドキュメントから質問・回答のペアを作成できる。これを使えばQAボットのテストや評価用データとして活用ができる。

以下Colaboratoryで。

パッケージインストール

!pip install langchain openai

OpenAI APIキーを設定

OPENAI_API_KEY = "xxxxxxxxxxxxxxxxx" #@param{type: "string"}

import os
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

テストデータは以下の演説内容をテキスト化したものを使う。

https://www.kantei.go.jp/jp/101_kishida/statement/2022/1003shoshinhyomei.html

テキストデータはこちら。1文単位に区切ってセパレータは"\n\n"にしている。 これはドキュメントにも上がっているState of Union Addressのフォーマットと合わせている。

https://gist.github.com/kun432/dff61851a88d543dd146052edfbcb27f

Colaboratory上にダウンロードしておく。

!wget https://gist.githubusercontent.com/kun432/dff61851a88d543dd146052edfbcb27f/raw/dacac3ba7fcc17b92b471bd87785ecfdb98d45c1/gistfile1.txt -O sample.txt

ではまずテキストを読み込んでドキュメント化する。

from langchain.document_loaders import TextLoader

loader = TextLoader("sample.txt")
doc = loader.load()[0]

これでまるっとドキュメントが読み込まれるが、例にあるとおりに日本語の場合はAPIのトークンサイズを超えてしまうので、text splitterで分割する。

from langchain.docstore.document import Document
from langchain.text_splitter import CharacterTextSplitter

text_splitter = CharacterTextSplitter(
    separator = "\n\n",
    chunk_size = 500,
    chunk_overlap = 0,
)
docs = text_splitter.split_text(doc.page_content)
len(docs)

今回の場合は18個のドキュメントに分割された。

では、QAGenerationChainを使って、分割されたそれぞれのドキュメントから質問と回答を生成する。

from langchain.chat_models import ChatOpenAI
from langchain.chains import QAGenerationChain

chain = QAGenerationChain.from_llm(ChatOpenAI(temperature = 0))

for text in docs:
    print(chain.run(text))

QAGenerationChainはquestionとanswerのオブジェクトを含む配列として出力されるので、ここでは最初に配列を用意しておいてextendで結合していくようにしてみた。

結果

[{'question': 'What is the main focus of the speech given at the opening of the 210th session of the National Diet?',
  'answer': 'The main focus of the speech is to protect Japan, revitalize the economy, strengthen defense, and maintain peace and stability in Asia and the world.'},
 {'question': 'What was the purpose of the Fukushima International Research and Education Institute?',
  'answer': 'To become a base for industrial creation.'},
 {'question': 'What is the Japanese government doing to address the issue of fraudulent donations and malicious business practices?',
  'answer': 'The Japanese government is setting up a comprehensive consultation desk, strengthening support systems by legal experts, and reviewing laws related to consumer contracts.'},
 {'question': 'What are the three key areas that the author plans to focus on under the new banner of capitalism?',
  'answer': "The three key areas that the author plans to focus on under the new banner of capitalism are: 'responding to high prices and a weak yen', 'structural wage increases', and 'investment and reform for growth'."},
 {'question': "What is the 'structural problem' that prevents significant wage increases in Japan?",
  'answer': 'The problem is that wage increases are not leading to a positive cycle of attracting highly skilled workers, improving productivity, and generating further wage increases.'},
 {'question': 'What are the three challenges that need to be addressed for the positive cycle to continue?',
  'answer': 'The three challenges that need to be addressed for the positive cycle to continue are wage increases, smooth labor mobility, and investment in people.'},
 {'question': 'What is the government doing to support freelancers?',
  'answer': 'The government is working on creating a stable working environment for individuals to work as freelancers and is also working on legal measures to support this.'},
 {'question': 'What is the Japanese government doing to support startup companies?',
  'answer': 'The Japanese government is expanding preferential treatment in public procurement, providing tax incentives and financial support, discovering and nurturing young and talented IT professionals, and connecting startup ecosystems in Japan and overseas.'},
 {'question': "What is the '夏のDigi田(デジでん)甲子園' and what was its purpose?",
  'answer': 'It was a competition to promote initiatives towards realizing the Digital Agrarian City National Plan, and its purpose was to encourage digital utilization for regional revitalization.'},
 {'question': 'What is the focus of the comprehensive economic measures mentioned in the text?',
  'answer': 'The focus is on strengthening the development of cutting-edge technologies such as next-generation semiconductors and Beyond 5G, as well as regulatory reform and attracting investment from the public and private sectors.'},
 {'question': '何が重要なのか?', 'answer': 'ワクチンによる予防が重要である。'},
 {'question': 'What measures will be taken to prepare for the next infectious disease crisis?',
  'answer': 'The government will submit a revised bill for the Infectious Diseases Act to enable flexible and effective emergency response based on the law, and work to strengthen the command tower function and establish a Japanese version of the CDC.'},
 {'question': '何に取り組むことで、包摂社会の実現を目指すのか?',
  'answer': '全世代型社会保障の構築を進め、少子化対策、子育て・こども世代への支援を強化するとともに、女性活躍、孤独・孤立対策など、包摂社会の実現に取り組む。'},
 {'question': "What is the Japanese government's top priority in terms of security?",
  'answer': "To strengthen deterrence and response capabilities in order to firmly defend Japan's territory, territorial waters, and airspace."},
 {'question': 'What areas of technology will Japan focus on developing?',
  'answer': 'Japan will focus on developing important technologies such as space, ocean, and cyber technology.'},
 {'question': "What is Japan's stance on the territorial dispute with Russia?",
  'answer': 'Japan will persist in solving the territorial dispute and signing a peace treaty.'},
 {'question': "What is the 'Hiroshima Action Plan' and how does it relate to the 'Worl Without Nuclear Weapons'?",
  'answer': "The 'Hiroshima Action Plan' is a plan that will be used during the 'Genius Conference' in Hiroshima to work towards a 'World Without Nuclear Weapons'."},
 {'question': '何が最終的に国民の皆様による御判断が必要だと述べられていますか?', 'answer': '憲法改正'}]

これをJSONとかでファイルに出力しておくと良いと思う。

で、英語交じりになってしまっているので、プロンプトテンプレートで対応する。

QAGenerationChainのデフォルトのテンプレートはこれ。

https://github.com/hwchase17/langchain/blob/dfbf45f028bd282057c5d645c0ebb587fa91dda8/langchain/chains/qa_generation/prompt.py

通常のcompletionモデルとchatモデルで、テンプレートが異なる様子。

通常のcompletionモデルのテンプレート

templ = """You are a smart assistant designed to help high school teachers come up with reading comprehension questions.
Given a piece of text, you must come up with a question and answer pair that can be used to test a student's reading comprehension abilities.
When coming up with this question/answer pair, you must respond in the following format:
```
{{
    "question": "$YOUR_QUESTION_HERE",
    "answer": "$THE_ANSWER_HERE"
}}
```

Everything between the ``` must be valid json.

Please come up with a question/answer pair, in the specified JSON format, for the following text:
----------------
{text}"""

chatモデルの場合はプロンプトテンプレートがちょっと複雑なのだけど、ここではSystemとHumanのプロンプトテンプレートが用意されている。

Systemのテンプレート

templ1 = """You are a smart assistant designed to help high school teachers come up with reading comprehension questions.
Given a piece of text, you must come up with a question and answer pair that can be used to test a student's reading comprehension abilities.
When coming up with this question/answer pair, you must respond in the following format:
```
{{
    "question": "$YOUR_QUESTION_HERE",
    "answer": "$THE_ANSWER_HERE"
}}
```

Everything between the ``` must be valid json.
"""

Humanのテンプレート。

templ2 = """Please come up with a question/answer pair, in the specified JSON format, for the following text:
----------------
{text}"""

今回の例ではchatモデルを使っているので2つのプロンプトテンプレートを、全部日本語で書いてものに上書きするか、もしくは「日本語で答えよ」という指示を追加したもので上書きすれば良い。

今回はSystemのプロンプトの最後に追加することにした。なお、Humanのプロンプトは変更しないのだけど、どうやら1つだけ変更する場合でも併せて定義しておく必要がある様子。

from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

templ1 = """You are a smart assistant designed to help high school teachers come up with reading comprehension questions.
Given a piece of text, you must come up with a question and answer pair that can be used to test a student's reading comprehension abilities.
When coming up with this question/answer pair, you must respond in the following format:
```
{{
    "question": "$YOUR_QUESTION_HERE",
    "answer": "$THE_ANSWER_HERE"
}}
```

Everything between the ``` must be valid json.
You must answer in Japanease.
"""

templ2 = """Please come up with a question/answer pair, in the specified JSON format, for the following text:
----------------
{text}"""

prompt = ChatPromptTemplate.from_messages([
        SystemMessagePromptTemplate.from_template(templ1),
        HumanMessagePromptTemplate.from_template(templ2),
])

定義したプロンプトChainに渡す。

chain = QAGenerationChain.from_llm(llm=ChatOpenAI(temperature = 0), prompt=prompt)

実行結果

[{'question': '何に全力をもって当たり、日本経済を再生させると述べられていますか?', 'answer': '足下の物価高への対応'},
 {'question': '福島について、移住してきた若者はどのようなことを語ってくれたのか?',
  'answer': '福島を、「ワクワクするような地域にしていきたい」と語ってくれた。'},
 {'question': '政府は、どのような取り組みを進めているのか?',
  'answer': '総合的な相談窓口を設け、法律の専門家による支援体制を充実・強化するなど、悪質商法や悪質な寄附による被害者の救済に万全を尽くすとともに、消費者契約に関する法令等について、見直しの検討をしている。'},
 {'question': '新しい資本主義の旗印の下で、どのような三つの重点分野に取り組むことになっているのか?',
  'answer': '「物価高・円安への対応」、「構造的な賃上げ」、「成長のための投資と改革」の三つに取り組むことになっている。'},
 {'question': '日本で大きな賃上げが実現しない理由は何ですか?',
  'answer': '高いスキルの人材を惹きつけ、企業の生産性を向上させ、更なる賃上げを生むという好循環が機能していないという、構造的な問題があるためです。'},
 {'question': 'どのような改革が進められるのか?',
  'answer': '賃上げと、労働移動の円滑化、人への投資という三つの課題の一体的改革が進められる。'},
 {'question': 'どのような分野に重点を置いて、官民の投資を加速させるのか?',
  'answer': '科学技術・イノベーション、スタートアップ、GX、DXの四分野に重点を置いて、官民の投資を加速させる。'},
 {'question': '日本政府がスタートアップ企業に対して行う投資には、どのようなものが含まれますか?',
  'answer': '公共調達における優遇制度の抜本拡充、税制上の優遇措置や資金面の支援に加え、若く優れたIT分野の才能の発掘・育成、日本と海外のスタートアップ・エコシステムの接続など、スタートアップ人材への投資が含まれます。'},
 {'question': '何についての問題に正面から取り組むことになったのか?', 'answer': '原子力発電の問題'},
 {'question': '何が今後特に力を入れていく分野で、大きな経済効果、雇用創出が見込まれ、経済安全保障の要でもあるとされているか?',
  'answer': '半導体'},
 {'question': '何が重要なのか?', 'answer': 'ワクチンによる予防が重要です。'},
 {'question': '何に対して基本的な感染対策を行うように呼びかけていますか?',
  'answer': 'マスクは場面に応じた適切な着脱に努めること'},
 {'question': '政府が取り組んでいることについて述べた文章で、何に取り組んでいるか説明してください。',
  'answer': '全世代型社会保障の構築、少子化対策、子育て・こども世代への支援、女性活躍、孤独・孤立対策、送迎バスの安全装置の義務化と支援措置、新型コロナ対策、日本経済再生、対露制裁、対ウクライナ支援などに取り組んでいる。'},
 {'question': '日本政府が最優先の使命としていることは何ですか?',
  'answer': '我が国の領土、領海、領空を断固として守り抜くため、抑止力と対処力を強化すること'},
 {'question': '日本はどのような分野で技術の育成に取り組んでいるのか?',
  'answer': '宇宙、海洋、サイバーなどの重要技術の育成に取り組んでいる。'},
 {'question': '日本政府は、ウクライナ情勢によってどのような方針を堅持しているのでしょうか?',
  'answer': '領土問題を解決し、平和条約を締結する方針を堅持している。'},
 {'question': '日本政府はどのような取り組みを行っているのか?',
  'answer': '日本政府は、核兵器のない世界に向けた現実的な歩みを進めるために、広島で開催予定の「賢人会議」を活用し、「ヒロシマ・アクション・プラン」に沿って取り組みを進め、また、安保理改革を含む国連の機能強化に取り組むことを示している。また、衆議院議員の選挙区について、公職選挙法の改正案を今国会に提出することを明らかにしている。'},
 {'question': '何が最終的に必要であると述べられていますか?',
  'answer': '憲法改正について、国民の皆様による御判断が必要であると述べられています。'}]
kun432kun432

ちなみにドキュメントの例で"state_of_union.txt"を使った場合には、text splitterを使わなくてもよしなに分割してくれてQAペアを生成してくれる。日本語は分割されてもトークンが大きすぎてダメなんだろう、分割は基本的にlenでやってるっぽいし、たぶん。

kun432kun432

まとめ

QAGenerationChainを使えば、QAボットに取り込みたいドキュメントからテスト用の質問・回答ペアを作成できる。これはちょっと積極的に使っていきたい。

いくつか気になったところ。

  • ドキュメントが分割された単位で質問・回答ペアが生成される。
    • text splitter等の分割具合によって生成される質問・回答ペア数が変わってくる。
    • 分割具合によっては内容やコンテキストも影響受けると思う。
    • 複数回実行されるので、ボリュームによってはコストに多少なりとも影響があるかも。
  • 生成された内容が正しいかどうかは人の目で判断するしかなさそう
    • なので、人が作ったデータとかも混ぜた上で、テストを繰り返しつつ、テストデータとして育てていくのが良さそうな気がする。
このスクラップは2023/05/18にクローズされました