WirelessWire News Technology to implement the future

by Category

手軽に作れるChatGPTクローンと本家ChatGPTを対決させてみた

2022.12.27

Updated by Ryo Shimizu on December 27, 2022, 18:50 pm JST

LangChainというフレームワークを使うと、サンプルコードになんとChatGPTクローンというものがある。
LangChainは、まさにChatGPTのような、既存の大規模言語モデル(LLM;Large Language Model)を前提として、それを使いやすくするためのツールキットだ。

LLMとしては、ChatGPTでも使われているOpenAIのGPT-3(またはGPT-3.5相当)を使うこともできるし、GoogleのFLAN-T5 XLみたいなモデルも使える。詳しくはnpakaこと布留川英一のnoteを参照のこと。

ただ、このモデル、ChatGPTとちがってタダでは使えない。
使うためには、まずOpenAIのGPT-3のAPIアカウントが必要(有料)だし、他にも連携するAPIによってそれぞれお金がかかる。
なので気軽に使おうとするとすぐにお金と戦う羽目になるので人柱として筆者が人肌脱いでみた。

今回の「対決」は同じ質問をして、どっちがよりそれっぽい回答を出せるか、というものにする。

ちなみにLangChainを使ったソースコードを以下に示す(フェアネスを目的としており、ソースが読めない人は読み飛ばしてください)。

こんなに簡単にChatGPT風のことができるのである(金さえあれば)。


import os

from langchain import OpenAI, ConversationChain
from langchain.chains.conversation.memory import ConversationSummaryMemory
from langchain.agents import initialize_agent
from langchain.agents import load_tools
# ConversationSummaryMemoryの準備

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

# LLMの準備
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# デフォルトメモリーの準備
#conversation = ConversationChain(llm=llm, verbose=True)
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)

s = agent_chain.run(input="東京都で最も人口が多いのは何駅")
print("[%s]"%s)

さて、まず最初に「東京都で最も人口が多いのは何駅」と聞いてみた。
まず、Langchainの回答。

> Entering new AgentExecutor chain...
Thought: 東京都の人口が多い駅を探す
Action: Search
Action Input: 東京都で最も人口が多い駅
Observation: No good search result found
Thought: 東京都の人口が多い駅を探す
Action: Search
Action Input: 東京都の人口が多い駅ランキング
Observation: No good search result found
Thought: 東京都の人口が多い駅を探す
Action: Search
Action Input: 東京都の人口が多い駅ランキング 2020
Observation: 1位. 新宿駅, 2,404,763 人. 2位. 渋谷駅, 2,284,302 人. 3位. 池袋駅, 1,926,362 人. 4. 北千住駅, 1,195,901 人. 5. 東京駅, 821,805 人. 6. 高田馬場駅, 662,162 人.
Thought: 東京都で最も人口が多い駅は新宿駅であることがわかった
Final Answer: 東京都で最も人口が多い駅は新宿駅です。
> Finished AgentExecutor chain.
[東京都で最も人口が多い駅は新宿駅です。]

確かに正しい答えを出す。
ChatGPTはどうだろうか。

恐ろしいほど堂々と嘘をつく。

なぜこの差がでてしまうのかというと、
ChatGPTはあくまでも「過去のデータ」で学習したことをそれっぽくつなぎ合わせているにすぎないからだ。
その点、Langchainのagentでは、「現在のGoogle検索」で実際に検索して、検索結果の中から「これが回答だろうな」というものをGPT-3を用いて抽出するようになっている。

次の質問をしてみよう。

「東京都で最もよく食べられる食べ物」

これは身近な質問かもしれない。
さあ、Langchainはどうだろうか。

Thought: 東京都で最もよく食べられている食べ物を探す
Action: Search
Action Input: "Tokyo most popular food"
Observation: We wholeheartedly recommend trying at least one Michelin or fine dining experience while you're visiting.
Thought: 東京都で最もよく食べられている食べ物は、ミシュラン星付きレストランで提供される料理が有名であることがわかった
Final Answer: 東京都で最もよく食べられている食べ物は、ミシュラン星付きレストランで提供される料理が有名です。
> Finished AgentExecutor chain.
[東京都で最もよく食べられている食べ物は、ミシュラン星付きレストランで提供される料理が有名です。]

なるほど。「popular」をどう解釈するかという問題もあるが、ミシュラン星付きレストランがもっとも「ポピュラー」であるというのは本当かもしれない。けど、それが「もっともよく食べられている」ものではないことは明白だ。

ではChatGPTはどうだろう。

つ、つまらん。
まさに「コンプラKID」
こいつは言い訳ばかりうまくなってぜんぜんこっちの心に響いてこない。

では「東京都で最も有名なレストラン」ではどうだろうか。

> Entering new AgentExecutor chain...
Thought: 検索してみる
Action: Search
Action Input: 東京都で最も有名なレストラン
Observation: 人気のお店はアトリウムラウンジ、ザ・ロビー、鉄板焼 摩天楼 東京スカイツリー・ソラマチ店!大切な人と楽しむお店探し。レストラン予約は一休.comで。
Thought: これらが最も有名なレストランだということがわかった
Final Answer: アトリウムラウンジ、ザ・ロビー、鉄板焼 摩天楼 東京スカイツリー・ソラマチ店が東京都で最も有名なレストランです。
> Finished AgentExecutor chain.
[アトリウムラウンジ、ザ・ロビー、鉄板焼 摩天楼 東京スカイツリー・ソラマチ店が東京都で最も有名なレストランです。]

し、知らない。
知らないぞ。
おかしいなと思って調べてみたら、Gooogle検索で最初に出てくるのがこのお店だった。

騙されてる!
SEOに騙されてるぞAI!!!

では、ChqtGPTはどうだろうか。

まさかの「四つ星レストラン」というパワーワード。
「アマン」は筆者の記憶ではホテルの名前という気がする。

他にも色々試したのだが、五十歩百歩の結果だったのでこのあたりで一旦は調査を打ち切ることにする(お金もかかるし)。

個人的にはSEOに騙されるものの、ちゃんと新しい情報を探しにいくLangchainのエージェントが可愛いし可能性がありそうだからLangchainの勝ちということにしよう。

ただ、ChatGPTも、WebGPTという、Webの情報をみに行くバージョンも開発中との噂もある。
この分野、これからどんどん面白くなりそうだ。

遊ぶならLangchainかな。
冬のボーナスやお年玉で各種APIに契約して遊んでみるのも一興ではないかと思います。

WirelessWire Weekly

おすすめ記事と編集部のお知らせをお送りします。(毎週月曜日配信)

登録はこちら

清水 亮(しみず・りょう)

新潟県長岡市生まれ。1990年代よりプログラマーとしてゲーム業界、モバイル業界などで数社の立ち上げに関わる。現在も現役のプログラマーとして日夜AI開発に情熱を捧げている。

RELATED TAG