Dify大模型,如何使用知识库数据?向量数据库weaviate
发布于 作者:苏南大叔 来源:程序如此灵动~

Dify
作为最火热的开源大语言模型(LLM)应用开发平台,其中的知识库功能就是由向量数据库所提供的。其中,根据dify
的.env
配置,可以得知:可选的向量数据库很多,比如:weaviate
, qdrant
, milvus
, myscale
, relyt
, pgvector
, pgvecto-rs
, chroma
, opensearch
, tidb_vector
, oracle
, tencent
, elasticsearch
, elasticsearch-ja
, analyticdb
, couchbase
, vikingdb
, oceanbase
, opengauss
, tablestore
。dify
默认的向量数据库是weaviate
。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10@22h2
,docker@28.0.4
,dify@1.3.1
,weaviate@1.19.0
。本文试图寻找一个可以直观地观察weaviate
内存储的数据结构和内容的途径。本文以建立“知识库”的初步概念为主,暂时不对里面的功能做详细评述。
dify 知识库
本文的场景下,需要使用dify
新建了一个插件(例如:聊天助手),然后,这个助手插件使用“知识库”功能。相关背景文章如下:
- https://newsn.net/say/dify.html
- https://newsn.net/say/dify-models.html
- https://newsn.net/say/dify-chat.html
知识库可以被集成到Dify
应用中作为上下文,或可以创建为独立的ChatGPT
插件发布使用。这个“翻译助手”目前没有关联“知识库”,主要原因是:
- 它的角色设定,目前暂时不需要知识库的功能。
- 知识库的内容,苏南的大叔准备单开文章(本文)讲述。
创建知识库
在dify
的插件编排界面,存在着知识库的上传位置。可以上传任何常见格式的文本内容。参考下图:
上传完成的文本内容,格式上理论上啥样都可以。不过,最好是QA
问答对的这样样式,会有更好的匹配效果。解析出来的数据,将会被进行分割,分割规则是可以自定义的。目前来说,默认的就可以使用。
embedding模型【可选】
这个过程中,可能会使用“系统设置”中的"embedding模型"设置,所以,需要进行设置,或保持默认。
管理已上传
在顶部的“知识库”按钮界面,对已上传被分割过的“知识”进行管理。
修改知识库名称
默认生成的这个“知识库”名称,很具有迷惑性,强烈建议修改。让人误以为一个知识库只能上传一条文档数据。
添加新文档
点击具体的某个“知识库”之后,就可以通过右上角的按钮,添加新的文档条目了。后续操作就是上传新的文本文件和文档切割。
也可以查看文档条目,看看文档被分割的情况。
使用 知识库
在“聊天助手”等界面,就可以完成对特定“知识库”的引用。这里仅作示例,精准度还是有待提高。
引用知识库之后,就可以回答原本的大模型所不知道的特定领域知识了。
不过,如果想要更好的知识库效果,还需要不断对数据进行调整。并且知识库的方式,并不是万金油,也有一定的局限性。因为,它聚焦的是某几条知识库数据,并不是整体。它无法统观大局,无法全局的去理解意思。解释出来的回答和解释,可能是片面的。所以,内容的精准度提出了更高的要求。
并且回答的格式,还需要通过提示词进行调整和修改。
题外话:查看 weaviate 配置
在dify
的docker/.env
文件中,可以查找到连接weaviate
向量数据库的关键因素。endpoint
和key
。
WEAVIATE_ENDPOINT=http://weaviate:8080
WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
weaviate
支持graphql
的方式,进行访问,也支持restful
的方式进行访问。所以,这个客户端的软件也可以以更加极客的方式进行展现。比如graphiql
或者postman
等方式。或者做些简单的编程,也可以实现一样的目的。在本文中,就不作展开描述了。
下面这个weaviate
的开源客户端,不是很好用。仅供参考:
结语
更多dify
相关的经验文字,可以参考苏南大叔的文章:


