50代ITエンジニアが学ぶLangChainその2 - シンプルなLLMアプリケーションの構築

こちらの続きです。前回は言語モデル(LM)を呼び出しただけでしたが、今回はプロンプトテンプレートを用いて、プロンプト作成を効率化します

https://qiita.com/taka_yayoi/items/22ccfeea661820375455

ノートブックです。

https://github.com/taka-yayoi/langchain_tutorial/blob/main/2.%20%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AALLM%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%A7%8B%E7%AF%89.ipynb

# チャットモデルとプロンプトテンプレートを使用してシンプルなLLMアプリケーションを構築する

[Build a simple LLM application with chat models and prompt templates \| 🦜️🔗 LangChain](https://python.langchain.com/docs/tutorials/llm_chain/)

このクイックスタートでは、LangChainを使用してシンプルなLLMアプリケーションを構築する方法を紹介します。このアプリケーションは、英語のテキストを他の言語に翻訳します。これは比較的シンプルなLLMアプリケーションで、単一のLLM呼び出しといくつかのプロンプトだけです。それでも、LangChainを始めるには素晴らしい方法です。いくつかのプロンプトとLLM呼び出しだけで多くの機能を構築できます！

このチュートリアルを読んだ後、次のことについての概要を理解できます：

- [言語モデル](https://python.langchain.com/docs/concepts/chat_models/)の使用
- [プロンプトテンプレート](https://python.langchain.com/docs/concepts/prompt_templates/)の使用
- [LangSmith](https://docs.smith.langchain.com/)を使用したアプリケーションのデバッグとトレース(今回はMLflow Tracingを使います)

さあ、始めましょう！

ここからは、MLflow Tracingをきちんと活用したいので、最新バージョンにして明示的にTracingを有効化します。

```py
%pip install -qU langchain[openai] databricks-langchain mlflow
%restart_python
```

```py
import mlflow

# MLflow Tracingの有効化
mlflow.langchain.autolog()
```


```py
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")
```

## 言語モデルの利用

まず、言語モデル(Language Model:LM)を単独で使用する方法を学びましょう。LangChainは、多くの異なる言語モデルをサポートしており、それらを相互に交換して使用できます。特定のモデルの使用を開始するための詳細については、[サポートされているインテグレーション](https://python.langchain.com/docs/integrations/chat/)を参照してください。

```py
from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-4o-mini", model_provider="openai")
```

まず、モデルを直接使用してみましょう。[ChatModels](https://python.langchain.com/docs/concepts/chat_models/)はLangChain [Runnables](https://python.langchain.com/docs/concepts/runnables/)のインスタンスであり、それらと対話するための標準インターフェースを提供します。モデルを単純に呼び出すには、[メッセージ](https://python.langchain.com/docs/concepts/messages/)のリストを`.invoke`メソッドに渡すことができます。

```py
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}})
```
![Screenshot 2025-03-08 at 20.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c0199e81-989e-40c3-a209-6030ca458a0e.png)


**APIリファレンス:** [HumanMessage](https://python.langchain.com/api_reference/core/messages/langchain_core.messages.human.HumanMessage.html) | [SystemMessage](https://python.langchain.com/api_reference/core/messages/langchain_core.messages.system.SystemMessage.html)

ChatModelsは[メッセージ](https://python.langchain.com/docs/concepts/messages/)オブジェクトを入力として受け取り、メッセージオブジェクトを出力として生成します。メッセージオブジェクトはテキストコンテンツに加えて、会話の[役割](https://python.langchain.com/docs/concepts/messages/#role)を伝え、[ツールの呼び出し](https://python.langchain.com/docs/concepts/tool_calling/)やトークン使用量などの重要なデータを保持します。

LangChainは、文字列や[OpenAI形式](https://python.langchain.com/docs/concepts/messages/#openai-format)でのチャットモデル入力もサポートしています。以下はすべて等価です：

```py
model.invoke("Hello")

model.invoke([{"role": "user", "content": "Hello"}])

model.invoke([HumanMessage("Hello")])
```

正直、どういう形式でプロンプト渡せばいいのかも毎回迷っていたので、このように複雑さを抽象化してくれるのは嬉しいです。

## ストリーミング

チャットモデルは[Runnable](https://python.langchain.com/docs/concepts/runnables/)であるため、非同期およびストリーミングモードの呼び出しを含む標準インターフェースを公開しています。これにより、チャットモデルから個々のトークンをストリーミングすることができます：

```py
for token in model.stream(messages):
    print(token.content, end="|")
```
```
|こんにちは|！||
```

ストリーミングチャットモデルの出力に関する詳細は、[このガイド](https://python.langchain.com/docs/how_to/chat_streaming/)で確認できます。

## プロンプトテンプレート

現在、メッセージのリストを直接言語モデルに渡しています。このメッセージのリストはどこから来るのでしょうか？通常、これはユーザー入力とアプリケーションロジックの組み合わせから構築されます。このアプリケーションロジックは通常、生のユーザー入力を取り、それを言語モデルに渡す準備ができたメッセージのリストに変換します。一般的な変換には、システムメッセージの追加やユーザー入力を使用したテンプレートのフォーマットが含まれます。

[プロンプトテンプレート](https://python.langchain.com/docs/concepts/prompt_templates/)は、この変換を支援するためにLangChainで設計された概念です。これらは生のユーザー入力を受け取り、言語モデルに渡す準備ができたデータ（プロンプト）を返します。

ここでプロンプトテンプレートを作成しましょう。これは2つのユーザー変数を受け取ります：

- `language`: 翻訳する言語
- `text`: 翻訳するテキスト

```py
from langchain_core.prompts import ChatPromptTemplate

system_template = "以下を英語から {language} に翻訳して"

prompt_template = ChatPromptTemplate.from_messages(
    [("system", system_template), ("user", "{text}")]
)
```

**APIリファレンス:** [ChatPromptTemplate](https://python.langchain.com/api_reference/core/prompts/langchain_core.prompts.chat.ChatPromptTemplate.html)

ChatPromptTemplateは、単一のテンプレートで複数の[メッセージロール](https://python.langchain.com/docs/concepts/messages/#role)をサポートしていることに注意してください。システムメッセージに`language`パラメータをフォーマットし、ユーザーメッセージにユーザーのテキストをフォーマットします。

このプロンプトテンプレートへの入力はディクショナリーです。このプロンプトテンプレートを単独で操作して、何ができるかを確認できます。

```py
prompt = prompt_template.invoke({"language": "日本語", "text": "hi!"})
# ChatPromptValueを確認
prompt
```
```
ChatPromptValue(messages=[SystemMessage(content='以下を英語から 日本語 に翻訳して', additional_kwargs={}, response_metadata={}), HumanMessage(content='hi!', additional_kwargs={}, response_metadata={})])
```
![Screenshot 2025-03-08 at 20.14.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/81651f5f-7e90-4209-90a3-fef239085929.png)

2つのメッセージで構成される`ChatPromptValue`が返されることがわかります。メッセージに直接アクセスしたい場合は、次のようにします:

```py
prompt.to_messages()
```
```
[SystemMessage(content='以下を英語から 日本語 に翻訳して', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='hi!', additional_kwargs={}, response_metadata={})]
```

最後に、フォーマットされたプロンプトでチャットモデルを呼び出すことができます:

```py
response = model.invoke(prompt)
print(response.content)
```
```
こんにちは！
```
![Screenshot 2025-03-08 at 20.15.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/17e73db0-b82b-4cf1-aef9-4abbabc5cacd.png)

## まとめ

以上です！このチュートリアルでは、最初のシンプルなLLMアプリケーションの作成方法を学びました。言語モデルの操作方法、プロンプトテンプレートの作成方法、LangSmithを使用して作成したアプリケーションの優れた可観測性を得る方法を学びました。

これは、熟練したAIエンジニアになるために学ぶべきことのほんの一部に過ぎません。幸いなことに、他にも多くのリソースがあります！

LangChainのコアコンセプトについてさらに読みたい場合は、詳細な[コンセプトガイド](https://python.langchain.com/docs/concepts/)があります。

これらのコンセプトに関して具体的な質問がある場合は、ハウツーガイドの以下のセクションをチェックしてください:

- [Chat models](https://python.langchain.com/docs/how_to/#chat-models)
- [Prompt templates](https://python.langchain.com/docs/how_to/#prompt-templates)

こちらに続きます。

https://qiita.com/taka_yayoi/items/2e899f9c5e840ada8cc1

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)