ChatGPTと仲良くなるための旅(4)

LangChainと仲良くなる

 LangChainにはいろいろな機能があるらしいので、ドキュメント読んだりサンプル書いたりして、LangChainと仲良くなろうと思う。これを一通りさわれるようになったあと、AI小説企画のネタ出しに入ろ~って感じだ。

最初のサンプルコード

 クイックスタートのサンプルに従ってLangChainのライブラリをインストールする。

pip install langchain

 なぞの靴下会社の紹介文を考えてもらうサンプルコード。これはホントに靴下なのか? 詐欺商材じゃないのか…??

import os
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

os.environ["OPENAI_API_KEY"] = "XXX"

llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)

chain = LLMChain(llm=llm, prompt=prompt)

text = llm(chain.run("colorful socks"))
print(text)

text = llm(f"{text}\n===\n in japanese.")
print(text)
At Saturated Sock Co., we specialize in creating premium, high-quality socks designed to keep your feet feeling comfortable and looking stylish. Our socks are made from ethically sourced materials and are made to last. We offer a variety of designs, colors, and sizes to match any style or preference, and our socks are machine washable and shrink resistant for easy care. Our commitment to quality, great customer service, and satisfaction guarantee make Saturated Sock Co. the perfect choice for your sock needs.
サチュレートソックコーでは、足を快適に感じさせ、スタイリッシュな見た目を演出するプレミアム高品質ソックスを作成することを専門としています。当社のソックスは、エシカルソースのもので作られており、耐久性に優れています。お客様のスタイルや好みに合わせた様々なデザイン、色、サイズをご用意しており、洗濯機で洗えるし、縮みづらいので簡単に扱えます。品質、優れたカスタマーサービス、

 ついでに日本語訳も入れてみたら途中で切れた。文字制限がデフォルトだと短いのかも。そもそもこれは何のモデルを使っているのかもよくわからない。ちょっと調べてみたところ、text-davinci-003を使っているみたいだ。gpt-3.5にしたいので、コードを少し書き換える。

llm = OpenAI(temperature=0.9, model_name="gpt-3.5-turbo")
Rainbow Socks Co. is a fictional company that might specialize in the production and sale of colorful and vibrant socks. The company could offer a wide range of sock styles, from ankle socks to knee-high socks, in all colors of the rainbow. Rainbow Socks Co. might also offer custom designs and personalized socks for special occasions or events. The company could market its products to individuals who enjoy expressing themselves through their fashion choices, as well as to businesses or organizations looking for unique and eye-catching gifts or promotional items. With a focus on quality, comfort, and style, Rainbow Socks Co. aims to bring a pop of color and personality to the feet of all who wear its products.
虹ソックス株式会社は、カラフルかつビビッドな靴下の製造と販売に特化した架空の会社です。同社は靴下のスタイルを幅広く提供し、足首からひざ上まで、虹色のすべてのカラーの靴下を取り揃えることができます。また、特別な場合やイベントに向けたカスタムデザインやパーソナライズされた靴下を提供することもできます。同社は、自分自身のファッションチョイスを通じて自己表現することを楽しむ個人だけでなく、ユニークで目を引く贈り物やプロモーションアイテムを探している企業や団体にも、その製品を販売することを目指しています。品質、快適さ、スタイルに焦点を当てた虹ソックス株式会社は、その製品を履くすべての人々の足にカラフルで個性的な魅力をもたらすことを目指しています。

 ええ…架空の会社って自称するのかコイツ(‘_’) さっきのモデルよりいい感じの内容が出力されているっぽいが、実際はコードでWarningが発生している。

UserWarning: You are trying to use a chat model. This way of initializing it is no longer supported. Instead, please use: `from langchain.chat_models import ChatOpenAI

 gpt3.5を使う場合はOpenAIではなく、ChatOpenAIを使ってね、ってことらしい。そのものズバリの質問があったのでそこのコードを参考にして修正する。

import os
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage

os.environ["OPENAI_API_KEY"] = "XXX"

llm = ChatOpenAI(temperature=0.9, model_name="gpt-3.5-turbo")

prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)

chain = LLMChain(llm=llm, prompt=prompt)
text = chain.run("colorful socks")

text = llm([HumanMessage(content=text)])
print(text.content)

text = f"{text.content}\n===\n in japanese."
text = llm([HumanMessage(content=text)])
print(text.content)

Rainbow Sock Co. is a company that specializes in creating high-quality and colorful socks. The company was founded with the goal of bringing more vibrancy and personality to people's everyday attire. All Rainbow socks are made from the finest materials and are designed to be comfortable, durable, and stylish. The company offers a wide variety of sock styles, including ankle socks, crew socks, knee-high socks, and more. Rainbow Sock Co. is committed to sustainable practices, and all products are made with environmentally friendly materials whenever possible. Whether you're looking for a bold statement piece or a more subtle accent, Rainbow Sock Co. has the perfect pair of socks for you.
レインボーソック社は、高品質でカラフルな靴下を作る会社です。この会社は、人々の日常の衣服により多くの活力と個性をもたらすことを目的として設立されました。すべてのレインボーソックは、最高級の素材で作られ、快適で丈夫でスタイリッシュなデザインになっています。同社は、アンクルソックス、クルーソックス、ニーハイソックスなど、さまざまな靴下スタイルを提供しています。レインボーソック社は、持続可能な取り組みに取り組んでおり、可能な限り環境にやさしい素材で製品を作っています。大胆なステートメントピースまたはより控えめなアクセントを探している場合、レインボーソック社にはあなたにぴったりの一足があります。

 ワーニングが消えた。ヨカッタ。いつもC++言語書いている身としては、コード後半部分のtextを使い回しまくっている部分に正直オゾケが止まらないのだが、、、オエッ、、、Pythonくんは淡々と受け入れて実行している…コイツやりおるわ(‘_’)

エージェントのサンプルコード

 Google検索をLangChainにさせるサンプルコードみたいだ。Google検索をブラウザではなくコードから実行する場合、APIを呼び出す必要がある。APIの呼び出し自体はLangChainがやってくれるが、APIを呼び出すためには「APIキー」が必要だ。これは自分で取ってこないといけない。そういうわけで、取ってくる。

 取ってきた。Freeで使う場合、1ヶ月に100検索までできるみたいだ。サンプル書くだけならこれで十分すぎるのでFreeを選んだ。さっそくサンプルコードを書いてみる。

import os
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI

os.environ["OPENAI_API_KEY"] = "XXX"
os.environ["SERPAPI_API_KEY"] = "XXX"

# First, let's load the language model we're going to use to control the agent.
#llm = OpenAI(temperature=0, model_name="gpt-3.5-turbo")
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")

# Next, let's load some tools to use. Note that the `llm-math` tool uses an LLM, so we need to pass that in.
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use.
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

# Now let's test it out!
text = agent.run("What was the high temperature in SF yesterday in Fahrenheit? What is that number raised to the .023 power?")

print(text)

text = f"{text}\n===\n in japanese."
text = llm([HumanMessage(content=text)])
print(text.content)
ValueError: ZeroShotAgent does not support multi-input tool Calculator.

 なんかエラーが出た。agent=AgentType.ZERO_SHOT_REACT_DESCRIPTIONは複数のTool指定に対応していないぴょーん、みたいなことを言っているが、公式ドキュメントでは複数に対応すると書いてある。どゆこと? って思って検索したところ、最新のLangChainにバグが入っちゃったみたいだ(ツラ…)。なのでバージョンを戻すと成功するらしい。ていうかコレ、昨日の話なのかw やっぱりバージョンが0.x系のいままさに開発中で~す!っていうライブラリはこういうこともあるんだね。ライブ感があってイイネ・・・

 実行結果はこんな感じ。最初の入力は「昨日のSFの最高気温は華氏何度でしたか?その数字を0.023乗したものは何ですか?」というものだ(実際は英語だ)。

> Entering new AgentExecutor chain...
I need to find the high temperature in SF yesterday and then raise it to the .023 power. I should use a search engine to find the temperature and a calculator to raise it to the power.

Action: Search
Action Input: "SF high temperature yesterday"
Observation: San Francisco Temperature Yesterday. Maximum temperature yesterday: 79 °F (at 3:56 pm) Minimum temperature yesterday: 50 °F (at 5:56 am) Average temperature ...
Thought:I found the high temperature yesterday, now I need to use a calculator to raise it to the .023 power.
Action: Calculator
Action Input: 79^0.023
Observation: Answer: 1.1057206569251619
Thought:I now know the final answer.
Final Answer: The high temperature in SF yesterday in Fahrenheit raised to the .023 power is approximately 1.1057.
> Finished chain.
The high temperature in SF yesterday in Fahrenheit raised to the .023 power is approximately 1.1057.

昨日のSFの華氏での高温は、0.023の累乗で上昇し、約1.1057です。
  1. 最初に作業内容をエージェント君が整理する
    • サンフランシスコの最高気温を見つけて、0.023で累乗する必要がある。
    • 検索エンジンで気温を探す⇒計算機で累乗する て感じでやるべきだ。
  2. 検索実行
    • 「SF high temperature yesterday」で検索する
    • (検索結果が返ってきた)
  3. 観察/考察
    • 昨日のサンフランシスコの最高気温と最低気温について・・・
    • 最高気温はわかった。次はこれを累乗する。
  4. 計算実行
    • 79の0.023乗
  5. 観察/考察
    • 計算結果は1.1057206569251619
    • これが最後の答え
  6. ファイナルアンサー(・∀・)
    • 昨日のサンフランシスコの最高気温(華氏)を0.023乗したものは1.1057デスッ
  7. 出力
    • 昨日のサンフランシスコの最高気温(華氏)を0.023乗したものは1.1057デスッ

 ほんとにぃ~?<・><・> っと疑いのまなざしを向けてしまうのが人のサガである。実際に検索してみよう。Googleでまったく同じ検索ワード「SF high temperature yesterday」を使って最初に出てきたページによると、昨日のサンフランシスコの最高気温は…摂氏26度。華氏だと78.8度。四捨五入すると79度だ。あってる! すげっ! 累乗計算のほうはどうだろう。Windowsに標準で付属している電卓で検算だ。

関数電卓ついてるのサイコーすぎる

 あ…あってる! あってるやんけワレ!! これまで私はChatGPTくんのこと、頭はいいけどすげーバカ、みたいに思ってたけど(失礼極まりない)、これ…こういうツールと適切に組み合わせることができれば、まじで鬼に金棒やん…カッコイイ…!

今日のまとめ

 クイックスタートはざっくり「チェーン」「エージェント」「メモリ」の3つ+それぞれをチャット形式に置き換えたもので構成されていて、今日は「チェーン」「エージェント」だけやってみた。明日は「メモリ」をさわってみるつもり。

 GWはこのおべんきょに全ツッパすることに決めたので…まだまた旅は終わらないッ!