見出し画像

LangChainのチュートリアルメモ

1.LLM

もっとも単純な、LangChainのクイックスタートです。
LLMラッパーとして、OpenAI GPT-3を用いています。

  • インストール

pip install langchain
pip install openai
  • コード

import os
from langchain.llms import OpenAI
# OpenAI key.
os.environ["OPENAI_API_KEY"] = "..."
llm = OpenAI(temperature=0.9)
# カラフルな靴下を作る会社の社名は何がいいのでしょうか?
text = "What would be a good company name a company that makes colorful socks?"
print(llm(text))

# 出力→Vivid Sockery.

その他LLMの詳細はこちらを参照してください。

2.プロンプト

LLM を呼び出すことは素晴らしい第一歩ですが、それはほんの始まりに過ぎません。通常、アプリケーションで LLM を使用する場合、ユーザ入力を直接 LLM に送ることはありません。その代わりに、ユーザー入力を受けてプロンプトを作成し、それをLLMに送信しているのでしょう。

例えば、前の例では、カラフルな靴下を作る会社の名前を尋ねるテキストをハードコードして渡しました。この想像上のサービスでは、その会社が何をしている会社なのかを記述したユーザ入力だけを受け取り、その情報を使ってプロンプトをフォーマットしたいと思います。

from langchain.prompts import PromptTemplate

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

では、この動作を確認してみましょう .formatメソッドを呼び出して書式設定することができます。

プロンプトについて、詳細は以下の記事で確認できます。

3.チェーン

これまで、PromptTemplateプリミティブとLLMプリミティブをそれぞれ単体で扱ってきました。しかし、もちろん、実際のアプリケーションは一つのプリミティブだけでなく、それらを組み合わせて使うことになります。

LangChainのチェーンはリンクで構成されていますが、リンクはLLMのようなプリミティブでも他のチェーンでもかまいません。

最もコアなタイプのチェーンはLLMChainで,PromptTemplateとLLMから構成されます.

前の例を拡張して,

  1. ユーザー入力の受け取り

  2. 1.をPromptTemplateで整形し,整形された応答をLLMに渡す

上記動作を行うLLMChainを構築します。

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

os.environ["OPENAI_API_KEY"] = ".."
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)
print(chain.run("colorful socks"))
# Rainbow Toes Co.

さあ、出発だ! 最初の鎖は、LLM鎖です。これはより単純なチェーンの1つですが、このチェーンの仕組みを理解することで、より複雑なチェーンを扱うための準備が整います。

4.エージェント

これまで見てきたチェーンは、あらかじめ決められた順序で実行されていたのです。

エージェントはもはやそうではありません。エージェントはLLMを使って、どのアクションをどのような順番で行うかを決定します。アクションは、ツールを使ってその出力を観察することでも、ユーザに返すことでもあります。

エージェントを正しく使用すれば、非常に強力になります。このチュートリアルでは、最もシンプルで最高レベルのAPIを通して、エージェントを簡単に利用する方法を紹介します。

エージェントを読み込むためには、以下の概念を理解する必要があります。

  • ツール: 特定の義務を実行する機能。これは以下のようなものになります。Google 検索、データベース検索、Python REPL、その他のチェーン。ツールのインターフェイスは、現在、文字列を入力とし、文字列を出力とする関数であると考えられている。

  • LLM: エージェントを動かす言語モデル。

  • エージェント:使用するエージェント。これはサポートエージェントクラスを参照する文字列でなければなりません.このノートブックでは,最もシンプルで高レベルのAPIに焦点を当てているため,標準的にサポートされているエージェントの使用方法のみを説明します.カスタムエージェントを実装したい場合は、カスタムエージェントのドキュメントを参照してください (近日公開予定)。

エージェント:サポートされているエージェントとその仕様の一覧は、こちらを参照してください。

ツール:定義済みツールのリストとその仕様については、こちらを参照してください。

注意:下記コードは「https://serpapi.com/」のアカウントおよびAPIキーが必要になります。Serpapiは、月100検索まで無料です。

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI
import os
os.environ["OPENAI_API_KEY"] = "..."
os.environ["SERPAPI_API_KEY"] = "..."

# First, let's load the language model we're going to use to control the agent.
# まず、エージェントを制御するために使用する言語モデルをロードしましょう。
llm = OpenAI(temperature=0)

# Next, let's load some tools to use. Note that the `llm-math` tool uses an LLM, so we need to pass that in.
# 次に、使用するツールをいくつかロードしよう。llm-math` ツールは LLM を使用するので、それを渡す必要があることに注意。
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="zero-shot-react-description", verbose=True)

# Now let's test it out!
# " オリビアワイルドの彼氏は誰?現在の年齢は0.23乗で何歳?"
agent.run("Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?")

結果

> Entering new AgentExecutor chain... I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power.
Action: SearchAction Input: "Olivia Wilde boyfriend"
Observation: Jason Sudeikis
Thought: I need to find out Jason Sudeikis' age
Action: Search
Action Input: "Jason Sudeikis age"
Observation: 47 years
Thought: I need to calculate 47 raised to the 0.23 power
Action: Calculator
Action Input: 47^0.23
Observation: Answer: 2.4242784855673896

Thought: I now know the final answer
Final Answer: Jason Sudeikis, Olivia Wilde's boyfriend, is 47 years old and his age raised to the 0.23 power is 2.4242784855673896.

5.メモリー

今までのところ、すべてのチェーンとエージェントはステートレスでした。しかし、たびたびチェーンやエージェントに "記憶 "の概念を持たせ、以前のインタラクションに関する情報を記憶させることがある。
この最も明確で単純な例は、チャットボットを設計するときです。チャットボットに以前のメッセージを記憶させ、その文脈からより良い会話をすることができるようにします。これは、一種の「短期記憶」と言えるでしょう。より複雑な例としては、チェーンやエージェントが重要な情報を長期にわたって記憶することが挙げられますが、これは「長期記憶」の一種です。
後者に関するより具体的なアイデアについては、こちらの素晴らしい論文をご覧ください。

LangChainはこの目的のために特別に作られたチェーンをいくつか提供しています。このノートブックでは、そのうちの1つ(ConversationChain)を2つの異なるタイプのメモリで使用する方法を説明します。

デフォルトでは、ConversationChainは以前の入出力をすべて記憶し、渡されたコンテキストに追加するシンプルなタイプのメモリを持っています。このチェーンを使って見ましょう(プロンプトが見えるようにverbose=Trueを設定します)。

from langchain import OpenAI, ConversationChain
import os
os.environ["OPENAI_API_KEY"] = "..."

llm = OpenAI(temperature=0)
conversation = ConversationChain(llm=llm, verbose=True)

print(conversation.predict(input="Hi there!"))

結果

> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.
(以下は、人間とAIが仲良く会話している様子です。AIは饒舌で、その文脈から具体的な内容をたくさん教えてくれます。AIは質問に対する答えを知らない場合、正直に「知らない」と答えます。)

Current conversation:

Human: Hi there!
AI:

> Finished chain.
Hi there! It's nice to meet you. My name is AI. What's your name?

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