エンジニアリングとお金の話

都内で働くエンジニアの日記です。

langchainでチェーン同士をつなげる

【SPONSORED LINK】

langchainでチェーン同士をつなげると最初のチェーンが導き出したワードを元に、後続のチェーンがワードを導き出すことが出来る。チェーンをつなげる方法は2種類あり、SimpleSequentialChainは入出力を1つずつ持つチェーンを繋げるチェーン、SequentialChainは入出力を複数持つチェーンを繋げることができる。

SimpleSequentialChainサンプル

from dotenv import load_dotenv
from langchain.chains import LLMChain, SimpleSequentialChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

load_dotenv()

llm = OpenAI(temperature=0.9)

template = """\
あなたは料理家です。食材を与えるので料理を考えてください

食材:{food}
料理:\
"""

prompt_template = PromptTemplate(input_variables=["food"], template=template)

first_chain = LLMChain(llm=llm, prompt=prompt_template)


template = """\
あなたは栄養士です。料理を与えるので栄養価を教えて下さい

料理:{dish}
レビュー:\
"""

prompt_template = PromptTemplate(input_variables=["dish"], template=template)

second_chain = LLMChain(llm=llm, prompt=prompt_template)

overall_chain = SimpleSequentialChain(chains=[first_chain, second_chain], verbose=True)

review = overall_chain.run("卵")

print(review)

実行結果

Entering new SimpleSequentialChain chain... オムレツ

オムレツは、カロリーが高くないため、たんぱく質や鉄分など栄養価が高い食品としても有名です。1食あたりのカロリーは約400cal、たんぱく質は約20g、鉄分は約1.5mgです。また、ビタミンB12なども含まれています。卵を中心としたこの料理は、糖質も低く、低血糖を抑えながら長時間エネルギーを支えてくれるため、健康に良い料理といえます。

Finished chain.

オムレツは、カロリーが高くないため、たんぱく質や鉄分など栄養価が高い食品としても有名です。1食あたりのカロリーは約400cal、たんぱく質は約20g、鉄分は約1.5mgです。また、ビタミンB12なども含まれています。卵を中心としたこの料理は、糖質も低く、低血糖を抑えながら長時間エネルギーを支えてくれるため、健康に良い料理といえます。

SequentialChainサンプル

from dotenv import load_dotenv
from langchain.chains import LLMChain, SequentialChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

load_dotenv()

llm = OpenAI(temperature=0.9)

template = """\
あなたは料理家です。国と食材を与えるので料理を考えてください

国:{country}
食材:{food}
料理:\
"""

prompt_template = PromptTemplate(input_variables=["country", "food"], template=template)

first_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="dish")


template = """\
あなたは栄養士です。料理を与えるので栄養価を教えて下さい

料理:{dish}
栄養価:\
"""

prompt_template = PromptTemplate(input_variables=["dish"], template=template)

second_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="value")

overall_chain = SequentialChain(
    chains=[first_chain, second_chain],
    input_variables=["country", "food"],
    output_variables=["dish", "value"],
    verbose=True,
)

review = overall_chain({"country": "フランス", "food": "鶏肉"})

print(review)

実行結果

Entering new SequentialChain chain...

Finished chain. {'country': 'フランス', 'food': '鶏肉', 'dish': '鶏肉のドリア', 'value': '鶏肉のドリアは、1カップあたりの熱量が390 kcal、たんぱく質が全21.2 g、脂質が全7.3 g、炭水化物が全51.1 gであると言われています。しかしながら、栄養バランスを考慮した上で、食材や調理方法などによって栄養価が変動しうることを忘れないでください。'}

分かったこと

  • SimpleSequentialChainは後続チェーンに与える値が1つなので各々のチェンでinputの値のみ指定すれば良く、outputの値を指定しなくて良い
  • SimpleSequentialChainはrunコマンドでワードを与えて実行する
  • SequentialChainは後続のチェーンに値を渡すためにoutput_keyを指定する必要がある。
  • SequentialChainはコンストラクタにワードを与えて実行する