概要
Llamaindexを使用してPineconeに格納されたデータを参照した回答をGPT-4に作成させます。今回は、Slack Botを利用した回答生成(チャットボット)機能・テキストデータ投入機能・テキストデータ取得機能・テキストデータ削除機能を実装しました。
- Llamaindex: LLMアプリケーションがプライベートデータまたはドメイン固有のデータを取り込み、構造化し、アクセスするためのデータフレームワークです。(→GPTの機能を拡張してくれます。)
- Pinecone: ベクトルデータベースです。外部からの質問を受け付けたLlamaindexが回答を生成するためにこのデータベースを参照し、セマンティック検索(=意味検索)を行います。
コードはGitHubで公開しています。
全体構造
- 回答生成(Slack):
- (トリガー)Slack Botへのメンション付きメッセージが送信される
- Slackメッセージを含むHTTPリクエストがAPI Gateway経由でLambdaに送信される
- HTTPリクエストのpathからAccessibility ID、パラメータからメッセージを取得する
- Llamaindexを使用してPineconeからAccessibility IDを基に取得したデータでクエリエンジンを作成する
- クエリエンジンの引数としてSlackメッセージを引き渡し、回答を生成する
- Slack API経由で回答を送信する
- データ投入
- API Gatewayに対してPOSTリクエストが送信される
- API Gateway経由でLamabdaがLlamaindexを利用してPineconeにデータを投入する(→返り値としてPineconeのデータIDを返す)
- データIDとその他のデータをペアにしてDynamoDBに格納する
- データ取得
- API Gatewayに対してGETリクエストが送信される
- API Gateway経由でLamabda内の関数が実行されDynamoDBに登録されたIDデータを参照する
- 取得したIDデータをもとにPineconeにGETリクエストを送信して詳細データを取得する
- データ削除
- API Gatewayに対してDELETEリクエストが送信される
- API Gateway経由でLamabda内の関数が実行されDynamoDBに登録されたIDデータを参照する
- 取得したIDデータをもとにPineconeにDELETEリクエストを送信して該当データを削除する
使用方法
このアプリケーションでは大きく4つの機能を提供しております。4機能ともAPIへのHTTPリクエストで実行可能です。また、一部はローカル実行も可能にしています。
①テキストデータ取得機能
②テキストデータ投入機能
③回答生成(チャットボット)機能
④テキストデータ削除機能
(ここでテキストデータとはチャットボットが回答生成の際に参照するテキストデータのことです。)
以下がHTTPリクエストのパスとパラーメーターです。
Method | Endpoint | Description | Required Parameters |
---|---|---|---|
GET | /vector-data-list | ①テキストデータ取得機能 | |
POST | /store-article/{accessibilityIds} | ②テキストデータ投入機能 | - title: 投入するテキストデータのタイトル - text: 投入するテキストデータ |
POST | /chat/{accessibilityIds} | ③回答生成(チャットボット)機能 | - chat_content: クエリする質問文 |
DELETE | /vector-data | ④テキストデータ削除機能 | - category_id: テキストデータを一意に特定するID |
POST | /slack-chat | ②テキストデータ投入機能(Slack実行版) | |
POST | /slack-chat/{accessibilityIds} | ②テキストデータ投入機能(Slack実行版) |
以下では一部の機能についてもう少し詳細に解説します。
回答生成(チャットボット)機能
HTTPリクエスト(Slack)で実行する場合
-
Slack Botを作成し、Event SubscriptionsでRequest URL(API Gatewayで生成)を登録する。(「Verified✔️」と表示されれば登録完了です。トリガーとなるイベントを設定しておくことで、特定のイベント発生時に登録したURLにHTTPリクエストが送信されます。)
-
作成したSlack Botにメンション付きメッセージを送信する。
ローカル環境で実行する場合
-
Dockerを起動する
$ docker compose up -d --build $ docker compose exec app bash
-
mainを実行する
$ python main.py {accessibility_id}
-
CLI上でChatbotが使用可能になります。
テキストデータ投入機能
HTTPリクエストで実行する場合
$ curl -X POST
-H "Content-Type: application/json"
-d '{"title": "ハプスブルク家", "text": "中世以来、神聖ローマ皇帝位を継承した有力な家系。スイスの地方領主から出発し、オーストリアに侵出、ドイツ王の地位を兼ね、ネーデルラント、ブルゴーニュ、スペイン、ボヘミア、ハンガリーなどヨーロッパの広大な領土の他、新大陸にも支配地を持った。"}'
https://xxxxx/store-article/{accessibilityIds}
ローカル環境で実行する場合
-
Dockerを起動する
$ docker compose up -d --build $ docker compose exec app bash
-
file_loaderを実行する
$ python file_loader.py {accessibilityId}
-
root/data
の配下に設置されているテキストファイルが読み込まれます。
データ取得
HTTPリクエストで実行する場合
$ curl -X POST
-H "Content-Type: application/json"
https://xxxxx/vector-data-list
デプロイ
このアプリケーションはAWS・OpenAI API・Pinecone・Slack APIを使用しています。それぞれの設定方法について解説します。
AWS
-
ECR
: Docker imageを保存するサービスです。保存されたDocker imageはLambdaから立ち上げられます。 -
Lambda
: 特定の条件をもとに関数を実行することのできるサービスです。今回はAPI Gatewayによって実行されます。 -
API Gateway
: URLを発行し、そのURLへのアクセスを処理することのできるサービスです。 -
DynamoDB
: キーバリューストアを提供するサービスです。※
vectordb-based_gpt/vectordb-based_gpt/article/article_model.py
を実行することでDynamoDB上に必要なテーブルを作成することが可能です。
OpenAI
https://platform.openai.com/account/api-keys
[Create new secret key] > 【任意のNameを入力】> [Create secret key]
Pinecone
https://app.pinecone.io/
[Indexes] > [+ Create Index] > 【任意のNameを入力】> 【Dimensionsに”1536”を入力】> [Create Index]
Slack
https://api.slack.com/
[slack api] > [Create New App] > [From an app manifest]
で以下のYAMLからBotを作成する
display_information:
name: Pinecone-Based GPT-4
description: I am Pinecone-Based GPT-4👋
background_color: "#184700"
features:
bot_user:
display_name: Pinecone-Based GPT-4
always_online: false
oauth_config:
scopes:
user:
- channels:history
- channels:read
- channels:write
- chat:write
- im:read
bot:
- commands
- app_mentions:read
- channels:history
- channels:join
- channels:manage
- chat:write
- channels:read
- im:history
- im:read
- im:write
- incoming-webhook
settings:
event_subscriptions:
request_url: {API Gatewayで発行したURL}
bot_events:
- app_mention
org_deploy_enabled: false
socket_mode_enabled: false
token_rotation_enabled: false
環境変数
実行環境としてローカル(Docker)とAWSを使用した環境を選択することが可能です。それぞれの実行時には環境変数として以下のものが必要になります。
- ローカル(.envに登録)
- OPENAI_API_KEY
- PINECONE_API_KEY
- PINECONE_ENVIRONMENT
- PINECONE_INDEX_NAME
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS(Lambdaに登録)
- OPENAI_API_KEY
- PINECONE_API_KEY
- PINECONE_ENVIRONMENT
- PINECONE_INDEX_NAME
- SLACK_BOT_TOKEN
- TRANSFORMERS_CACHE: /tmp/home/sbx_user1051/.cache/huggingface/hubを登録
まとめ(+ 今後の課題)
今回はLlamaindexを使用してDBに保存したドキュメントデータを基に回答を生成するチャットボット及びチャットボットの参照データ管理機能を開発しました。また、業務で利用することを想定し、チャットボットの回答内容をコントロールできる様にAccessibilityIDというものを実装し、チャットボットが回答生成時に参照するデータ範囲を管理できる様にしました。
下図(例として銀行業務を使用しています。)のように多くの業務現場ではユーザーによって回答内容を変える必要があるためです。
今回の実装ではAccessibilityIDをPinecone上でnamespaceとして扱うことで、データを分割しています。ただ、データの仕切りとしてはPineconeのmetadata_filterを使うのが適切だったなの感じています。今回はLlamaindex内にその様な機能がなかったので実装できませんでした。
また、全体を通して「Using LlamaIndex with Pinecone」を参照しましたが、こちらのページではComposableGraphの使用が紹介されていました。ComposableGraphはクエリエンジンを作成するためのインデックスを複合的に利用することができる(ComposableGraphを使用しない場合は1クエリエンジンに対して使用できるインデックスが1つ)というものです。参照データの範囲をコントロールするという観点では有用に感じられましたが日本語だとやや回答精度が落ちるので使用はしませんでした。
今後はLlamaindexのようなライブラリを自分でアレンジしてもっと効率的な検索方法を実装したいと考えています。また、業務で使用する観点で実装をしたものの現時点での活用は一部にとどまっているので、業務での運用観点で更なる改善を進めていきたいです。
最後までお読みいただきありがとうございます。🙏