🤖

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

に公開

はじめに

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

環境準備

前提事項

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

DifyのCommunity版はローカルで起動しても、EC2などで起動しても構いません。

ローカルで起動するにはこちらの記事(macosです):

https://zenn.dev/articles/59ed33bc9dc55e/edit

EC2で起動するにはこちらの記事を参考にしてください:

https://zenn.dev/bohnen/articles/e75fd9eb9276bc

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

TiDB Cloud Serverless側の準備

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

CREATE DATABASE dify;

右上の矢印ボタンか、Command(Alt)+Enterで実行できます。SHOW DATABASESで、作成できたことを確認します。

SHOW DATABASES;

また、後続の手順で利用するので、TiDB Cloud Serverlessへの接続情報を取得しておきましょう。
Webコンソールから 「Connect」 を選択します。
初めて表示する場合は、パスワードが設定されていません。「Generate Password」 ボタンを押して、パスワードを生成してください。

画面下部に表示されている情報から、HOST USERNAME PASSWORD をメモしておきます。次のステップでDifyの環境変数にこれらを設定します。

Difyの準備

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

.env の修正

TiDB Cloud Serverlessの設定はコンテナの環境変数で設定します。difyリポジトリをgit cloneした後、dify/dockerフォルダの.envファイルを修正します。

修正箇所は2箇所で、ベクターストアとしてtidb_vectorを指定する箇所と、TiDB Cloud Serverlessの接続情報を指定する箇所です。

ひとつめ:

@@ -384,7 +384,7 @@

 # The type of vector store to use.
 # Supported values are `weaviate`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `tidb`, `oracle`, `tencent`, `elasticsearch`, `elasticsearch-ja`, `analyticdb`, `couchbase`, `vikingdb`, `oceanbase`, `opengauss`, `tablestore`.
-VECTOR_STORE=weaviate
+VECTOR_STORE=tidb_vector

 # The Weaviate endpoint URL. Only available when VECTOR_STORE is `weaviate`.
 WEAVIATE_ENDPOINT=http://weaviate:8080

ふたつめ:

@@ -456,10 +457,10 @@
 ANALYTICDB_MAX_CONNECTION=5

 # TiDB vector configurations, only available when VECTOR_STORE is `tidb`
-TIDB_VECTOR_HOST=tidb
+TIDB_VECTOR_HOST=gateway01.ap-northeast-1.prod.aws.tidbcloud.com
 TIDB_VECTOR_PORT=4000
-TIDB_VECTOR_USER=
-TIDB_VECTOR_PASSWORD=
+TIDB_VECTOR_USER=<TiDB Cloud Serverless接続情報のユーザー>
+TIDB_VECTOR_PASSWORD=<TiDB Cloud Serverless接続情報のパスワード>
 TIDB_VECTOR_DATABASE=dify

これで準備は完了です。一度 sudo docker-compose down でコンテナを停止し、sudo docker-compose up -d で再起動しておきます。

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

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

こちらの記事のmarkdownをgistに公開してありますので、これをダウンロードしてナリッジにしてみましょう。

https://gist.github.com/bohnen/95378c16450e48627157a8093beb7b66

Dify:ナレッジの設定

DifyでRAGのソースを作成するには、UIからナレッジを選択します。ナレッジの画面にある、知識を作成からスタートします。今回はテキストファイルを読み込ませるので、テキストファイルから を選択します。

Step2で、チャンク設定 を少し変更します。チャンク識別子を ### にします。これはBlog記事のセクション区切りです。

インデックス方法は 高品質 のまま、埋め込みモデルに titanのv2 、Rerankモデルに amazon rerank を設定します。Rerankの結果(Top K)は 5 としておきます。

あとは 保存して処理 とすれば、ナリッジのできあがりです。ドキュメントで 利用可能 となっていれば使えます。

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

Dify:ワークフローの設定

では、このナレッジを使ったチャットボットを作成します。

  1. Difyの スタジオ メニューから、「アプリを作成する」→「最初から作成」を選びます。
  2. アプリタイプは「チャットフロー」、名前と説明は適当につけてください。

次のようなワークフローができているはずです。

まず、LLMと書いてあるブロックのモデルを、Amazon Nova(LiteでもProでも可)にします。

次に、開始ブロックとLLMブロックの間(線の上をカーソルでなぞると、「+」マークがでてきます)に、知識検索 ブロックを追加します。

知識検索 ブロックを開いて、先ほど作成した知識をセットします。

再度LLMブロックを開いて、「コンテキスト」にresultを設定し、「SYSTEM」プロンプトに、下記を設定します。

あなたは親切なアシスタントです。 以下の<context></context> XMLタグ内の情報を、
あなたの知識として使用してください。

<context>
{{#context#}}
</context> 

ユーザーへの回答時:
- わからない場合は、わからないと答えてください。
- ユーザーの質問の言語に合わせて回答してください。

最終的に次のようになっていることを確認しましょう。

おまけ: DSL

DifyはワークフローをDSLとしてExportできます。今回のワークフローをExportしたものを https://gist.github.com/bohnen/6ddde697a2037945507e7eacab0b281c に置きました。
「新規作成」→「DSLの読み込み」でこちらを読み込んでもワークフローの構築ができます。

実行

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

playgroundでtidb2台、tikv3台、pd1台で起動するオプションを教えて下さい。

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

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

playgroundでデータを消さないようにしたいのですが、どうすれば良いですか?

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

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

まとめ

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

Discussion