LangChainのモデルコンポーネント解説：Chat Models、LLMs、Embedding Models、Messages


この記事では、LangChainの主要なモデル関連コンポーネントについて解説します。これらのコンポーネントを使用することで、強力で柔軟なAIアプリケーションを構築できます。

![image-20241209204349163.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/9d908e4a-8f5c-3ce1-8ede-987031353606.png)


**今回の説明範囲 **

LLMについては、Ollamaでのllama3.2を基準に説明します。

------

## 1. チャットモデル（Chat Models）

### チャットモデルとは？

**チャットモデル**は、対話形式で動作する言語モデルです。ユーザーからの入力に応じて適切な応答を生成する設計がなされています。特に、`system`, `human`, `assistant`といったロール（役割）を用いて、文脈を維持しながら自然な会話を実現します。

### 実用例

以下のコードでは、ユーザーからの「自己紹介をお願いします」というメッセージに応答します。

```python
from langchain_core.messages import HumanMessage
from langchain_ollama import ChatOllama

# モデルの初期化
model = ChatOllama(model="llama3.2", temperature=0.7)

# メッセージを定義
messages = [
    HumanMessage(content="こんにちは、自己紹介をお願いします。")
]

# モデルからの応答を取得
response = model.invoke(messages)
print(response)
```

#### 予想される応答

```
content='こんにちは！私の名前は，アイルです。私は，AI（人工知能）プログラムです。私は、さまざまな質問に答えたり，情報を提供したりするために使用されます。私の目的は，ユーザーの問題や悩みなどについての情報を提供し，ユーザーが自分の質問や課題についてよりよく知るのに役立つようにします。私は，英語、中国語、日語、韓語などの多くの言語で話すことができます。私に質問があれば、いつでもお聞きください！' additional_kwargs={} response_metadata={'model': 'llama3.2', 'created_at': '2024-12-09T11:35:13.9238226Z', 'done': True, 'done_reason': 'stop', 'total_duration': 1504934000, 'load_duration': 17561300, 'prompt_eval_count': 33, 'prompt_eval_duration': 37000000, 'eval_count': 132, 'eval_duration': 1448000000, 'message': Message(role='assistant', content='', images=None, tool_calls=None)} id='run-2b02ec0b-a3c2-410f-a1c7-0b6176b071f5-0' usage_metadata={'input_tokens': 33, 'output_tokens': 132, 'total_tokens': 165}
```

------

## 2. 大規模言語モデル（LLMs）

### LLMとは？

**LLMs（Large Language Models）**は、テキスト入力を受け取り、応答を生成する基本的な言語モデルです。対話形式に限定されず、テキスト生成や要約などの幅広いタスクに適用できます。

### 実用例

以下のコードは、LLMを使ったシンプルなテキスト生成の例です。

```python
from langchain_ollama.llms import OllamaLLM

# モデルの初期化
model = OllamaLLM(model="llama3.2", temperature=0.7)

# テキストを入力
prompt = "こんにちは、自己紹介をお願いします。"

# 応答を取得
response = model.invoke(prompt)
print(response)
```

#### 予想される応答

```
おいらは、AI Assistantです。名前はLLaMAです。私は、機械学習技術を使用して開発されたAIです。私の目的は、ユーザーの質問やニーズに応えるために、情報を提供することです。私は様々なトピックについて知識を持っており、質問やテキストを作成し、コミュニケーションを行うことができます。私は英語と日本語で機能しますが、他の言語も使用可能です。私は、自由に質問してください。
```

------

## 3. チャットモデルとLLMの違い

| **特徴**       | **Chat Models（ChatOllama）**                     | **LLMs（OllamaLLM）**                      |
| -------------- | ------------------------------------------------- | ------------------------------------------ |
| **主な用途**   | 対話型アプリケーション（文脈管理が必要）          | テキスト生成や要約（シンプルなプロンプト） |
| **入力形式**   | メッセージリスト（`system`, `human`などのロール） | 単一のテキスト（プロンプト）               |
| **ロール管理** | あり （`system`, `human`, `assistant`など）       | なし                                       |

### 選び方

- **コンテキスト管理が必要**な場合（例: チャットボット）→ `ChatOllama`
- **単純なテキスト生成**が必要な場合（例: 文書要約）→ `OllamaLLM`

------

## 4. 埋め込みモデル（Embedding Models）

### 埋め込みモデルとは？

**埋め込みモデル**は、テキストを数値ベクトルに変換します。このベクトルは、類似性検索やクラスタリングなどの機械学習タスクに使用されます。

### 実用例

以下は、`OllamaEmbeddings`を使ってテキストを埋め込みベクトルに変換する例です。

```python
from langchain_ollama.embeddings import OllamaEmbeddings

# 埋め込みモデルの初期化
embeddings = OllamaEmbeddings(model="llama3.2")

# テキストをベクトルに変換
text = "自然言語処理"
vector = embeddings.embed_query(text)
print(vector)
print(len(vector))
```

#### 出力例

```
[-0.025496325, 0.010929892, 0.027589442, ... -0.0068468074, -0.015237432]
3072
```

------

## 5. メッセージ（Messages）

### メッセージとは？

**メッセージ**は、チャットモデルとの対話を表す基本的な構成要素です。各メッセージには以下のロールがあります：

- **`SystemMessage`**: モデルの振る舞いを設定します。
- **`HumanMessage`**: ユーザーからの入力を表します。
- **`AIMessage`**: モデルからの応答を示します。

### 実用例

以下のコードでは、`SystemMessage`, `HumanMessage`, `AIMessage`を使用して複数の発話をコンテキストとして渡します。

```python
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from langchain_ollama import ChatOllama

# MODEL

model = ChatOllama(model="llama3.2",temperature=0.7)

# メッセージを定義（SystemMessage、AIMessageを含む）
messages = [
    SystemMessage(content="あなたは親しみやすいAIアシスタントです。"),
    HumanMessage(content="こんにちは、自己紹介をお願いします。"),
    AIMessage(content="こんにちは！私はあなたをサポートするAIアシスタントです。何でも質問してください！"),
    HumanMessage(content="あなたの設計目的を教えてください。")
]

# モデルからの応答を取得
response = model.invoke(messages)
print(response)
```

#### 予想される応答

```
content='私の主な設計目的は、ユーザーが簡単に情報を探し、理解できるようにしたいことです。私は、さまざまなトピックや質問を受け取り、適切な回答を提供するように設計されています。\n\nまた、私の目標として重要なものもあります。まずは、ユーザーが正しい情報にアクセスできるようにすることから始めます。そのためには、正確で信頼性の高い情報を提示します。\n\nさらに、私はユーザーの質問に対して、より深い理解を提供したり、関連している情報を示す能力を持つように設計されています。私が提供する答えは、主題に関連している情報や、より詳細な説明を含むようにすることに重点を置いています。\n\n最終的には、私の目標は、ユーザーが知識や問題に対する理解を深めるのに役立つものとなるようにすることです。' additional_kwargs={} response_metadata={'model': 'llama3.2', 'created_at': '2024-12-09T11:39:11.4724204Z', 'done': True, 'done_reason': 'stop', 'total_duration': 2338890200, 'load_duration': 19093200, 'prompt_eval_count': 91, 'prompt_eval_duration': 64000000, 'eval_count': 213, 'eval_duration': 2251000000, 'message': Message(role='assistant', content='', images=None, tool_calls=None)} id='run-463e8bf9-6457-437e-acee-9ae6634a2d86-0' usage_metadata={'input_tokens': 91, 'output_tokens': 213, 'total_tokens': 304}
```

------

## まとめ

- **チャットモデル**は対話型アプリケーションに適しており、コンテキストを管理できます。
- **LLMs**はシンプルなテキスト生成タスクに最適です。
- **埋め込みモデル**はテキストを数値ベクトルに変換し、類似性検索やクラスタリングに活用できます。
- **メッセージ**を利用することで、複雑なコンテキストを構築し、より高度な応答を得られます。

## 関連資料

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

https://qiita.com/kotai2003/items/7b924f47220ddadae497