[Dify Knowledge Base]: これはネットワーク全体での最初のリリースになる可能性があります。さまざまな互換性の問題を解決するために、オープン ソースのナレッジ ベース Dify のデータベースを Postgresdb から MySQL に切り替えました。最終的に切り替えは成功しました。デモ用のビデオを多数作成し、研究を続けています。

1. ビデオデモのアドレス:

https://www.bilibili.com/video/BV1ni4y1Y7q2/

[Dify Knowledge Base] (4): これはネットワーク全体での最初のリリースになる可能性があります。Dify ナレッジ ベースは魔法のように Postgres データベースを MySQL データベースに変更し、データベース接続は正常に切り替えられました。登録に失敗しました。コードの変更を続ける必要があります。

2. プロセスが複雑ですが、プロジェクトのアドレスが整理されており、オープンソースがここにあります。

直接ダウンロードして実行できます:
https://gitee.com/fly-llm/dify-mysql-llm

3. このアイデアは、ORM フレームワーク sqlalchemy が使用されているため、いくつかの uuid を変更して生成するだけです。

python3の学習:
https://www.runoob.com/python3/python3-tutorial.html
公式Webサイト:
https://www.sqlalchemy.org/
他による要約:
https://wiki.masantu.com/sqlalchemy-tutorial /

データベースの切り替え、特定の操作をサポートします。

date(DATE_TRUNC('day', m.created_at AT TIME ZONE 'UTC' AT TIME ZONE :tz )) AS date, 

替换成 

date(created_at) AS date,
import uuid
数据库替换:
id = db.Column(UUID, primary_key=True, default=lambda: uuid.uuid4())

arg_dict = {
    
    'tz': account.timezone, 'app_id': app_model.id}
删除:{
    
    'tz': account.timezone, 

数据库变成:
`id` varchar(255) NOT NULL PRIMARY KEY,

ライブラリを追加: mysqlclient==2.2.1

4. mysqlデータベースにバイナリを挿入する問題を解決する

データの挿入に関する問題は、データのシリアル化によって発生します。

    raise sa_exc.PendingRollbackError(
sqlalchemy.exc.PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (MySQLdb.OperationalError) (1366, "Incorrect string value: '\\x80\\x05\\x95\\x07$\\x00...' for column 'embedding' at row 1")
[SQL: INSERT INTO embeddings (id, model_name, hash, embedding) VALUES (%s, %s, %s, %s)]
[parameters: (UUID('a4a5dc14-6a5d-4ef7-a6bd-c450a6f5dfa8'), 'text_embedding', '146c895b7f57661d6189865c50991146361cbec9ef83ba010cf08ff36543ec75', b'\x80\x05\x95\x07$\x00\x00\x00\x00\x00\x00]\x94(G\xbf`V\xcbe&\x9f\xdfG?\xa42\xb8\xac\x96RHG?\x92m\xff\x85\x92\xa75G\xbf\x9b*\xda\x80\xf5\xa2gG?\xa3\x ... (24302 characters truncated) ... cZ\x18G\xbfW1i\xd5\xd5\x12\xaeG\xbf\x921\xf2\xfa\xca\x18uG\xbf{-4\x05}\x1bcG?{\xe15\x1e\x13\x9b\x92G?\x90:K\x87"H\x98G\xbf\x8a\xceS\x9d\x94\xcf\x85e.')]

ワーカーの問題を解決するには、ファイル dify-mysql-docker-compose/dify-api/models/dataset.py を変更して、
pickle.loads を json.dumps に置き換えます。


フィールドではバイナリembedding = db.Column(db.LargeBinary, nullable=False)が使用されず、 embedding = db.Column(db.Text, nullable=False)
に置き換えられます。


    # 解决数据库插入二进制问题。直接使用 json 字符串即可。
    def set_embedding(self, embedding_data: list[float]):
        #self.embedding =  (embedding_data, protocol=pickle.HIGHEST_PROTOCOL)
        self.embedding = json.dumps(normalized_embedding)

    def get_embedding(self) -> list[float]:
        #return pickle.loads(self.embedding)
        return json.loads(self.embedding)

実行は成功しました:

[2023-12-28 14:40:07,333: DEBUG/MainProcess] Prefix dict has been built successfully.
[2023-12-28 14:40:07,387: INFO/MainProcess] Processed dataset: b76e1340-0fb3-4c49-aeff-77ecfaba74c3 latency: 4.993560075992718
[2023-12-28 14:40:07,395: INFO/MainProcess] Task tasks.document_indexing_task.document_indexing_task[4c398a51-da4b-483f-8ca8-fa008950a352] succeeded in 5.001808531000279s: None

ここに画像の説明を挿入します

https://gitee.com/fly-llm/dify-mysql-llm/commit/d37317cff5eceaa5aa2d1e7aa8657fa228d4959e
エラー報告の問題を解決するためにいくつかのインターフェイス制限を解放します:
ここに画像の説明を挿入します
dify-mysql-docker-compose/dify-api/migrations/versions/ を削除します。以下のファイルは実際にアップグレード操作と互換性があります。
MySQL バージョンを直接作成しているため、アップグレードを必要とせず、互換性があります。

5. 提出時に gitee に遭遇した場合は、オンラインで記録してください

ここに画像の説明を挿入します

6. まとめ

Dify プロジェクトは非常に優れており、コードもよく書かれていますが、データベースは Postgresdb なので、Mysql に切り替える必要があります。
しかし幸いなことに、私は sqlAlchomy を使用しているので、切り替えるのが非常に便利です。

おすすめ

転載: blog.csdn.net/freewebsys/article/details/135279613