LangChain表現言語とLLMを使用した検証実装のチェーン’ (LangChainひょうげんげんごとLLMをしようしたけんしょうじっそうのチェーン)
美容とファッション専門家による、鮮やかで活気に満ちた記事を提供します
導入
人工知能(AI)の分野では、正確性と信頼性を追求する持続的な探求が、ゲームチェンジングな革新をもたらしています。これらの戦略は、生成モデルがさまざまな質問に関連する回答を提供するために、重要な役割を果たしています。さまざまな洗練されたアプリケーションでのGenerative AIの使用に関する最大の障壁の1つは、幻想です。最近Meta AI Researchが発表した「大規模言語モデルにおける幻覚を減らすための検証チェーン」に関する論文で、テキスト生成時の幻想を直接的に減らすための簡単な技術について説明しています。
この記事では、幻視の問題について学び、論文で言及されているCoVeの概念、そしてそれをLLM(Large Language Models)、LangChainフレームワーク、およびLangChain Expression Language(LCEL)を使用して実装する方法について探求します。
学習目標
- LLMでの幻視の問題を理解する。
- 幻視を軽減するためのChain of Verification(CoVe)メカニズムについて学ぶ。
- CoVeの利点と欠点について知る。
- LangChainを使用してCoVeを実装し、LangChain Expression Languageを理解する。
この記事はData Science Blogathonの一環として公開されました。
LLMにおける幻覚の問題とは?
まず、LLMにおける幻覚の問題について学んでみましょう。オートリージェレーティブジェネレーションアプローチを使用すると、LLMモデルは前の文脈が与えられた場合の次の単語を予測します。よくあるテーマの場合、モデルは正しいトークンに対して高い確率を自信を持って割り当てるため、十分な例を見ています。しかし、モデルが珍しいまたは不慣れなトピックについてトレーニングされていないため、高い確信を持って正確でないトークンを生成することがあります。これにより、それ自体は正しそうな情報の幻視が生じます。
- 「LangChainとは何ですか?利用事例と利点」
- リトリーバル・オーグメンテッド・ジェネレーションを使用して、安定した拡散プロンプトを改善しましょう
- 「Amazon ComprehendのためのPDFの事前ラベル付けを自動化する」
下記は、Open AIのChatGPTにおける幻視の例の一つで、私が2020年にインドの著者によって出版された書籍「Economics of Small Things」について尋ねたところ、モデルは完全な自信を持って間違った回答を出し、別のノーベル賞受賞者のAbhijit Banerjeeの著書「Poor Economics」と混同しました。
検証チェーン(CoVe)テクニック
CoVeメカニズムは、LLMに対して自己検証システムを作成するために、プロンプティングと一貫性チェックを組み合わせています。以下は、論文に記載されている主要なステップです。それぞれのステップを詳細に理解していきましょう。
チェーンプロセスの概要
- ベースラインレスポンスの生成:クエリを与えられた場合、LLMを使用してレスポンスを生成します。
- 検証の計画:クエリとベースラインレスポンスの両方を考慮に入れ、元のレスポンスに誤りがあるかどうかを自己分析するのに役立つ検証の質問のリストを生成します。
- 検証の実行:各検証の質問に順番に回答し、元のレスポンスと矛盾や誤りがないかを確認します。
- 最終確認済みレスポンスの生成:発見された矛盾(あれば)に基づいて、検証結果を反映した修正されたレスポンスを生成します。
詳細な例を使ったチェーンプロセスの理解
最初のレスポンスの生成
最初に、特別なプロンプティングなしでクエリをLLMに渡し、初期のレスポンスを生成します。これはCoVeプロセスの出発点となります。このようなベースラインの反応は、幻覚の影響を受けやすい傾向がありますので、CoVeテクニックは後のフェーズでこれらのエラーを発見して修正することを目的としています。
例 – 「メキシコアメリカ戦争の主要な原因は何ですか?」
ボットの回答 – メキシコアメリカ戦争は、1846年から1848年にかけてのアメリカ合衆国とメキシコとの武力衝突でした。これは、1845年のアメリカによるテキサス併合に続いており、1835年のテキサス革命において実質的な分離がありながらも、アメリカの領土の一部と見なされていました。
検証計画
クエリとベースライン回答に基づいて、ベースラインの応答の事実主張を検証するための質問を作成します。これを実施するには、クエリとベースラインの応答の両方に基づいて、一連の検証質問をモデル化することができます。検証の質問は柔軟で、元のテキストと完全に一致する必要はありません。
例 – メキシコ・アメリカ戦争はいつ始まり、いつ終わりましたか?アメリカがテキサスを併合したのはいつですか?テキサスはいつメキシコから分離しましたか?
検証の実行
検証の質問を計画したら、それらの質問に個別に回答することができます。論文では、以下の4つの異なる検証実行方法について説明しています:
1. 合同 – この方法では、検証の質問の計画と実行を1つのプロンプトで行います。質問とその回答は同じLLMプロンプトで提供されます。この方法は一般的には推奨されません、なぜなら検証の応答が幻想的なものになる可能性があるからです。
2. 2ステップ – 計画と実行を2つのステップで別々に行います。最初に検証の質問を生成し、それからそれらの質問に対して回答します。
3. 要素化 – ここでは、各検証の質問は元の大きな回答ではなく、独立して回答されます。これにより、異なる検証の質問間の混乱を避けることができ、より多くの質問に対応することもできます。
4. 要素化 + 改訂 – この方法では、追加のステップが追加されます。各検証の質問に回答した後、CoVeメカニズムは回答が元のベースラインの応答と一致するかどうかをチェックします。これは、別のステップで追加のプロンプトを使用して行われます。
外部ツールまたは自己LLM: 回答を検証し、検証の回答を提供するツールが必要です。これは、LLMそのものまたは外部ツールを使用して実行することができます。より高い正確性が必要な場合、LLMに頼る代わりに、インターネット検索エンジン、参考資料、またはユースケースに応じて任意のウェブサイトなど、外部ツールを使用することができます。
最終確認済み応答
この最終ステップでは、改良された確認済みの応答が生成されます。少数のプロンプトが使用され、ベースラインの応答と検証の質問の回答のすべての前のコンテキストが含まれます。もし「要素+改訂」の方法を使用した場合、交差チェックされた一貫性の出力も提供されます。
CoVeテクニックの制限事項
検証の連鎖はシンプルかつ効果的なテクニックですが、いくつかの制限事項があります:
- 完全な幻想の除去は保証されていない: 応答からの幻想を完全に除去することは保証されておらず、誤解を招く情報が生成される可能性があります。
- 計算負荷が高い: 検証を生成し、実行し、応答を生成することは、計算上の負荷とコストを増加させる可能性があります。そのため、プロセスの遅延や計算コストの増加が発生する可能性があります。
- モデル固有の制限: このCoVeメソッドの成功は、モデルの能力とそのミスを識別し修正する能力に大きく依存します。
CoVeのLangChain実装
アルゴリズムの基本的な概要
ここでは、CoVeの4つのステップごとに4つの異なるプロンプトテンプレートを使用し、前のステップの出力を次のステップの入力として使用します。また、検証の質問の実行には要素化のアプローチを採用しています。インターネット検索ツールエージェントを使用して、検証の質問に対する回答を生成します。
ステップ1: ライブラリのインストールと読み込み
!pip install langchain duckduckgo-search
ステップ2: LLMの作成と初期化
ここでは、LangChainのGoogle Palm LLMを使用します。Google PalmのAPIキーは、このリンクを使用して生成し、Googleアカウントでログインします。
from langchain import PromptTemplatefrom langchain.llms import GooglePalmfrom langchain.schema.output_parser import StrOutputParserfrom langchain.schema.runnable import RunnablePassthrough, RunnableLambdaAPI_KEY='生成されたAPIキー'llm=GooglePalm(google_api_key=API_KEY)llm.temperature=0.4llm.model_name = 'models/text-bison-001'llm.max_output_tokens=2048
ステップ3:初期ベースライン応答を生成する
初期ベースライン応答を生成するために、プロンプトテンプレートを作成し、このテンプレートを使用してベースライン応答LLMチェーンを作成します。
LLMチェーンは、LangChain Expression Languageを使用してチェーンを構成します。ここでは、プロンプトテンプレートとLLMモデル、そして最後に出力パーサーが連結されたプロンプトテンプレートを示します。
BASELINE_PROMPT = """以下の質問に簡潔な事実ベースの回答をしてください。追加の詳細はありません。質問: {query}回答:"""# 初期応答を生成するためのチェーンbaseline_response_prompt_template = PromptTemplate.from_template(BASELINE_PROMPT)baseline_response_chain = baseline_response_prompt_template | llm | StrOutputParser()
ステップ4:検証質問のための質問テンプレートを生成する
次に、検証質問の生成に役立つ検証質問のテンプレートを作成します。
VERIFICATION_QUESTION_TEMPLATE = """以下の質問に基づいて検証質問を作成してください。例:本『ゴッド・オブ・スモール・シングス』の著者は誰ですか?例:検証質問:本『ゴッド・オブ・スモール・シングス』は[著者]によって書かれましたか?もし違うなら、[著者]以外の誰が[ゴッド・オブ・スモール・シングス]を書きましたか?説明:上記の例では、検証質問は回答エンティティ(著者の名前)と質問エンティティ(本の名前)に焦点を当てています。同様に、実際の質問から回答エンティティと質問エンティティに焦点を当て、検証質問を生成してください。実際の質問: {query}最終的な検証質問:"""# 検証のための質問テンプレートを生成するためのチェーンverification_question_template_prompt_template = PromptTemplate.from_template(VERIFICATION_QUESTION_TEMPLATE)verification_question_template_chain = verification_question_template_prompt_template | llm | StrOutputParser()
ステップ5:検証質問の生成
次に、上記で定義された検証質問テンプレートを使用して、検証質問を生成します。
VERIFICATION_QUESTION_PROMPT= """以下の質問、検証質問のテンプレート、およびベースライン応答を基に検証質問を作成してください。例:本『ゴッド・オブ・スモール・シングス』の著者は誰ですか?例:検証質問のテンプレート:本『ゴッド・オブ・スモール・シングス』は[著者]によって書かれましたか?もし違うなら、[著者]以外の誰が[ゴッド・オブ・スモール・シングス]を書きましたか?例:ベースライン応答:Jhumpa Lahiri例:検証質問:1. ゴッド・オブ・スモール・シングスはJhumpa Lahiriによって書かれましたか?もし違うなら、ゴッド・オブ・スモール・シングスは誰が書きましたか?説明:上記の例では、検証質問はテンプレートに基づいて回答エンティティ(著者の名前)と質問エンティティ(本の名前)にのみ焦点を当て、ベースライン応答からエンティティの値を取り換えています。同様に、実際の質問から回答エンティティと質問エンティティに焦点を当て、ベースライン応答からエンティティの値を取り換えて検証質問を生成してください。実際の質問: {query}ベースライン応答: {base_response}検証質問テンプレート: {verification_question_template}最終的な検証質問:"""# 検証質問を生成するためのチェーンverification_question_generation_prompt_template = PromptTemplate.from_template(VERIFICATION_QUESTION_PROMPT)verification_question_generation_chain = verification_question_generation_prompt_template | llm | StrOutputParser()
ステップ6:検証質問の実行
ここでは、外部の検索ツールエージェントを使用して検証質問を実行します。このエージェントは、LangChainのエージェントおよびツールモジュール、およびDuckDuckGo検索モジュールを使用して構築されています。
注意:検索エージェントには時間制限があり、複数のリクエストはリクエスト間の時間制限によりエラーが発生する可能性があるため、注意して使用してください。
from langchain.agents import ConversationalChatAgent, AgentExecutorfrom langchain.tools import DuckDuckGoSearchResults# 検索エージェントを作成search = DuckDuckGoSearchResults()tools = [search]custom_system_message = "アシスタントは知識を持っていないものとし、ユーザーのクエリに回答するためにインターネット検索に依存します。"max_agent_iterations = 5max_execution_time = 10chat_agent = ConversationalChatAgent.from_llm_and_tools( llm=llm, tools=tools, system_message=custom_system_message)search_executor = AgentExecutor.from_agent_and_tools( agent=chat_agent, tools=tools, return_intermediate_steps=True, handle_parsing_errors=True, max_iterations=max_agent_iterations, max_execution_time = max_execution_time)# 検証質問を実行するためのチェーンverification_chain = RunnablePassthrough.assign( split_questions=lambda x: x['verification_questions'].split("\n"), # 各検証質問は1つずつ渡されます。要素ごとのアプローチ) | RunnablePassthrough.assign( answers = (lambda x: [{"input": q,"chat_history": []} for q in x['split_questions']])| search_executor.map() # 各質問に対して個別に検索を実行) | (lambda x: "\n".join(["質問: {} 回答: {}\n".format(question, answer['output']) for question, answer in zip(x['split_questions'], x['answers'])]))# 最終的な緻密な応答を作成
ステップ7:最終的な洗練された応答の生成
ここでは、プロンプトテンプレートとllmチェーンを定義して、最終的な洗練された回答を生成します。
FINAL_ANSWER_PROMPT= """以下の「オリジナルクエリ」と「ベースライン回答」が与えられた状態で、「検証の質問と回答」を分析し、最終的な洗練された回答を提供してください。オリジナルクエリ:{query}ベースライン回答:{base_response}検証の質問と回答ペア:{verification_answers}最終的な洗練された回答:"""# 最終的な回答を生成するためのチェーンfinal_answer_prompt_template = PromptTemplate.from_template(FINAL_ANSWER_PROMPT)final_answer_chain = final_answer_prompt_template | llm | StrOutputParser()
ステップ8:すべてのチェーンをまとめる
前に定義したすべてのチェーンを1度に連続して実行するため、これらをまとめます。
chain = RunnablePassthrough.assign( base_response=baseline_response_chain) | RunnablePassthrough.assign( verification_question_template=verification_question_template_chain) | RunnablePassthrough.assign( verification_questions=verification_question_generation_chain) | RunnablePassthrough.assign( verification_answers=verification_chain) | RunnablePassthrough.assign( final_answer=final_answer_chain)response = chain.invoke({"query": "「小さなものの経済学」という書籍を誰が書いたのか?」"})print(response)
#responseの出力{'query': "「小さなものの経済学」という書籍を誰が書いたのか?", 'base_response': 'Sanjay Jain', 'verification_question_template': '書籍「[小さなものの経済学]」は[作家]によって書かれましたか?もし違う場合、誰が[小さなものの経済学]を書いたのですか?', 'verification_questions': '1. [小さなものの経済学]はSanjay Jainによって書かれましたか?もし違う場合、誰が[小さなものの経済学]を書いたのですか?', 'verification_answers': '質問:1. [小さなものの経済学]はSanjay Jainによって書かれましたか?もし違う場合、誰が[小さなものの経済学]を書いたのですか? 答え:[小さなものの経済学]はSudipta Sarangiによって書かれました \n', 'final_answer': 'Sudipta Sarangi'}
出力画像:
結論
本研究で提案されたChain-of-Verification(CoVe)技術は、大きな言語モデルを構築し、その返答についてより批判的に考え、必要に応じて修正することを目指す戦略です。この方法は、検証をより小さな、より管理しやすいクエリに分割するため、モデルが以前の回答を再確認することを禁止することで、エラーや「幻覚」の繰り返しを回避するのに役立つことが示されています。単にモデルに回答の再確認を求めるだけでも結果が大幅に向上します。CoVeに外部ソースから情報を取得するなどの機能を付加することで、その効果を高める方法も考えられます。
キーポイント
- Chainプロセスは、応答のさまざまな部分を検証するためのさまざまな技術の組み合わせを可能にする有用なツールです。
- 多くの利点に加えて、Chainプロセスの特定の制限がありますが、異なるツールとメカニズムを使用することで緩和することができます。
- LangChainパッケージを利用してこのCoVeプロセスを実装することができます。
よくある質問
この記事に表示されるメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量で使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles