Skip to content
LangChainとは?LangChain Chainの使い方と機能について

LangChain Chainの細密さ:マルチモデル言語学習ソリューションの可能性を発揮する

Updated on

LangChainは、言語学習モデル(LLM)の動的な分野において重要な影響を与えている魅力的なツールです。このブログ投稿では、この画期的なツールの重要な要素であるLangChain Chainについて探求していきます。それらは何ですか?どのように機能しますか?なぜLangChainにとって重要なのですか?

LangChainとは?LangChain AIとは?

LangChain Chainに深く注目する前に、LangChain自体について理解しましょう。LangChainは、OpenAI、Cohere、Bloom、Huggingfaceなどのいくつかの大規模な言語モデル(LLM)プロバイダとのやり取りを効率化するために設計された堅牢なライブラリです。LangChainのユニークな提案は、1つ以上のLLM間の論理的なリンクであるChainを作成する能力です。この性質がLangChainに重大なユーティリティを提供します。

LangChain Chainとは何ですか?

ChainsはLangChainの重要な核心です。1つ以上のLLMの間の論理的な接続は、LangChainの機能のバックボーンです。チェーンは、必要性と関連するLLMに応じて単純または複雑になります。両方のタイプについてさらに掘り下げましょう。

ベーシックチェーン

基本チェーンは、作成できる最も単純なチェーンです。単一のLLMが入力プロンプトを受信して、そのプロンプトをテキスト生成に使用するというものです。

たとえば、次のコードを使用して、HuggingfaceをLLMプロバイダとして使用した基本チェーンを構築します。

from langchain.prompts import PromptTemplate
from langchain.llms import HuggingFace
from langchain.chains import LLMChain
 
prompt = PromptTemplate(
    input_variables=["city"],
    template="Describe a perfect day in {city}?",
)
 
llm = HuggingFace(
          model_name="gpt-neo-2.7B", 
          temperature=0.9) 
 
llmchain = LLMChain(llm=llm, prompt=prompt)
llmchain.run("Paris")

ここでは、パリでの完璧な日を説明するAI生成テキストが出力されます。

アドバンスドチェーン

アドバンスドチェーン、またはユーティリティチェーンとも呼ばれるチェーンは、特定のタスクに対処するために複数のLLMで構成されています。サマリーズアンドトランスレートチェーンという適切な例があります。これは、要約や翻訳などのタスクに向けられています。

たとえば、LangChainには特定のユーティリティチェーンであるTopicModellingChainがあります。これは、記事を読み取り、関連するトピックのリストを生成します。

from langchain.chains import TopicModellingChain
topic_chain = TopicModellingChain(llm=llm, verbose=True)
topic_chain.run("気候変動に関する科学論文のテキスト。")
```ここでの出力は、気候変動に関する科学的論文に関連するトピックのリストを提供します。
 
## LangChain Chainsの強さ
 
LangChain Chainsを重要なものにするものは何ですか?
 
LangChain Chainsは、さまざまなLLMを簡単にリンクし、異なるモデルの強みを統合し、より複雑で洗練されたタスクの実行を容易にすることで、ユーザーに力を与えます。彼らは従来の単一モデルのアレンジメントの能力を向上させ、複雑な問題に対する創造的な解決策の道を開きます。
 
LangChain Chainsは、LLMの世界における重大な進歩を表しています。アクセス可能な方法でモデル間のギャップを埋めることにより、彼らは趣味家からエンタープライズレベルのプロフェッショナルまで、世界中の開発者にとって貴重なツールになることができます。LangChain Chainsの力を借りれば、言語学習モデルが達成できることに制限はありません。
 
## LLMとプロンプトのないチェーン
 
前述のPalChainがユーザーの自然言語で書かれた質問をパースするためにLLM(およびそれに対応するプロンプト)を必要とするのに対し、LangChainには必要ないチェーンが存在します。これらは、主にプロンプトを前処理する変換チェーンです。例えば、余分なスペースを除去するなどの操作を行います。次の例を考えてください:
 
```python
from langchain.chains import TrimSpacesChain
 
trim_chain = TrimSpacesChain()
trimmed_prompt = trim_chain.run("   What is the   weather   like?   ")
print(trimmed_prompt)  # Outputs: "What is the weather like?"

この場合、TrimSpacesChainは、不要なスペースを除去することによってプロンプトをクリーンアップするために使用されます。前処理の後、クリーンアップされたプロンプトを選択したLLMにフィードすることができます。

Chainsの作成:SimpleSequentialChain

次に、特定のチェーンタイプであるSimpleSequentialChainに焦点を当ててみましょう。このチェーンタイプにより、一つのLLMの出力が次のLLMの入力となるようにLLMを論理的にリンクすることができます。

プロンプトのクリーニング(余分なスペースの除去、短縮など)が必要な場合を考えてみましょう。上記のTrimSpacesChainを使用し、LLMチェーンと組み合わせます。

from langchain.chains import SimpleSequentialChain
 
trim_chain = TrimSpacesChain()
llm_chain = LLMChain(llm=llm, prompt=prompt)
 
combined_chain = SimpleSequentialChain([trim_chain, llm_chain])
output = combined_chain.run("   What is the   weather   like?   ")
print(output)  # Outputs AI-generated text based on the cleaned prompt

このセットアップでは、TrimSpacesChainからの出力(クリーニングされたプロンプト)がLLMChainへの入力として渡されます。

Agentsの役割

LangChainのAgentsは、ユーザーの入力に基づいてLLMを動的に呼び出す革新的な方法を提供します。彼らはLLMにアクセスするだけでなく、Google検索、Python REPL、数学計算機、天気APIなどのツールスイートにもアクセスでき、外部世界とやり取りできます。

LangChainのZERO_SHOT_REACT_DESCRIPTIONエージェントを使用した実践例を考えてみましょう。

from langchain.agents import initialize_agent, AgentType, load_tools
from langchain.llms import OpenAI
 
llm = OpenAI(temperature=0)
tools = load_tools(["pal-math"], llm=llm)
 
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
 
```response = agent.run("父親の年齢の半分が私の年齢だとし、彼が来年60歳になる場合、私の現在の年齢は何歳ですか?")
print(response) # 出力:「私の現在の年齢は29.5歳です。」

この場合、エージェントは、自然言語のプロンプトに埋め込まれた数学の問題を解決するために、pal-mathツールとOpenAI LLMを活用しています。プロンプトを理解し、正しいツールを選択し、意味のある回答を返すことで、エージェントが追加価値をもたらす実用的なケースを示しています。

LangChainのチェーンとエージェントの動的な機能により、ユーザーは柔軟にマルチステップの言語処理ワークフローを設計できます。プロンプトの前処理、マルチLLMチェーンの作成、またはエージェントを使用してLLMとツールを動的に選択する場合でも、LangChainは実現するためのビルディングブロックを提供します。

上級ユースケース:ユーザのお気に入りのジャンルに基づく映画のおすすめを生成する

このユースケースでは、2つのチェーンを使用して作業します。

チェーン#1-ユーザーがお気に入りの映画ジャンルについて尋ねるLLMチェーン。 チェーン#2-最初のチェーンから得たジャンルを使用して、選択したジャンルから映画をお勧めする別のLLMチェーン。

まず、 chain_one を作成しましょう。

template = '''あなたは映画のジャンル調査です。ユーザーに彼らのお気に入りのジャンルについて尋ねます。
 
尋ねる:'''
prompt_template = PromptTemplate(input_variables=[], template=template)
chain_one = LLMChain(llm=llm, prompt=prompt_template)

それから、映画をお勧めするための chain_two を作成します。

template = '''あなたは映画のおすすめサイトです。ユーザーのお気に入りのジャンル:{genres} に基づいて、これらのジャンルに該当する映画を提供します。
 
映画を提供する:'''
prompt_template = PromptTemplate(input_variables=["genres"], template=template)
chain_two = LLMChain(llm=llm, prompt=prompt_template)

次に、SimpleSequentialChainを使用してこれらのチェーンを結合しましょう。

from langchain.chains import SimpleSequentialChain
 
overall_chain = SimpleSequentialChain(
    chains=[chain_one, chain_two],
    verbose=True)

SimpleSequentialChain用に入力関数と出力関数を明示的に指定していないことに注意してください。これは、チェーン1からの出力がチェーン2への入力として渡されるという根本的な前提条件です。

さあ、このチェーンを実行しましょう。

overall_chain.run('あなたのお気に入りの映画のジャンルは何ですか?')
 
# OUTPUT
# > 新しい SimpleSequentialChain チェーンに入ります ...
 
# > 新しい LLMChain に入ります...
# お気に入りのジャンル:アクション、ドラマ、コメディ# 完了したチェーン。
 
# お気に入りのジャンルが与えられた場合:アクション、ドラマ、コメディー、いくつかの映画の推薦方法:
# アクション:ダイ・ハード、狂暴ロード、ダークナイト
# ドラマ:ショーシャンクの空に、シンドラーのリスト、フォレスト・ガンプ
# コメディー:スーパーバッド、ハングオーバー、ブライズメイズ
# > 完了したチェーン
 
 

最初のLLMChainはお気に入りのジャンルを求め、2つ目のLLMChainはこの入力を使用して映画のおすすめを生成します。これは、複数のLLMChainをSimpleSequentialChainに組み合わせて、パーソナライズされた映画のおすすめシステムを作成する方法の素晴らしい例です。

今、ユーザーから好まれる映画の長さなどの追加情報を取得したい場合、chain_twoを更新して、別の入力変数であるmovie_lengthを取るようにすることができます。

template = '''You are a movie recommender. Given the user's favorite genres: {genres} and their preferred movie length: {movie_length}, suggest some movies that fall under these genres.
 
Suggest movies:'''
prompt_template = PromptTemplate(input_variables=["genres", "movie_length"], template=template)
chain_two = LLMChain(llm=llm, prompt=prompt_template)

最後に、複数の入力と出力を扱うことができるSequentialChainを使用して、これらのチェーンを組み合わせます。

overall_chain = SequentialChain(
    input_variables=["input"],
    memory=SimpleMemory(memories={"movie_length": "2 hours"}),
    chains=[chain_one, chain_two],
    verbose=True)

このシナリオでは、'movie_length'といった追加のコンテキストを格納するためにSimpleMemoryを使用しています。このチェーンを実行すると、気に入ったジャンルに基づいて映画をおすすめするだけでなく、好ましい映画の長さも考慮されます。

結論

LangChainを実験して遊んでみることをお勧めします。AIエージェントやモデルを連鎖させて、より強力で有用なアプリケーションを作成するための機会は無限大です!

よくある質問

  1. LangChainとは何ですか? LangChainは、構造化された方法で異なるAIモデル、エージェント、プロンプトを連鎖させるためのPythonライブラリです。複数のモデルを順序付けて相互作用する複雑なAIアプリケーションを作成するために最適です。

  2. LangChainのSimpleSequentialChainおよびSequentialChainとは何ですか? SimpleSequentialChainとSequentialChainはLangChainのチェーンのタイプで、異なるAIエンティティ(モデル、エージェントなど)を連鎖させるために使用されます。SimpleSequentialChainは、チェーン間に単一の入力と単一の出力がある場合に使用され、SequentialChainは複数の入力と出力がある場合に使用されます。

  3. LangChainを使用して追加のコンテキストをどのように追加できますか? LangChainでは、SimpleMemoryを使用して追加のコンテキストを追加することができます。これは、コンテキストまたは他の情報を格納して、プロンプト間で変更されるべきではないものを保持するための簡単な方法です。

  4. LangChainでカスタムエージェントを作成できますか? はい、LangChainでは、Agentクラスを使用してカスタムエージェントを作成できます。エージェントは、複雑なロジックをカプセル化し、チェーンの一部となることができます。

  5. LangChainに関する詳細情報はどこで見つけることができますか? LangChainに関する詳細情報は、公式のドキュメンテーションWebサイトで入手できます。開源プロジェクトですので、GitHubでソースコードを確認することもできます。

📚