LangChain の HOW-TO EXAMPLES (3) - チェーン
「LangChain」の「チェーン」が提供する機能を紹介する HOW-TO EXAMPLES をまとめました。
前回
1. チェーンの機能
「チェーン」は、処理を行う基本オブジェクトで、チェーンを繋げることで、一連の処理を実行することができます。チェーンは、プリミティブ(prompts、llms、utils) または 他のチェーン のいずれかで構成されます。
チェーンの種類は、次のとおりです。
・ジェネリックチェーン : チェーン構築のためのチェーン
・ドキュメントチェーン : ドキュメント操作のためのチェーン
・ユーティリティチェーン : ユーティリティ連携のためのチェーン
2. ジェネリックチェーン
特定の目的を果たすのではなく、チェーンを構築するために使用するチェーンです。
2-1. LLMChain
ユーザー入力を受け取り、それを基にPromptTemplateでプロンプトを生成し、それをLLMに渡して出力を返すチェーンです。
◎ シングル入力
from langchain import PromptTemplate, OpenAI, LLMChain
# テンプレートの準備
template = """Q: {question}
A: 一歩一歩考えてみましょう。"""
# プロンプトテンプレートの準備
prompt = PromptTemplate(
template=template,
input_variables=["question"]
)
# LLMChainの準備
llm_chain = LLMChain(
llm=OpenAI(temperature=0),
prompt=prompt,
verbose=True
)
# LLMChainの実行
question = "ギターを上達するには?"
print(llm_chain.predict(question=question))> Entering new LLMChain chain...
Prompt after formatting:
Q: ギターを上達するには?
A: 一歩一歩考えてみましょう。
> Finished LLMChain chain.
1. ギターを楽しむこと。ギターを楽しむことが一番大切です。ギターを楽しむことで、楽しい時間を過ごすことができます。
2. 練習を積み重ねること。ギターを上達するには、毎日の練習が必要です。毎日少しずつでも、毎日の練習を積み重ねていくことが大切です。
3. 指先の動きを意識すること。ギターを上達するには、指先の動きを意識して練習することが大切です。指先◎ マルチ入力
# テンプレートの準備
template = """{subject}を題材に{adjective}ポエムを書いてください。"""
# プロンプトテンプレートの準備
prompt = PromptTemplate(
template=template,
input_variables=["adjective", "subject"]
)
# LLMChainの準備
llm_chain = LLMChain(
prompt=prompt,
llm=OpenAI(temperature=0),
verbose=True
)
# LLMChainの実行
print(llm_chain.predict(adjective="かわいい", subject="猫"))> Entering new LLMChain chain...
Prompt after formatting:
猫を題材にかわいいポエムを書いてください。
> Finished LLMChain chain.
猫は可愛くて、\nその瞳は宝石のように輝いている。\nその身体は柔らかく、
その触感は毛羽立った極上のもの。
猫はその優しい声で
私を慰めてくれる。
そのお腹を撫でると
その心が温かくなる。
猫は私の心を満たしてくれる、
そして私を守ってくれる。
そんな猫を愛している、
そしてそれを永遠に守りたい。2-2. TransformChain
任意のPython関数を受け取り、それを他のチェーンの入出力に適用するチェーンです。
2-3. SequentialChain・SimpleSequentialChain
複数のチェーンを順番に実行するチェーンです。
詳しくは、以下で解説しています。
3. ドキュメントチェーン
質問応答や要約など、ドキュメント操作を簡単にすることを目的としたチェーンです。
3-1. StuffDocumentsChain
すべての関連データをコンテキストとしてプロンプトに詰め込み、言語モデルに渡すチェーンです。
3-2. MapReduceDocumentsChain
関連データをチャンクに分割し、チャンクごとにプロンプトを生成してLLMを呼び出し、最後に全ての結果を結合するプロンプトでLLMを呼び出すチェーンです。
3-3. MapReduceDocumentsChain
関連データをチャンクに分割し、最初のチャンクごとにプロンプトを生成してLLMを呼び出し、その出力と次のチャンクでプロンプトを生成してLLMを呼び出し、それを繰り返すチェーンです。
詳しくは、以下で解説しています。
4. ユーティリティチェーン
特定のユーティリティと相互作用するLLMChainで構成されるチェーンです。
4-1. LLMMathChain
ユーザー入力 (数学の問題) を受け取り、LLMChain を使用してそれをPythonコードに変換し、Python REPLで実行してから、それを結果として返すチェーンです。
from langchain import OpenAI, LLMMathChain
# LLMの準備
llm = OpenAI(temperature=0)
# LLMMathChainの準備
llm_math = LLMMathChain(
llm=llm,
verbose=True
)
# LLMMathChainの実行
print(llm_math.run("How many of the integers between 0 and 99 inclusive are divisible by 8?"))> Entering new LLMMathChain chain...
How many of the integers between 0 and 99 inclusive are divisible by 8?
Answer: 12
> Finished LLMMathChain chain.
Answer: 124-2. PALChain
ユーザー入力 (推論の質問) を受け取り、LLMChainでそれをPython REPLで実行するPythonコードに変換し、それを結果として返すチェーンです。
from langchain.chains import PALChain
from langchain import OpenAI
# LLMの準備
llm = OpenAI(
model_name='code-davinci-002',
temperature=0,
max_tokens=512)
# PALChainの準備
pal_chain = PALChain.from_math_prompt(
llm,
verbose=True
)
# PALChainの実行
# (JanはMarciaの3倍のペットを飼っています。 MarciaはCindy より2匹多くペットを飼っています。シンディが4匹のペットを飼っている場合、3 人が飼っているペットの総数は?)
question = "Jan has three times the number of pets as Marcia. Marcia has two more pets than Cindy. If Cindy has four pets, how many total pets do the three have?"
print(pal_chain.run(question))> Entering new PALChain chain...
def solution():
"""Jan has three times the number of pets as Marcia. Marcia has two more pets than Cindy. If Cindy has four pets, how many total pets do the three have?"""
cindy_pets = 4
marcia_pets = cindy_pets + 2
jan_pets = marcia_pets * 3
total_pets = cindy_pets + marcia_pets + jan_pets
result = total_pets
return result
> Finished PALChain chain.
284-3. SQLDatabaseChain
ユーザー入力 (質問) を受け取り、最初のLLMチェーンでSQLデータベースに対して実行するSQLクエリを作成し、次に別のLLMChainでそのクエリの結果を取得し、それを使用して元の質問に回答するチェーンです。
このサンプルは、Chinook データベースを使用します。 セットアップするには、https://database.guide/2-sample-databases-sqlite/ の指示に従い、.db を配置する必要があります。
from langchain import OpenAI, SQLDatabase, SQLDatabaseChain
# SQLDatabaseの準備
db = SQLDatabase.from_uri("sqlite:///../../../notebooks/Chinook.db")
# LLMの準備
llm = OpenAI(temperature=0)
# SQLDatabaseChainの準備
db_chain = SQLDatabaseChain(llm=llm, database=db, verbose=True)
# SQLDatabaseChainの実行
# (従業員は何人ですか?)
print(db_chain.run("How many employees are there?"))> Entering new chain...
How many employees are there?
SQLQuery: SELECT COUNT(*) FROM Employee
SQLResult: [(8,)]
Answer: 8
> Finished chain.
84-4. LLMBashChain
ユーザー入力 (質問) を受け取り、LLMチェーンを使用してそれをbashコマンドに変換してターミナルで実行し、結果としてそれを返すチェーンです。
4-5. LLMCheckerChain
ユーザー入力 (質問) を受け取り、LLMチェーンを使用してその質問に回答し、他のLLMChainsでその回答を自己チェックするチェーンです。
4-6. LLMRequestsChain
URLとその他の入力を受け取り、Requestsを使用してそのURLでデータを取得し、それを他の入力とともにLLMChainに渡して応答を生成するチェーンです。
4-7. OpenAIModerationChain
OpenAIのコンテンツモデレーションAPIを使用するチェーンです。
