【LangChain入門】ReActエージェントについて学んでみた

本記事では、講座内で制作する「Ice Breaker」というアプリケーションを通して、LangChainのReActエージェントの構成や動作について、自分なりの理解をまとめてみました。

この講座ではLangChainやRAGなどの基本的な内容を扱っており、実際にコードを書くことで学ぶことができる。学ぶことができるトピックがコース概要にも記載されているので気になる方はぜひチェックしてみてください。


LangChainやRAGの基礎を実践的に学べるUdemy講座  
[LangChain - Develop LLM powered applications with LangChain](https://www.udemy.com/share/108yCa3@lhiQ_UTqXPO1C1moppyArjJRNUO6DBpN5BD2Wm8wAZ-1NF8ImhWseLhPxnQoBQmZoA==/) を受講中（現在15%ほど完了）。

---

## Ice Breaker アプリとは？

「Ice Breaker」は、指定した名前の人物に関する情報をLinkedinから取得し、その人物との会話のきっかけ（アイスブレーク）になる質問を自動生成してくれるLangChainアプリケーションです。

### 主な機能の流れ

1. 名前を入力
2. Google検索でLinkedInやTwitterプロフィールを特定
3. プロフィール情報をもとに、会話の糸口となるパーソナライズドな質問を生成

### 実際の画面

#### 入力前の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065772/f778c059-33f0-4e79-aaac-adb8235884ed.png)

#### 名前を入力した後の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065772/515e4f84-d0dd-47a9-8f19-59918e2bc5a6.png)

---

## ReActフレームワークとは？

Ice Breakerのエージェントは、LangChainの**ReAct**（Reasoning + Acting）というフレームワークに基づいて設計されています。

ReActは、「思考 → 行動 → 観察」のループを繰り返すことで、LLMの出力を論理的かつ段階的に洗練していく仕組みです。

### ReActの具体例

```text
User: ナポレオンはどこで生まれて、どうやって亡くなったの？
↓
Thought: まず出生地を調べる必要がある。
Action: 検索（"ナポレオン 生まれ"）
Observation: コルシカ島
↓
Thought: 次に死因を調べよう。
Action: 検索（"ナポレオン 死因"）
Observation: 胃がんの可能性
↓
Final Answer: ナポレオンはコルシカ島で生まれ、胃がんで亡くなった可能性があります。
```

このように、複数ステップに分けて情報収集しながら精度の高い回答を導き出せるのがReActの特徴です。

### LangChainエージェントの構成
ReActエージェントは以下のようなコンポーネントで構成されています。

| コンポーネント            | 役割                                           |
| ------------------ | ------------------------------------------------------ |
| **LLM**            | 推論と出力の主役。Thought・Actionを生成する                           |
| **PromptTemplate** | LLMに「どう考え、出力すべきか」を指示するテンプレート                           |
| **Tools**          | LLMが呼び出すことができる外部関数群（例：Google検索など）                      |
| **Agent**          | PromptとLLMのラッパー。LLMの出力を解釈して、次に使うToolを判断                |
| **AgentExecutor**  | AgentとToolsの連携を制御し、Thought→Action→Observationのループを繰り返す |


### データの流れ（簡略図）

```text
ユーザー入力
   ↓
[Agent] ←→ [Tools群]
   ↓           ↑
[AgentExecutor]
```

今回のアプリケーションでは、エージェントが名前を受け取り(ユーザー入力)、LLMがTavilyのAPIを使用し(Tool)Web検索を行います。その検索結果を指示した指針で観察させる。今回は以下のように指示した。
```
given the full name {name_of_person} I want you to get it me a link to their Linkedin profile page.
Your answer should contain only a URL
```
このエージェントは最終的にはLinkedinのプロフィールのURLを出力します。

## LangChainの「パイプライン構文（|演算子）」を使ったシンプルなチェーン構築と呼び出し

### `|` 演算子を使ったLangChainの簡易チェーン構築

LangChainでは、以下のように **`|`（パイプライン演算子）** を使うことで、複数の処理（プロンプト → LLM → 出力パーサー）を順につなげて「チェーン」を構築することができます。

```python
chain = summary_prompt_template | llm | summary_parser
```

これは以下のような意味になります

| 処理ステップ             | 説明 |
|--------------------------|------|
| `summary_prompt_template` | ユーザー入力（例：名前やプロフィール情報）を元にプロンプトを整形する |
| `llm`                     | 整形されたプロンプトを元に、大規模言語モデルが回答を生成 |
| `summary_parser`          | LLMの出力を整形・抽出するためのパーサー（構造化された辞書などに変換） |

そして以下のコードで、このチェーンを使って情報を処理します：

```python
res = chain.invoke(input={"information": linkedin_data})
```
今回のアプリケーションでは、先ほど取得したプロフィールのURLをLinkedinのAPIを使用して、詳細な情報を取得します。この情報を`summary_prompt_template` に渡し、その後 LLM で回答を生成し、最後に `summary_parser` で整形された出力を得る、という一連の処理をまとめて1行で実行しています。

---

### おわりに
今回は講座の15％程度ですが、今後はRAGやLangGraphについても学ぶので記事にしてまとめたいと思います！