ChatGPT に Google検索とSystem Roleを食わせてちゃんと日本語で回答させる

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

前回は一応、ChatGPT(GPT-3.5-turbo)にGoogle の検索結果を食べさせることは成功しました。

しかし、日本語で回答してもらえなかったり、パースエラーが出て最終回答がきちんと出力されなかったりしました。今回は、バージョンアップしたLangchainを使って System RoleやUser Roleを明確に指定し、Google検索を使って回答を検索してもらいます。

参考:https://langchain.readthedocs.io/en/latest/modules/chat/examples/agent.html

Google 検索をしつつ、Roleによってきちんと指示する

必要なライブラリ・モジュールの読み取り

# Agentの読み込み
from langchain.agents import AgentExecutor, ZeroShotAgent, Tool
# Google Search API
from langchain.utilities import GoogleSearchAPIWrapper
# ChatOpenAI GPT 3.5
from langchain.chat_models import ChatOpenAI
from langchain import LLMChain
from langchain.prompts.chat import (
    # 汎用のメッセージテンプレート(将来の拡張に備えているのかも)
    ChatPromptTemplate,
    # System メッセージテンプレート
    SystemMessagePromptTemplate,
    # assistant メッセージテンプレート
    AIMessagePromptTemplate,
    # user メッセージテンプレート
    HumanMessagePromptTemplate,
)
from langchain.schema import (
    # それぞれ GPT-3.5-turbo API の assistant, user, system role に対応
    AIMessage,
    HumanMessage,
    SystemMessage
)

以前挑戦したときは、GPT-3 以前(Davinci)のように、Roleがないメッセージしか投げられませんでしたが、104アップデート辺りでRoleをつけたメッセージを送信できるようになりました。

ありがたや。

GoogleのProgrammable Search EngineのAPI取得や動作テストについては前回の記事を参考にしてください。

ChatGPT に Google の検索結果を使って回答してもらおう

※そういえばいつの間にかTimeoutが出なくなったような…

また、GPT-3.5-turbo を叩くための ChatOpenAI を Agent に入れるために LLMChain が必要です。そのAgentがなんのために必要かというと、Google検索というToolの使用結果を適切にChainに渡すためですね。

ChainとToolの違いはよく分かっておりません……。

# env に読み込ませるAPIキーの類
import key

# 環境変数にAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = key.OPEN_API_KEY
os.environ["GOOGLE_CSE_ID"] = key.GOOGLE_CSE_ID
os.environ["GOOGLE_API_KEY"] = key.GOOGLE_API_KEY

APIキーはOSの環境変数に記録するなり、開発環境に入れるなり、仮想環境に入れるなり、それぞれの適切な方法で管理します。

# GoogleSearchAPIWrapperのツールを作成
search = GoogleSearchAPIWrapper()
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events"
    )
]

# Agent用 prefix, suffix
prefix = """Anser the following questions as best you can, but speaking Japanese. You have access to the following tools:"""
suffix = """Begin! Remember to speak Japanese when giving your final answer. Use lots of "Args"""

# Agent のprompt
prompt = ZeroShotAgent.create_prompt(
    tools,
    prefix=prefix,
    suffix=suffix,
    input_variables=[]
)

Google検索のAPI WrapperをToolにします。前回は、名前からGoogle検索をtoolとして検索しましたが、何か違うのでしょうか。description を任意に設定できる点が優れているのかな? ちょっと分かっておりません。

そして、前回と同様に prefix, suffix を設定して ZeroShotAgentのpromptとして作成します。このprompt を更に、System Role のメッセージとして活用するので、必要があれば input_variablesを利用するといいでしょう(例えば、翻訳言語を選ぶなど)。

指示内容は英語の方が通りがいいのと、tokenの節約(コスト面というよりは、回答に使えるtokenの上限が厄介)のために英語で指示を出しています。ただし、返答は日本語にするように要求をしてみます。

# ChatOpenAI に食わせるmessageのリスト
messages =[
    SystemMessagePromptTemplate(prompt=prompt), # ZeroShotAgentで作ったpromptをSystemに
    HumanMessagePromptTemplate.from_template("{input}\n\nThis was your previous work "
                                             f"(but I haven't seen any of it! I only see what "
                                             "you return as final answer):\n{agent_scratchpad}")
]

# ChatPromptのテンプレート
chat_prompt = ChatPromptTemplate.from_messages(messages)

# Chainの作成
llm_chain = LLMChain(llm=ChatOpenAI(temperature=0), prompt=chat_prompt)

# tool を与えてagent に
tool_names = [tool.name for tool in tools]
agent = ZeroShotAgent(llm_chain=llm_chain, allowed_tools=tool_names)

先ほど作成したpromptと、ユーザーからの入力を受け取るテンプレートを作成します。

ユーザーからの入力については、 agent が使用する agent_scratchpad が必須になっています。また、割と改行の数や位置も重要みたいなので、サンプルのままにしています。

agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True)
agent_executor.run("中小企業診断士の試験科目について教えて")

agentはAgentExecutorで実行します。

実行結果:

> Entering new AgentExecutor chain…
Question: 中小企業診断士の試験科目について教えて
Thought: Hmm, I’m not sure about the specific details of the exam. I should search for more information.
Action: Search
Action Input: “中小企業診断士 試験 科目”

Observation: Dec 27, 2022 … まず、中小企業診断士の一次試験について、試験内容・特徴まで、詳しく見ていきたいと思います。 一次試験の試験科目は全7科目です。 「経 済学・経済政策 … 中小企業診断士の試験科目は、一般的な企業の組織や業務内容と大 変関わりが深い内容となります。第1次試験の科目は、「経済学・経済政策」「財務・会 計」「企業経営 … 令和4年度中小企業診断士第1次試験の結果について(合格発表等) (令和4年9月6日) … 令和4年度第1次試験案内送付にかかる住所変更について(過年度科目合格者 … 中小企業診断士試験制度について、1次試験・2次試験の概要、そして大 きな特長である複雑な合格基準(科目合格制)を中心にわかりやすく説明いたします。 中小企業診断士試験の筆記試験は、1次試験(マークシートによる選択式)は7科目、2次 試験(記述式)は4科目です。1次、2次試験ともに、全科目の平均が60点以上で、 … Sep 11, 2022 … 1次試験の試験科目は7科目あります。 具体的には、経済学・経済政策、財務・会計、企業経営理論、運営管理、経営法務、経営情報システム、 … 中小企業診 断士 第1次試験は全7科目で、マーケティング・財務会計・法律・情報システムなどのビ ジネスパーソンに必要な幅広い知識を学習することができます。 26801円 【】中小企業 診断士試験キーワードで学ぶ商業科目 /日本マンパワー出版/中西安 本 > エンタメ/ホビー – ciudadesincluyentes.org. Feb 20, 2023 … 直近5年間の、中小企業診断士1次試 験の科目別合格率を表にまとめると、以下のようになります。 平均合格率でみると、経 済学・経済政策や経営情報システム … 9735円 中小企業診断士試験対策(クレアール 1次、2次、2022年合格目標セット) 本 参考書 – tat-solutions.com.au.
Thought:中小企業診断士の試験科目は、一次試験で全7科目あります。具体的には、「経 済学・経済政策」「財務・会計」「企業経営理論」「運営管理」「経営法務」「経営情報システム」「マーケティング」の7科目です。
Final Answer: 中小企業診断士の一次試験科目は、全7科目で、「経済学・経済政策」「 財務・会計」「企業経営理論」「運営管理」「経営法務」「経営情報システム」「マーケティング」です。

> Finished chain.

 

実際には2次試験があり、検索結果に含まれているのですが、一次試験の結果しか教えてくれませんでした。この辺りは質問の仕方の問題でしょうか。後は、ChatGPTのWebGUIのように丁寧な解説ではなく簡潔な要約になっていますね。

この辺りは、Promptをいろいろ調整することで解決しそうです。なお、その ChatGPTに全く同じ質問を食べさせた場合は、

丁寧なのですが、明らかに色々と間違った答えが出て来ます。試験科目名と試験科目に含まれる内容がごっちゃになっていますし、試験は年2回というか、1次2次に分かれていて、実施は1回が正しいですね(またその理屈でいうと、2次の筆記と口述があるので回数としては3回となります)。

これと比較すると、Google検索結果を入力に使った方が、正確な答えが得られていることが分かります。つまり、検索結果は正しく重視されて回答が得られていますね。

参考にしたURLも含めた回答をきちんとフォーマットして出力してやれば、自分用としても充分使えそうな性能になっていると思います。

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

最新の記事