LangChainを使ってWebの最新情報をGPT-3.5に回答させてみた

## はじめに
LangChainを使ってWebの最新情報をGPT-3.5に回答させてみました。
LangChainを使ってGPTにWebの最新情報を回答させてみたい方におすすめです。

## 開発環境
- Windows 11
- Python 3.11.0
- OpenAI
- LangChain
- Google Custum Search
- Google Programmable Search Engine


## 実装
### 必要なライブラリのインストール
以下のコマンドでOpenAI、LangChain、Google検索エンジンのライブラリをインストールします。
```
pip install openai langchain google-api-python-client
```

### Google Custom SearchのAPIキーの設定
[Google Cloud credential console](https://console.cloud.google.com/apis/credentials)にアクセスし、「プロジェクトを作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/64b4b7d5-046a-d0a8-8db0-4f4664aeab38.png)
　　
プロジェクト名を入力し、場所は「組織なし」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/3b67183a-af24-bf7a-9e96-38b08fea8d6e.png)
　　
サイドバーの「APIとサービス」から、「ライブラリ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/f5b77df2-04f0-b6e1-33e2-e747657aebf4.png)
　　
検索バーで「custom search api」を検索します。予測変換で出てくるので、全て入力しなくても大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/23096a61-7e07-c943-259b-c6e7b34ea0ff.png)
　　
検索結果から、Custum Search APIを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/b8f7928b-51bc-241e-8daf-d48c57528fc4.png)
　　
「有効にする」を選択し、APIを有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/e652fb76-d732-3feb-765f-e51fc465cae1.png)
　　
「認証情報」から「APIキー」を選択し、APIキーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/5e958ac5-9b6b-60f9-8723-64839ca39544.png)
　　
APIキーをコピーしてメモした後、「APIキーを編集」へのリンクを選択します。

![記事投稿用 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/50780267-e5ee-d3ce-773f-d634ba86640c.png)
　　
「アプリケーションの制限の設定」で、「IPアドレス」を選択し、「IPアドレスの制限」の「ADD」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/3387b679-23b7-6b18-4a41-d5b63cc1bdd4.png)
　　
同じIPアドレスを使っている人のみにAPIキーの使用を許可します。
自分が使っているIPアドレスは [こちら](https://www.cman.jp/network/support/go_access.cgi) で確認ができます。

![記事投稿用 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/6348db89-2d8f-66e2-686b-e2c2c6ff413d.png)
　　
次に、「APIの制限」の「キーを制限」から、「Custum Search API」を選択し、「保存」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/7d072842-1c36-2ab3-bbd0-379e9c8b4087.png)

これで、Google Custom SearchのAPIキーの設定は完了です。

### Googleの検索エンジンIDの取得
[Programmable Search Engine](https://programmablesearchengine.google.com/controlpanel/create)にアクセスし、「検索エンジン名」を入力、検索の対象は「ウェブ全体を検索」を選択し、ロボットではないことを証明した後、「作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/6c7cf14c-ecd6-5747-2dad-26878a8c638a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/c005053c-8345-b0c8-a65a-0b1f3e326800.png)
　　
「すべての検索エンジン」から、作成した検索エンジンを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/d067a058-765e-ff23-d78a-8bf2726cd9ab.png)
　　
検索エンジンIDをコピーしてメモします。

![記事投稿用 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/41a32349-363d-49ea-2d93-3c436442e03c.png)

### 環境変数の設定
ここからは、Pythonファイルに記述していきます。
以下のAPIキーやIDを利用するコードを記述します。
```test.py
import os
os.environ["OPENAI_API_KEY"] = "[OpenAIのAPIキー]"
os.environ["GOOGLE_API_KEY"] = "[Google Custom SearchのAPIキー]"
os.environ["GOOGLE_CSE_ID"] = "Googleの検索エンジンID"
```

### ライブラリのインポート
使用するライブラリをインポートします。
```test.py
from langchain.llms import OpenAI
from langchain.agents import load_tools
from langchain.agents import initialize_agent
```

### LLMの設定
使用するLLMの設定をします。
```test.py
llm = OpenAI(model_name="gpt-3.5-turbo")
tools = load_tools(["google-search"], llm=llm)
```

### Agentの作成
Agentを作成します。
```test.py
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
agent.run("初代M1グランプリの優勝者は？")
```
zero-shot-react-descriptionは、指定されたtool(ここではgoogle-search)を使うかどうかをLLMが推論し、使うべきであればtoolを使用して解答が返されます。
verboseをTrueにすることで、推論の過程がログに出力されます。
agent.runの中身は質問内容です。今回は通常のChatGPTが知らないと思われる「初代M1グランプリの優勝者は？」という質問にしました。

## 結果
まずは、通常のChatGPTに同じ質問をしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/dca26dd2-f757-85f3-f491-b1844f32d46e.png)

初代M1グランプリの優勝者は、[中川家](https://www.m-1gp.com/history/#grandprix_2001)なので、不正解です。2022年1月以前の情報であっても、知らない情報は存在するようです。
　　
続いて、先ほどのPythonファイルを実行します。1回目の検索では特定できなかったようですが、2回目の検索で「中川家」を「Final Answer」として回答してくれました。正解です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/a141f120-81c4-3368-166d-bfded704ad38.png)


このように、知らない情報であれば、google-searchを使って正確な情報を回答してくれることが確認できました！

## おわりに
LangChainを使ってWebの最新情報をGPT-3.5に回答させてみました。
LangChainを使うことで、通常のGPT-3.5の学習範囲を超えた回答が可能になるので、ぜひ活用してみてください。

最後まで読んでいただき、ありがとうございました！

記事に関する質問等ございましたら、コメントまたは以下のDMにてよろしくお願いします！

https://twitter.com/t___tatsuki

## 参考文献

https://murasan-net.com/index.php/2023/04/03/chatgpt-langchain-web-newinfo/

https://www.system-exe.co.jp/kotohajime15/

https://python.langchain.com/docs/integrations/tools/google_search

https://webrandum.net/google-maps-api-local-restriction/

https://python.langchain.com/docs/modules/agents/agent_types/