🦜️🔗LangChain : Get Started : クイックスタート (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 08/20/2023
* 本ページは、LangChain の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
🦜️🔗 LangChain : Get Started : クイックスタート
環境設定
LangChain の使用は通常は一つまたはそれ以上のモデルプロバイダー、データストア、API 等との統合を必要とします。この例では、OpenAI のモデル API を使用します。
最初にそれらの Python パッケージをインストールする必要があります :
pip install openai
API へのアクセスは API キーを必要とします、これはアカウントを作成してここにアクセスして取得できます。キーを持てば、以下を実行して環境変数としてそれを設定することを望みます :
export OPENAI_API_KEY="..."
環境変数を設定したくない場合は、OpenAI LLM クラスを初期化するとき名前付きパラメータ openai_api_key 経由でキーを直接渡すことができます :
from langchain.llms import OpenAI
llm = OpenAI(openai_api_key="...")
アプリケーションの構築
これで言語モデルアプリケーションの構築を開始することができます。LangChain は言語モデルアプリケーションを構築するために使用できる多くのモジュールを提供しています。モジュールは単純なアプリケーションでスタンドアローンとして使用できて、それらはより複雑なユースケースに対しては組み合わせることができてます。
LangChain アプリケーションの中核のビルディングブロックは LLMChain です。これは 3 つのものを組み合わせます :
- LLM : 言語モデルはここでは中核の推論エンジンです。LangChain を操作するには、様々なタイプの言語モデルとそれらを扱う方法を理解する必要があります。
- プロンプト・テンプレート: これは言語モデルにインストラクションを提供します。これは言語モデルが出力するものを制御しますので、プロンプトを構築する方法や様々なプロンプティング・ストラテジーを理解することは重要です。
- 出力パーサー : これらは LLM からの raw レスポンスをより workable (実行・運用可能) な形式に変換し、下流で出力を使用することを簡単にします。
この getting started ガイドでは、これらの 3 つのコンポーネントをそれぞれカバーし、それからそれらのすべてを組み合わせる LLMChain をカバーします。これらの概念を理解すると、LangChain アプリケーションを使用してカスタマイズできる準備ができます。殆どの LangChain アプリケーションは使用される LLM and/or プロンプトを configure することを可能にしますので、これらを活用する方法を知ることは大きな成功要因 (enabler) になります。
LLM
LangChain では以下のように呼称される、2 つのタイプの言語モデルがあります :
- LLM : これは入力として文字列を受け取り、文字列を返す言語モデルです。
- ChatModel : これは入力としてメッセージのリストを受け取り、メッセージを返します。
LLM への入力/出力は単純で簡単に理解できます – 文字列です。しかし ChatModel についてはどうでしょう?そこでの入力は ChatMessages のリストで、出力は単一の ChatMessage です。ChatMessage は 2 つの必須の構成要素を持ちます :
- コンテンツ (content) : これはメッセージの内容です。
- ロール (role) : これはエンティティのロールで、そこから ChatMessage が発生します。
LangChain は異なるロールを簡単に識別するために幾つかのオブジェクトを提供しています :
- HumanMessage: 人間/ユーザからの ChatMessage
- AIMessage: AI/アシスタントからの ChatMessage
- SystemMessage: システムからの ChatMessage
- FunctionMessage: 関数呼び出しからの ChatMessage
これらのロールが当てはまらないようであれば、ロールを手動で指定できる ChatMessage クラスもあります。これらの様々なメッセージを効果的に使用する方法の詳細は、プロンプティング・ガイドをご覧ください。
LangChain は両方に対する標準的なインターフェイスを公開していますが、与えられた言語モデルに対するプロンプトを構築するためにこれらの違いを理解することは有用です。LangChain が公開する標準的なインターフェイスは 2 つのメソッドを持ちます :
- predict: 文字列を受け取り、文字列を返します。
- predict_messages: メッセージのリストを受け取り、メッセージを返します。
これらの異なるタイプのモデルと異なるタイプの入力を操作する方法を見てみしょう。最初に、LLM と ChatModel をインポートしましょう。
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
llm = OpenAI()
chat_model = ChatOpenAI()
llm.predict("hi!")
>>> "Hi"
chat_model.predict("hi!")
>>> "Hi"
OpenAI と ChatOpenAI オブジェクトは基本的には単なる configuration オブジェクトです。temperature 等のようなパラメータでそれらを初期化して渡すことができます。
次に、predict メソッドを使用して文字列入力を実行してみましょう。
text = "What would be a good company name for a company that makes colorful socks?"
llm.predict(text)
# >> Feetful of Fun
chat_model.predict(text)
# >> Socks O'Color
最後に、predict_messages メソッドを使用してメッセージのリストを実行しましょう。
from langchain.schema import HumanMessage
text = "What would be a good company name for a company that makes colorful socks?"
messages = [HumanMessage(content=text)]
llm.predict_messages(messages)
# >> Feetful of Fun
chat_model.predict_messages(messages)
# >> Socks O'Color
これら両方のメソッドに対して、キーワード引数としてパラメータを渡すこともできます。例えば、オブジェクトが構成されていたものから使用される temperature を調整するために temperature=0 を渡すことができるでしょう。実行時にどのような値が渡されても、オブジェクトが構成されていたものを常にオーバライドします。
プロンプト・テンプレート
殆どの LLM アプリケーションはユーザ入力を LLM に直接は渡しません。通常はそれらはユーザ入力を、プロンプトテンプレートと呼称される、より大きなテキストのピースに追加します、これは手元の特定のタスクで追加のコンテキストを提供します。
前の例では、モデルに渡したテキストは会社名を生成するインストラクションを含んでいました。私たちのアプリケーションについて、ユーザがモデルにインストラクションを与えることについて心配する必要なく、会社/製品の説明だけを提供する必要があるなら、それは素晴らしいです。
PromptTemplates はまさにこれに役立ちます!これらは、ユーザ入力から完全にフォーマットされたプロンプトに進むためのすべてのロジックをバンドルしています。これは非常に単純に始めることができます – 例えば、上記の文字列を生成するプロンプトは単に次のようになります :
from langchain.prompts import PromptTemplate
prompt = PromptTemplate.from_template("What is a good name for a company that makes {product}?")
prompt.format(product="colorful socks")
What is a good name for a company that makes colorful socks?
けれども、生の文字列のフォーマッティングよりもこれらを使用する優位点は幾つかあります。変数を「部分的に」出力できます – 例えば一部の変数だけを一度にフォーマットできます。それらをまとめて組み合わせたり、様々なテンプレートを単一プロンプトに簡単に組み合わせることができます。これらの機能の説明について、詳細は section on prompts をご覧ください。
PromptTemplates はまたメッセージのリストを生成するためにも使用できます。この場合、プロンプトは内容についての情報だけでなく、各メッセージ (ロール、リスト内の位置等) も含みます。ここで、最も多く発生することは、ChatPromptTemplate が ChatMessageTemplates のリストであることです。各 ChatMessageTemplate はその ChatMessage をフォーマットする方法に対するインストラクションを含みます – そのロール、それから内容もです。Let’s take a look at this below:
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
template = "You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chat_prompt.format_messages(input_language="English", output_language="French", text="I love programming.")
[ SystemMessage(content="You are a helpful assistant that translates English to French.", additional_kwargs={}), HumanMessage(content="I love programming.") ]
ChatPromptTemplates は ChatMessageTemplates 以外の他のものも含むことができます – 詳細は section on prompts をご覧ください。
出力パーサー
OutputParsers は LLM の生の出力を下流で利用できるフォーマットに変換します。OutputParsers の幾つかの主要なタイプがあり、以下を含みます :
- LLM からのテキストを変換 -> 構造化情報 (eg JSON)
- ChatMessage を単なる文字列に変換する。
- 呼び出しから返されるメッセージ以外の (OpenAI 関数呼び出しのような) 追加情報を文字列に変換する。
これについての完全な情報については、section on output parsers をご覧ください。
この getting started ガイドでは、私たち自身の出力パーサーを書きます – カンマ区切りのリストをリストに変換するものです。
from langchain.schema import BaseOutputParser
class CommaSeparatedListOutputParser(BaseOutputParser):
"""Parse the output of an LLM call to a comma-separated list."""
def parse(self, text: str):
"""Parse the output of an LLM call."""
return text.strip().split(", ")
CommaSeparatedListOutputParser().parse("hi, bye")
# >> ['hi', 'bye']
LLMChain
これでこれらすべてを一つのチェインに組み合わせることができます。このチェインは入力変数を受け取り、それらをプロンプト・テンプレートに渡してプロンプトを作成し、プロンプトを LLM に渡し、それから出力を (オプションの) 出力パーサーに渡します。これは、ロジックのモジュールピースをバンドルする便利な方法です。Let’s see it in action!
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.schema import BaseOutputParser
class CommaSeparatedListOutputParser(BaseOutputParser):
"""Parse the output of an LLM call to a comma-separated list."""
def parse(self, text: str):
"""Parse the output of an LLM call."""
return text.strip().split(", ")
template = """You are a helpful assistant who generates comma separated lists.
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.
ONLY return a comma separated list, and nothing more."""
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chain = LLMChain(
llm=ChatOpenAI(),
prompt=chat_prompt,
output_parser=CommaSeparatedListOutputParser()
)
chain.run("colors")
# >> ['red', 'blue', 'green', 'yellow', 'orange']
次のステップ
This is it! 私たちは今、LangChain アプリケーションの中核のビルディングブロック – LLMChains を作成する方法を調べました。これらすべてのコンポーネント (LLM、プロンプト、出力パーサー) で更に多くのニュアンス (差異) があり、学習すべき多くの様々なコンポーネントもあります。To continue on your journey:
- LLM, プロンプトと出力パーサーに 更に深く掘り下げる
- 他の 主要コンポーネント を学習する
- 特定のトピックの詳細なウォークスルーについては 有用なガイド を確認してください。
- end-to-end なユースケース を探究する。
以上