[Dify 지식 베이스]: 전체 네트워크에서 첫 번째 릴리스일 수도 있습니다! 다양한 호환성 문제를 해결하기 위해 오픈소스 지식베이스 Dify의 데이터베이스를 Postgresdb에서 MySQL로 전환했는데, 드디어 전환에 성공했고, 시연용 영상도 많이 만들고 계속 연구하고 있습니다.

1. 영상 시연 주소:

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

[Dify 지식 베이스](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
공식 웹사이트:
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로 바꾸십시오.

필드는 이진 포함을 사용하지 않습니다
= db.Column(db.LargeBinary, nullable=False)
가 포함으로 대체됨
= 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. 제출 시 기티를 만나면 온라인으로 기록해 둔다.

여기에 이미지 설명을 삽입하세요.

6. 요약

Dify 프로젝트는 매우 좋고 코드도 잘 작성되어 있지만 데이터베이스가 Postgresdb이고 Mysql로 ​​전환해야 합니다.
그런데 다행히 sqlAlchomy를 사용하고 있는데 전환이 매우 편리합니다.

추천

출처blog.csdn.net/freewebsys/article/details/135279613