LangChainのPrompt Templates入門: 効率的にLLMを活用する秘訣

### LangChainのPrompt Templates入門: 効率的にLLMを活用する秘訣

------

### はじめに

「AIモデルに質問を投げかけても、毎回異なる応答が返ってくる…」
 「一貫した出力を得るためのプロンプト設計が難しい…」
 そんな悩みを解決するのが**LangChainのPrompt Templates**です。

この記事では、以下を学びます：

- **Prompt Templates**の基礎とその必要性
- 実際のPythonコードを使った活用方法
- ChatPromptTemplateとの違いと応用例



また、LLMについてですがollamaの環境で行います。


![image-20241209133330180.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/54bbb932-6f28-9147-717d-6eb10c9b74c4.png)


**今回のチュートリアルの説明範囲**

## 参考資料

https://qiita.com/kotai2003/items/4a4dd796d8f76e8a939e

------

### 1. Prompt Templatesとは？

Prompt Templatesは、LLMに渡す入力を**テンプレート化**する仕組みです。以下のような場面で役立ちます：

- **柔軟性**: 同じテンプレートに異なる入力を与えるだけで使い回せる。
- **一貫性**: プロンプト設計を統一し、出力の質を安定化。
- **効率化**: 短いコードで強力なプロンプトを作成可能。

#### ユースケース例

- カスタマーサポートでの動的な応答生成
- 商品説明やレコメンデーションの自動生成
- データ分析の自動化（例: 質問応答システム）

------

### 2. 基本的なPrompt Templatesの使い方

以下は、ユーザー名を使ったシンプルな例です。

```python
from langchain.prompts import PromptTemplate

# Prompt Templateの作成
prompt = PromptTemplate(
    input_variables=["name"],
    template="こんにちは、{name}さん！今日はどんなお手伝いができますか？"
)

# テンプレートに値を挿入
formatted_prompt = prompt.format(name="太郎")
print(formatted_prompt)
```

#### 出力例

```
こんにちは、太郎さん！今日はどんなお手伝いができますか？
```

これをLLMと組み合わせると、柔軟でパワフルなプロンプトを生成できます。

```python
from langchain.llms import OpenAI

llm = OpenAI(model="gpt-3.5-turbo")
response = llm(formatted_prompt)
print(response)
```

------

### 3. ChatPromptTemplateの使い方

チャット形式のプロンプトを扱いたい場合は、**ChatPromptTemplate**を使います。このテンプレートでは、複数のロール（system, human, assistant）を持つことができます。

#### 使用例: チャット形式のプロンプト

```python
from langchain.prompts.chat import ChatPromptTemplate

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたは歴史の専門家です。"),
    ("human", "ピラミッドについて教えてください。")
])

formatted_prompt = chat_prompt.format_messages()
print(formatted_prompt)

```

#### 出力例

```
[SystemMessage(content='あなたは歴史の専門家です。', additional_kwargs={}, response_metadata={}), HumanMessage(content='ピラミッドについて教えてください。', additional_kwargs={}, response_metadata={})]
```

このように、複雑な対話構造も簡単に構築できます。

------

### 4. PromptTemplate vs ChatPromptTemplate

| **特徴**         | **PromptTemplate**       | **ChatPromptTemplate**                     |
| ---------------- | ------------------------ | ------------------------------------------ |
| **主な用途**     | 単純な質問応答や命令生成 | 対話型アプリケーション                     |
| **ロールの有無** | ロールは不要             | `system`, `human`, `assistant`ロールが必要 |
| **ユースケース** | 簡易タスクや一括処理     | チャットボットや複雑な対話型アプリ         |

#### なぜChatPromptTemplateにロールがあるのか？

ChatPromptTemplateは、モデルが文脈を理解しやすくするために設計されています。特に、以下のような場面で有効です：

- **system**: モデルの振る舞いを設定（例: 優しい口調や専門的な回答）。
- **human**: ユーザーの質問や命令を指定。
- **assistant**: モデルが出力する応答を定義。

------

### 5. 応用例: 実践的な使い方

最後に、実際のプロジェクトでどのように活用できるかを示します。

#### 商品説明生成

```python
from langchain.prompts import PromptTemplate
from langchain_ollama.llms import OllamaLLM

# MODEL
model = OllamaLLM(model="llama3.2")

# Prompt Templateの作成
prompt = PromptTemplate(
    input_variables=["product_name", "features"],
    template="商品名: {product_name}\n特徴: {features}\nこの商品のセールスポイントを教えてください。"
)

# テンプレートに値を挿入
formatted_prompt = prompt.format(
    product_name="AIノートPC",
    features="高性能バッテリー、軽量設計、タッチスクリーン対応"
)


response = model.invoke(formatted_prompt)
print(response)
```

#### 出力例

```bash
このAIノートPCのセールスポイントは以下の点にわたっています。

1.  **高性能バッテリー**：このノートPCには、長時間使用可能な高-performance バッテリーが搭載されています。ユーザーは長い thời gianを無制限で使用できるようになります。
2.  **軽量設計**：ノートPCの全体的な重量は軽いことになるため、長時間持ち運ぶことができ、手荷物やバッグに収まるので便利です。
3.  **タッチスクリーン対応**：このAIノートPCにはタッチスクリーンが搭載されています。これにより、ユーザーは多くのアプリケーションの操作をタブレット-like の体験できるようになります。

これらの特徴は、一般的なノートPCよりも優れたperformanceとmobilityを提供します。
```



#### 質問応答システム

```python
from langchain.prompts.chat import ChatPromptTemplate
from langchain_ollama.llms import OllamaLLM

# MODEL
model = OllamaLLM(model="llama3.2")

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたはカスタマーサポート担当です。"),
    ("human", "{user_query}")
])

formatted_prompt = chat_prompt.format_messages(user_query="返品したい場合の手続きを教えてください。")

response = model.invoke(formatted_prompt)
print(response)
```



#### 出力例

```bash
お客様は product を返品したいと思っており、ご案内します。

まず、返品の理由と商品の状態（新品か改造など）に関する確認が必要です。返品の理由は、以下の場合に適用されます。

- 商品が破損や傷害しています。
- 商品に問題があるかつ修理が不可能です。
- 商品が正確なものではないか、商品の説明書きと差別があります。

また、商品は新品であるか、改造したものか確認する必要があります。改造された商品を返品することはできません。

その後、返品の手続きを実行してください。以下の手順でお願いします。

1.  returns form を印刷またはダウンロードし、必要な情報を入力します。
2.  product のパッケージ内のカートリーチューム（カウチカバー）やラベルからパズルを解いて商品のコードを入力します。
3.  カウチカバーのシールを剥がって、商品の本体にシールを貼ります。
4.  returns form と商品の本体に必要な情報を記載し、送信します。

この手続きは必ず実行することで、返品の受付を受けることができます。ただし、返品の場合、商品が正確なものであるか、改造されたものではないか確認する必要があります。

返品の場合、商品が正確で、無傷であることを確認してください。改造した商品や破損した商品を返品すると、返金額が減少します。

また、返品に伴う費用は、以下のようなものがあります。

- Returns form の印刷コスト
- 実際に送信されるコスト

必要な情報を記載して、お客様のご質問にお答えするまで、ご協力ください。
```



------

### 6. 次のステップ

Prompt Templatesを使いこなせたら、次は以下を試してみてください：

- **出力パーサー**: LLMの応答をJSON形式などの構造化データに変換。
- **複数のチェーンの連結**: LangChainのチェーン機能を使って複雑なタスクを自動化。

LangChainを使ったアプリケーション開発のアイデアが広がります！

## 参考資料

https://qiita.com/kotai2003/items/4a4dd796d8f76e8a939e