概要Microsoftが提供するBing AI Chatが有名ですが、ChatGPTにWeb検索を掛け合わせることで最新の情報を加味した回答をしたり、より正確(引用のある)な回答を導くことができます。デモデモはこちら通常のChatGPTでは回答ができないような「現在の総理大臣は?」という質問に正確に回答ができています。実装方法上記デモは58行で書かれています(ソースコード)from langchain.agents import ConversationalChatAgent, AgentExecutorfrom langchain.callbacks import StreamlitCallbackHandlerfrom langchain.chat_models import ChatOpenAIfrom langchain.memory import ConversationBufferMemoryfrom langchain.memory.chat_message_histories import StreamlitChatMessageHistoryfrom langchain.tools import DuckDuckGoSearchRunimport streamlit as stimport openaiopenai.api_base = "https://oai.langcore.org/v1"st.set_page_config(page_title="LangCore: Chat with search", page_icon="🔍")st.title("LangCore: Chat with search")openai_api_key = st.secrets["OPENAI_API_KEY"]msgs = StreamlitChatMessageHistory()memory = ConversationBufferMemory( chat_memory=msgs, return_messages=True, memory_key="chat_history", output_key="output")if len(msgs.messages) == 0 or st.sidebar.button("Reset chat history"): msgs.clear() msgs.add_ai_message("どのようなことをお探しですか?") st.session_state.steps = {}avatars = {"human": "user", "ai": "assistant"}for idx, msg in enumerate(msgs.messages): with st.chat_message(avatars[msg.type]): # Render intermediate steps if any were saved for step in st.session_state.steps.get(str(idx), []): if step[0].tool == "_Exception": continue with st.status(f"**{step[0].tool}**: {step[0].tool_input}", state="complete"): st.write(step[0].log) st.write(step[1]) st.write(msg.content)if prompt := st.chat_input(placeholder="東京の現在の天気は?"): st.chat_message("user").write(prompt) llm = ChatOpenAI( model_name="gpt-3.5-turbo", openai_api_key=openai_api_key, streaming=True) # type: ignore tools = [DuckDuckGoSearchRun(name="Search")] chat_agent = ConversationalChatAgent.from_llm_and_tools(llm=llm, tools=tools) executor = AgentExecutor.from_agent_and_tools( agent=chat_agent, tools=tools, memory=memory, return_intermediate_steps=True, handle_parsing_errors=True, ) with st.chat_message("assistant"): st_cb = StreamlitCallbackHandler(st.container(), expand_new_thoughts=False) response = executor(prompt, callbacks=[st_cb]) st.write(response["output"]) st.session_state.steps[str(len(msgs.messages) - 1)] = response["intermediate_steps"]LangChainのAgentを使っており、Agentが利用するツールにDuckDuckGoの検索ツールを追加しています。これにより、Agentが必要なときに検索を行うことができます。検索ツールは、Bing SearchやGoogle SearchなどのAPIも利用可能ですが、APIを使うためにクラウドへの登録や利用料がかかるので、それらが不要なDuckDuckGoを今回は利用しています。問題点(速度、正確性、コスト)検索ができるChatGPTは一時期非常に盛り上がりましたし、さまざまな会社でChatGPT活用をする際に必ず上がってくる論点でもあります。一方で、実際に使ってみると以下のような疑問が湧きます。日本の総理大臣について知りたいのであれば、Google検索をすれば0.1sのレスポンスで正しい結果が返ってきますし、引用URLも分かります。あえてChatGPTに検索結果を咀嚼させることで、レスポンス速度が下がるだけではなく、ChatGPTによる解釈ミスを引き起こして不正確な情報を得ることがあります(失敗例↓)また、コストの面でも不利です。Bing Search APIの利用料は最も安くて1トランザクションあたり0.36円かかります(引用)。ChatGPT APIのコストを0.1円としたとき、単純に4倍程度にコストが上がってしまいます。有用な利用方法速度・正確性・コストの問題を抱えてでも利便性が上回るユースケースを見つける必要があります。少なくとも「最新のデータを踏まえた回答をするChat bot」や「引用のある回答をするChat bot」だと上記のデメリットを超えてGoogle検索を上回る利便性があるのか疑問です。一つはエージェントによる明確な作業の自動化が一つのケースになると思います。検索を伴うような定型作業を自動化させるという目的であれば、大幅に業務効率化が期待できます。単なるChat botではなく、人間が介在せずに裏で働き続けるエージェントを作ることができれば利便性がありそうです。まとめいかがだったでしょうか?Web検索ができるChatGPTは、使い方を見極めないと、「遅くて高くて正確性の低い検索ツール」になってしまう可能性があります。このような使い方ができたら社内業務を大幅に効率化できそう!というアイディアをお持ちの方はぜひお話を聞かせてください!