見出し画像

LangChainでChatGPTの回答にGoogle検索結果を反映する方法

 2022年11月30日にテスト版が公開されたChatGPTは、ユーザーの様々な質問に流暢に答える会話能力のほかにも、様々な種類の文章やプログラムをリアルタイムで生成することができ、その性能の高さが話題となりました。
 しかし、ChatGPTには、フォローしている情報が2021年までという制限があるため、最近のニュースや話題には対応できません
 この問題を解決するために、PythonライブラリのLangChainを利用して、ChatGPT(クローン)でGoogleの検索結果を使えるようにしてみました。
※(2022年12月31日追記)Googleカスタム検索版ChatGPTクローンのコードを追加しました。


1.ChatGPTの課題

 ChatGPTは、様々な質問に対して、ユーザーが望む形で回答を返してくれる非常に便利な対話用AIですが、大きな課題が二つあります。

  1. 事実と見分けがつかないデタラメな回答を返してくることがあり、正確さが保証できない

  2. フォローしている情報が2021年までに制限されているため、最近のニュースや話題に対応できない

 後者に関するChatGPTの回答例は以下のとおりです。

筆者:2022年FIFAワールドカップの優勝国と活躍した選手について教えてください。
AI:ご迷惑をおかけして申し訳ありませんが、私は2022年のFIFAワールドカップについての情報をお持ちしておりません。私は2021年時点までの情報しかお持ちではありませんので、最新の情報をお探すことはできません。ご了承ください。
筆者:2022年の10大AIニュースを教えてください。
AI:ご迷惑をおかけして申し訳ありませんが、私は2022年のAIに関するニュースをお持ちしておりません。私は2021年時点までの情報しかお持ちではありませんので、最新のAIに関するニュースをお探すことはできません。ご了承ください。

 Google検索は最近の情報までフォローしていますので、Google検索の結果をChatGPTの回答に反映することができれば、最近のニュースや話題にも対応できるはずです。
 また、検索の上位にランク付けされるWebサイトに記載されている内容は、ある程度信頼できると考えるならば、正確さが保証できないという最初の課題についても改善が期待できます。


2.LangChainの概要

 LangChainは、大規模言語モデル(LLM)とデータソースや言語処理系などの外部リソースを組み合わせたアプリケーションの開発を支援することを目的として、Harrison Chaseさんが作成したPythonライブラリです。

 LangChainは、Google検索、データベース、Python REPLなどの外部リソースやLLMを決められた順序で組み合わせるChain、どの要素をどんな順序で使用するかを入力に応じて決定するAgent、これまでの状態を記憶しておくMemoryなどの機能を提供しています。
 詳細については、以下のサイトや公式ドキュメントを参考にしてください。


3.Google検索を利用できるChatGPTクローンのコード

(1) OpenAIとSerpApiのAPIキーの入手

 残念ながら、ChatGPTはAPIを公開していないため、ChatGPTのベースになったLLMのGPT-3のAPIを利用します。特に指定しなければ、その中でChatGPTの基になった言語モデルのtext-davinci-003のAPIを使うことになります。
 予め、OpenAIにサインアップしてAPIキーを入手しておいてください。APIキーは、ログインしたOpenAIのページの右上の「Personal」→「View API keys」から入手することができます。
 また、Google検索結果をスクレイピングして利用するため、SerpApiにサインアップして、APIキーを入手しておいてください。
 なお、OpenAIもSerpApiも最初は無料枠がありますが、原則有料ですので、使い過ぎに気を付けましょう。ちなみに、OpenAIは、最初の3か月間18ドル分の無料枠があり、その後は使用量に応じて課金されます。また、SerpApiは、月100回の検索までは無料ですが、それ以上は、月50ドルからの有料プランに加入する必要があります。

(2) ChatGPTクローンのコード

 npakaさんのnote清水亮さんのWirelessWire Newsの記事を参考にして用意したのが以下のコードです。
 このコードをColabノートにコピーし、"OpenAIのAPIキー"と"SerpApiのAPIキー"に自分のキーを入力して、セルを実行してください。

!pip install langchain
!pip install openai
!pip install google-search-results

import os
os.environ["OPENAI_API_KEY"] = "OpenAIのAPIキー"
os.environ["SERPAPI_API_KEY"] = "SerpApiのAPIキー"

from langchain import OpenAI, ConversationChain
from langchain.chains.conversation.memory import ConversationSummaryMemory
from langchain.agents import initialize_agent
from langchain.agents import load_tools
from langchain.agents import ZeroShotAgent, Tool, AgentExecutor
from langchain.chains.conversation.memory import ConversationBufferMemory
from langchain import OpenAI, SerpAPIWrapper, LLMChain

llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
conversation = ConversationChain(llm=llm,memory=ConversationSummaryMemory(llm=OpenAI()),verbose=True)
agent = initialize_agent(tools,llm,agent="zero-shot-react-description",verbose=True)
search = SerpAPIWrapper()
tools = [Tool(name = "Search",func=search.run,description="useful for when you need to answer questions about current events")]
prefix = """Have a conversation with a human, answering the following questions as best you can. You have access to the following tools:"""
suffix = """Begin!"
{chat_history}
Question: {input}
{agent_scratchpad}"""
prompt = ZeroShotAgent.create_prompt(tools,prefix=prefix,suffix=suffix,input_variables=["input", "chat_history", "agent_scratchpad"])
memory = ConversationBufferMemory(memory_key="chat_history")
llm_chain = LLMChain(llm=OpenAI(temperature=0), prompt=prompt)
agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools, verbose=True)
agent_chain = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True, memory=memory)

 セルの実行が終了したら、次に以下のコードで「input=」以降に質問を入力して、セルを実行します。

s = agent_chain.run(input="2022年FIFAワールドカップの優勝国と活躍した選手について日本語で教えてください。")
print("[%s]"%s)

 ChatGPTクローンの回答は以下の通りとなります。

> Entering new AgentExecutor chain...
Thought: I need to find information about the 2022 FIFA World Cup in Japanese.
Action: Search
Action Input: 2022FIFAワールドカップ 優勝国 日本語
Observation: アルゼンチンが36年ぶり3回目の優勝を果たした。なお、次回大会から出場枠が48チームに拡大するため、32チーム制の大会としては今回が最後となった。
Thought: I need to find information about the individual players who achieved awards.
Action: Search
Action Input: 2022FIFAワールドカップ 活躍した選手 日本語
Observation: 前半40分過ぎ、日本は前田大然(セルティック)のゴールで先制したものの、後半に追いつかれ、30分間の延長でも勝敗決せず。PK戦でクロアチアに敗れた。
Thought: I now know the final answer.
Final Answer: アルゼンチンが36年ぶり3回目の優勝を果たし、Mbappe KyllianGiroud OllivierMartinez EmilianoMessi Lionelが個人的な活躍をした。
> Finished AgentExecutor chain.
[アルゼンチンが36年ぶり3回目の優勝を果たし、Mbappe KyllianGiroud OllivierMartinez EmilianoMessi Lionelが個人的な活躍をした。]

 次に、2022年10大AIニュースについて質問してみます。

s = agent_chain.run(input="2022年の10大AIニュースを日本語で教えてください。")
print("[%s]"%s)

 ChatGPTクローンの回答は以下の通りです。

> Entering new AgentExecutor chain...
Thought: I need to find out what the 10 biggest AI news stories of 2022 are.
Action: Search
Action Input: "2022 AI news stories"
Observation: AI news in 2022 has been rapid-fire and relentless; the moment you knew where things currently stood in AI, a new paper or discovery would make ...
Thought: I now know the 10 biggest AI news stories of 2022.
Final Answer: 2022年の10大AIニュースとして、生成AIの進歩、自動運転車、医療応用、言語翻訳、画像認識、自然言語処理、金融サービス、検索エンジン、音声認識、ロボットなどがあります。
> Finished AgentExecutor chain.
[2022年の10大AIニュースとして、生成AIの進歩、自動運転車、医療応用、言語翻訳、画像認識、自然言語処理、金融サービス、検索エンジン、音声認識、ロボットなどがあります。]

 「input=」以降の質問を書き換えれば、色々な質問をすることができます。

(3) Googleカスタム検索版ChatGPTクローンのコード

 検索にかかるコストを下げるため、検索用のAPIをSerpApiからGoogleカスタム検索に変更したコードを用意しました。
 最初に、Googleカスタム検索の検索エンジンIDとAPIキーを入手する必要があります。これらの入手方法については、以下のnpakaさんのサイトを参考にしてください。

 変更後のコードは以下の通りです。
 このコードをColabノートにコピーし、"OpenAIのAPIキー""Googleカスタム検索の検索エンジンID""Googleカスタム検索のAPIキー"に自分のキー及びIDを入力して、セルを実行してください。

!pip install langchain
!pip install openai
!pip install google-search-results

import os
os.environ["OPENAI_API_KEY"] = "OpenAIのAPIキー"
os.environ["GOOGLE_CSE_ID"] = "Googleカスタム検索の検索エンジンID"
os.environ["GOOGLE_API_KEY"] = "Googleカスタム検索のAPIキー"

from langchain import OpenAI, ConversationChain
from langchain.chains.conversation.memory import ConversationSummaryMemory
from langchain.agents import initialize_agent
from langchain.agents import load_tools
from langchain.agents import ZeroShotAgent, Tool, AgentExecutor
from langchain.chains.conversation.memory import ConversationBufferMemory
from langchain import OpenAI, GoogleSearchAPIWrapper, LLMChain

llm = OpenAI(temperature=0)
tools = load_tools(["google-search", "llm-math"], llm=llm)
conversation = ConversationChain(llm=llm,memory=ConversationSummaryMemory(llm=OpenAI()),verbose=True)
agent = initialize_agent(tools,llm,agent="zero-shot-react-description",verbose=True)
search = GoogleSearchAPIWrapper()
tools = [Tool(name = "Search",func=search.run,description="useful for when you need to answer questions about current events")]
prefix = """Have a conversation with a human, answering the following questions as best you can. You have access to the following tools:"""
suffix = """Begin!"
{chat_history}
Question: {input}
{agent_scratchpad}"""
prompt = ZeroShotAgent.create_prompt(tools,prefix=prefix,suffix=suffix,input_variables=["input", "chat_history", "agent_scratchpad"])
memory = ConversationBufferMemory(memory_key="chat_history")
llm_chain = LLMChain(llm=OpenAI(temperature=0), prompt=prompt)
agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools, verbose=True)
agent_chain = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True, memory=memory)

 セルの実行が終了したら、次に以下のコードで「input=」以降に質問を入力して、セルを実行します。

s = agent_chain.run(input="2022年FIFAワールドカップの優勝国と活躍した選手について日本語で教えてください。")
print("[%s]"%s)

 ChatGPTクローンの回答は以下の通りとなりました。
 2022年のワールドカップ優勝国はアルゼンチンなので、間違っています。

> Entering new AgentExecutor chain...
Thought: I need to find out who won the 2022 FIFA World Cup and which players stood out.
Action: Search
Action Input: 2022 FIFA World Cup winners and standout players
Observation: Dec 15, 2022 ... Who will win the FIFA Young Player Award at the World Cup 2022 in Qatar 2022? Vinicius Jr, Tchouameni, Jude Bellingham, Bukayo Saka, Gavi, ... Nov 19, 2022 ... Mbappé is known for his speed, technical ability, finishing and is No. 1 in Stu Holden's Top 50 Players in the 2022 FIFA World Cup. More World ... Nov 16, 2022 ... The game of football has changed a lot throughout the years: the way it's played, who plays it, how we watch games being played. Slowly but ... FIFA 2022 World Cup History ... Played every four years, the World Cup hosts the top 32 national teams in a monthlong ... CHAMPION, RUNNER UP, THIRD PLACE ... Dec 4, 2022 ... Soccer Football - FIFA World Cup Qatar 2022 - Technical Study Group Press Conference - Main Media Center, Doha, Qatar - November 19, 2022 ... France were crowned champions for the second time in history and for the first since they were hosts in 1998 after defeating Croatia 4-2 in what will go down as ... The 2022 FIFA World Cup was an international football tournament contested by the men's national teams of FIFA's member associations and 22nd edition of the ... ... World Cup. Kylian Mbappe finished as the top scorer at Qatar 2022. Lionel Messi came one goal back in second. Watch videos on former Golden Boot winners ... Dec 18, 2022 ... Messi won the award for the best player at the tournament, jogging back out to bask in the glory in front of a stadium crammed with ecstatic ... Dec 18, 2022 ... Argentina's Enzo Fernandez is handed the trophy for the Best Young Player at the 2022 FIFA World Cup™️ in Qatar.
Thought: I now know the final answer.
Final Answer: 2022年FIFAワールドカップの優勝国はフランスで、最優秀選手賞はレオネル・メッシ、最優秀若手選手賞はエンゾ・フェルナンデスが受賞しました。
> Finished AgentExecutor chain.
[2022年FIFAワールドカップの優勝国はフランスで、最優秀選手賞はレオネル・メッシ、最優秀若手選手賞はエンゾ・フェルナンデスが受賞しました。]

 次に、2022年の10大AIニュースについて質問してみます。

s = agent_chain.run(input="2022年の10大AIニュースを日本語で教えてください。")
print("[%s]"%s)

 ChatGPTクローンの回答は以下の通りとなりました。
 やはり、AIニュースとしてふさわしくないものがいくつか入っており、正確ではありません。

> Entering new AgentExecutor chain...
Thought: I need to find out what the 10 biggest AI news stories of 2022 are.
Action: Search
Action Input: "2022 AI news"
Observation: Latest News · State of AI 2022: Adoption plateaus but leaders increase gap · Adobe to begin selling AI-generated stock images · M2 Macs now generate Stable ... Nov. 23, 2022A new technique enables artificial intelligence agents to think much farther into the future when considering how their behaviors can influence ... Dec 21, 2022 ... The metaverse dominated early 2022, with vendors such as Nvidia describing what they believe the next iteration of the internet will look like. Mar 16, 2022 ... The 2022 AI Index: AI's Ethical Growing Pains ... As AI systems develop more impressive capability, they also produce more harm, and with great ... News releases published in 2022. KPMG and Vectra AI join forces to reduce cyber risk for hybrid cloud enterprises. December 13, 2022. KPMG ... May 20, 2022 ... MIT researchers find artificial intelligence can pick out racial ... May 20, 2022 ... When an AI used cost as a proxy for health needs, ... Dec 6, 2022 ... First, AI adoption has more than doubled. · Meanwhile, the average number of AI capabilities that organizations use, such as natural-language ... Rapamycin in the context of Pascal's wager: Collaborating with ChatGPT to write a research perspective piece. Dec 27, 2022 ... Nov 18, 2022 ... Nov 18, 2022. Here's the latest news in artificial intelligence, from data privacy ... Head of Artificial Intelligence and Machine Learning; ... Oct 4, 2022 ... Dr. Alondra Nelson, Deputy Assistant to the President and OSTP Deputy Director for Science and Society. Dr. Sorelle Friedler, Assistant ...
Thought: I now know the final answer
Final Answer: モービルアイの上場申請発表、アマゾンの宅配ロボット実証中止、LiDAR企業の破産申請、情報セキュリティ10大脅威 2022、自動運転ラボ10大ニュース、農業技術10大ニュース、あいスタ、知事が選ぶ「2022年愛知県政10大ニュース」、JART情報誌 NetworkNow 12月号 Headline 2022JART 10大ニュース、令和4(2022)年度 死亡時画像診断(Ai)研修会、2022/03/10: 感覚AI
> Finished AgentExecutor chain.
[モービルアイの上場申請発表、アマゾンの宅配ロボット実証中止、LiDAR企業の破産申請、情報セキュリティ10大脅威 2022、自動運転ラボ10大ニュース、農業技術10大ニュース、あいスタ、知事が選ぶ「2022年愛知県政10大ニュース」、JART情報誌 NetworkNow 12月号 Headline 2022JART 10大ニュース、令和4(2022)年度 死亡時画像診断(Ai)研修会、2022/03/10: 感覚AI]

 なぜかSerpApiのときよりも回答の精度が落ちています。偶然かもしれませんが、回答の精度を下げたくないのなら、変更しない方がよいかもしれません。


4.まとめ

 このように、ChatGPTの回答にGoogle検索結果を反映することができれば、ChatGPTの利便性がかなり高まります。
 Googleの一極支配への挑戦を目標に掲げている検索エンジンのYou.comも、今月23日に、より時事的な質問に対応できる新しいチャットボットのYouChatを発表しました。
 OpenAIが現在、検索結果を反映できるチャットボットの開発を進めているという話もあります。
 こうして、対話型AIの性能が高まっていけば、将来的には、一人一人が自分専用のAIアシスタントを持つことになるでしょう。


この記事が気に入ったらサポートをしてみませんか?