🤖

Dify Community版でVector StoreとしてTiDB Serverlessを利用する

2024/06/27に公開

DifyでTiDB Serverlessを利用する

Difyのcommunity版では異なるVector Storeをサポートしており、v0.6.11では TiDB ServerlessのVector Storeもサポートされています。この記事ではDifyのVector StoreとしてTiDB Serverlessを利用し、簡単なチャットボットを作成します。

環境準備

前提事項

  • Dify Community版が正しく起動できている
  • DifyにLLM APIのAPIキーを設定済み。本記事ではAmazon Bedrockを設定済みです
  • TiDB Serverlessのサインアップ済み

TiDB Serverless (TiDB Cloudで提供されるマネージドサービスの一つ) のサインアップはこちらからできます。無料帯がありクレジットカードの登録は必要ないです。

TiDB Serverless側の準備

Difyが利用するデータベースを作っておきます。Webコンソールにログインし、対象のクラスタを開き、SQL Editorからデータベースを作成します。

CREATE DATABASE dify;

Difyの準備

現在のところ、difyでカスタムのVector Storeを利用するにはcommunity版で動かすしかないようです。クラウド版ではVector Storeの設定ができないようでした。ここではcommunity版でTiDB Serverlessを設定していきます。

difyのcommunity版を動かすまでは別の記事を書いています。そちらを参照してください。

docker-compose.yamlの修正

TiDB Serverlessの設定はコンテナの環境変数で設定します。langgenius/dify-api イメージの環境変数で設定しますが、このイメージは apiworker の2つのコンポーネントで利用されています。そのため、2箇所に指定することになります。

ひとつめ:

@@ -97,7 +97,7 @@ services:
       # if you want to use Application Default Credentials, you can leave GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64 empty.
       GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64: 'your-google-service-account-json-base64-string'
       # The type of vector store to use. Supported values are `weaviate`, `qdrant`, `milvus`, `relyt`.
-      VECTOR_STORE: weaviate
+      VECTOR_STORE: tidb_vector
       # The Weaviate endpoint URL. Only available when VECTOR_STORE is `weaviate`.
       WEAVIATE_ENDPOINT: http://weaviate:8080
       # The Weaviate API key.
@@ -136,10 +136,10 @@ services:
       PGVECTOR_PASSWORD: difyai123456
       PGVECTOR_DATABASE: dify
       # tidb vector configurations
-      TIDB_VECTOR_HOST: tidb
+      TIDB_VECTOR_HOST: <TiDB Serverlessのホスト>
       TIDB_VECTOR_PORT: 4000
-      TIDB_VECTOR_USER: xxx.root
-      TIDB_VECTOR_PASSWORD: xxxxxx
+      TIDB_VECTOR_USER: <TiDB Serverlessのユーザー名>
+      TIDB_VECTOR_PASSWORD: <TiDB Serverlessのパスワード>
       TIDB_VECTOR_DATABASE: dify
       # Chroma configuration
       CHROMA_HOST: 127.0.0.1

ふたつめ:

       # if you want to use Application Default Credentials, you can leave GOOGLE_STORAGE_SERVICE_ACCOUNT_JS
ON_BASE64 empty.
       GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64: 'your-google-service-account-json-base64-string'
       # The type of vector store to use. Supported values are `weaviate`, `qdrant`, `milvus`, `relyt`, `pgvector`.
-      VECTOR_STORE: weaviate
+      VECTOR_STORE: tidb_vector
       # The Weaviate endpoint URL. Only available when VECTOR_STORE is `weaviate`.
       WEAVIATE_ENDPOINT: http://weaviate:8080
       # The Weaviate API key.
@@ -313,10 +313,10 @@ services:
       PGVECTOR_PASSWORD: difyai123456
       PGVECTOR_DATABASE: dify
       # tidb vector configurations
-      TIDB_VECTOR_HOST: tidb
+      TIDB_VECTOR_HOST: <TiDB Serverlessのホスト>
       TIDB_VECTOR_PORT: 4000
-      TIDB_VECTOR_USER: xxx.root
-      TIDB_VECTOR_PASSWORD: xxxxxx
+      TIDB_VECTOR_USER: <TiDB Serverlessのユーザー名>
+      TIDB_VECTOR_PASSWORD: <TiDB Serverlessのパスワード>
       TIDB_VECTOR_DATABASE: dify
       # Chroma configuration
       CHROMA_HOST: 127.0.0.1

Vector Storeとして tidb_vector を指定、その後にTiDBの接続のための情報を指定しています。Vector Storeは世の中に数多く存在するため、対応するVector Storeが多くなってくるとUIから設定できるようになるのではないかと思いますが、現在のところはこの形で設定するようです。

これで準備は完了です。一度 docker compose restart でコンテナを再起動しておきます。

簡単なチャットボットの作成

サンプルとして、RAGを使った簡単なチャットボットを作成します。ドメイン固有の知見を答えられるのがRAGのメリットなので、ドメイン固有知識として私がqiitaで書いた tiup playgroundの記事 をデータソースにしてみます。

Dify:ナレッジの設定

DifyでRAGのソースを作成するには、UIからナレッジを選択します。ナレッジの画面にある、知識を作成からスタートします。今回はウェブサイトのデータを取得するので、ウェブサイトを選択します。

ウェブサイトの取得には、標準でFirecrawlを利用します。こちらのサインアップをしてAPI Keyを取得、設定しておきます。(取得方法等は割愛します)

ウェブサイトのURLを指定して一度Runをしてリンクの取得を行います。今回は簡単のためブログ本体のみに絞ります。

次のテキストの前処理とクリーニングは、デフォルトの選択のままで保存して処理を行います。
クローリング&Embeddingが始まり、しばらくすると利用可能になります。

検索テスト からテストしてみると、結果が返ってくるのがわかります。

Dify:ワークフローの設定

では、このナレッジを使ったチャットボットを作成します。Difyにはすぐに使えるテンプレートがあり、丁度利用できるテンプレートがあるのでそれを利用します。探索メニューを開いて、Knowledge Retrieval + Chatbotを選択し、ワークスペースに追加します。

ワークフローの Knowledge Retrieval ノードを開いて、先ほど作成した知識をセットします。

最後に、LLMノードのモデルを変更して終わりです。ここではClaude3-Sonnetを使っています。

実行

では実行してみます。実行からやっていきます。コマンドライン引数の説明はブログにあるので、構成を指定してオプションを聞いてみます。

おお、ちゃんと回答していますね。ただ、この質問はChatGPTもちゃんと答えることができます。

ブログ固有で書いてあることとして、データの保存のしかたがあります。tiup playground --tag で保存が可能なのですが、こちらはどうでしょうか。

正しく回答できています。比較のため、ChatGPTにも聞いてみます。

--db.data-dir というオプションを使うように回答がありましたが、このようなオプションはありません。実行してもエラーになります。

まとめ

Difyを使って簡単にTiDB ServerlessのVector Storeが利用できます。Vector StoreはlangchainやllamaIndexからも簡単に利用できるのですが、DifyのUIやワークフローのテンプレートを使って簡単にLLMアプリケーションが試せるので、プロトタイプやプロンプトの開発には非常に適していると思います。
是非、一緒に使ってみてください。

Discussion