こちらの続きです。前回は言語モデル(LM)を呼び出しただけでしたが、今回はプロンプトテンプレートを用いて、プロンプト作成を効率化します
ノートブックです。
チャットモデルとプロンプトテンプレートを使用してシンプルなLLMアプリケーションを構築する
Build a simple LLM application with chat models and prompt templates | 🦜️🔗 LangChain
このクイックスタートでは、LangChainを使用してシンプルなLLMアプリケーションを構築する方法を紹介します。このアプリケーションは、英語のテキストを他の言語に翻訳します。これは比較的シンプルなLLMアプリケーションで、単一のLLM呼び出しといくつかのプロンプトだけです。それでも、LangChainを始めるには素晴らしい方法です。いくつかのプロンプトとLLM呼び出しだけで多くの機能を構築できます!
このチュートリアルを読んだ後、次のことについての概要を理解できます:
- 言語モデルの使用
- プロンプトテンプレートの使用
- LangSmithを使用したアプリケーションのデバッグとトレース(今回はMLflow Tracingを使います)
さあ、始めましょう!
ここからは、MLflow Tracingをきちんと活用したいので、最新バージョンにして明示的にTracingを有効化します。
%pip install -qU langchain[openai] databricks-langchain mlflow
%restart_python
import mlflow
# MLflow Tracingの有効化
mlflow.langchain.autolog()
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")
言語モデルの利用
まず、言語モデル(Language Model:LM)を単独で使用する方法を学びましょう。LangChainは、多くの異なる言語モデルをサポートしており、それらを相互に交換して使用できます。特定のモデルの使用を開始するための詳細については、サポートされているインテグレーションを参照してください。
from langchain.chat_models import init_chat_model
model = init_chat_model("gpt-4o-mini", model_provider="openai")
まず、モデルを直接使用してみましょう。ChatModelsはLangChain Runnablesのインスタンスであり、それらと対話するための標準インターフェースを提供します。モデルを単純に呼び出すには、メッセージのリストを.invoke
メソッドに渡すことができます。
from langchain_core.messages import HumanMessage, SystemMessage
messages = [
SystemMessage("以下を英語から日本語に翻訳して"),
HumanMessage("hi!"),
]
model.invoke(messages)
AIMessage(content='こんにちは!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 3, 'prompt_tokens': 24, 'total_tokens': 27, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_06737a9306', 'finish_reason': 'stop', 'logprobs': None}, id='run-8ec7cc22-d2d1-4a31-b2fb-4d25c858c035-0', usage_metadata={'input_tokens': 24, 'output_tokens': 3, 'total_tokens': 27, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})
APIリファレンス: HumanMessage | SystemMessage
ChatModelsはメッセージオブジェクトを入力として受け取り、メッセージオブジェクトを出力として生成します。メッセージオブジェクトはテキストコンテンツに加えて、会話の役割を伝え、ツールの呼び出しやトークン使用量などの重要なデータを保持します。
LangChainは、文字列やOpenAI形式でのチャットモデル入力もサポートしています。以下はすべて等価です:
model.invoke("Hello")
model.invoke([{"role": "user", "content": "Hello"}])
model.invoke([HumanMessage("Hello")])
正直、どういう形式でプロンプト渡せばいいのかも毎回迷っていたので、このように複雑さを抽象化してくれるのは嬉しいです。
ストリーミング
チャットモデルはRunnableであるため、非同期およびストリーミングモードの呼び出しを含む標準インターフェースを公開しています。これにより、チャットモデルから個々のトークンをストリーミングすることができます:
for token in model.stream(messages):
print(token.content, end="|")
|こんにちは|!||
ストリーミングチャットモデルの出力に関する詳細は、このガイドで確認できます。
プロンプトテンプレート
現在、メッセージのリストを直接言語モデルに渡しています。このメッセージのリストはどこから来るのでしょうか?通常、これはユーザー入力とアプリケーションロジックの組み合わせから構築されます。このアプリケーションロジックは通常、生のユーザー入力を取り、それを言語モデルに渡す準備ができたメッセージのリストに変換します。一般的な変換には、システムメッセージの追加やユーザー入力を使用したテンプレートのフォーマットが含まれます。
プロンプトテンプレートは、この変換を支援するためにLangChainで設計された概念です。これらは生のユーザー入力を受け取り、言語モデルに渡す準備ができたデータ(プロンプト)を返します。
ここでプロンプトテンプレートを作成しましょう。これは2つのユーザー変数を受け取ります:
-
language
: 翻訳する言語 -
text
: 翻訳するテキスト
from langchain_core.prompts import ChatPromptTemplate
system_template = "以下を英語から {language} に翻訳して"
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)
APIリファレンス: ChatPromptTemplate
ChatPromptTemplateは、単一のテンプレートで複数のメッセージロールをサポートしていることに注意してください。システムメッセージにlanguage
パラメータをフォーマットし、ユーザーメッセージにユーザーのテキストをフォーマットします。
このプロンプトテンプレートへの入力はディクショナリーです。このプロンプトテンプレートを単独で操作して、何ができるかを確認できます。
prompt = prompt_template.invoke({"language": "日本語", "text": "hi!"})
# ChatPromptValueを確認
prompt
ChatPromptValue(messages=[SystemMessage(content='以下を英語から 日本語 に翻訳して', additional_kwargs={}, response_metadata={}), HumanMessage(content='hi!', additional_kwargs={}, response_metadata={})])
2つのメッセージで構成されるChatPromptValue
が返されることがわかります。メッセージに直接アクセスしたい場合は、次のようにします:
prompt.to_messages()
[SystemMessage(content='以下を英語から 日本語 に翻訳して', additional_kwargs={}, response_metadata={}),
HumanMessage(content='hi!', additional_kwargs={}, response_metadata={})]
最後に、フォーマットされたプロンプトでチャットモデルを呼び出すことができます:
response = model.invoke(prompt)
print(response.content)
こんにちは!
まとめ
以上です!このチュートリアルでは、最初のシンプルなLLMアプリケーションの作成方法を学びました。言語モデルの操作方法、プロンプトテンプレートの作成方法、LangSmithを使用して作成したアプリケーションの優れた可観測性を得る方法を学びました。
これは、熟練したAIエンジニアになるために学ぶべきことのほんの一部に過ぎません。幸いなことに、他にも多くのリソースがあります!
LangChainのコアコンセプトについてさらに読みたい場合は、詳細なコンセプトガイドがあります。
これらのコンセプトに関して具体的な質問がある場合は、ハウツーガイドの以下のセクションをチェックしてください:
こちらに続きます。