混合知识库的设计逻辑:为什么需要'图 + 向量'双引擎
1.1 单一知识库的局限性
- 纯图数据库:擅长实体关系查询(如'小米的合作品牌'),但无法高效处理细粒度文本检索(如'苹果的环保目标细节');
- 纯向量数据库:擅长语义相似性检索(如'查找与 5G 技术相关的内容'),但难以挖掘实体间的复杂关联(如'华为 - 开发 - 鸿蒙 - 适配 - 智能设备')。
1.2 混合知识库的核心优势
'Neo4j 图库+Milvus 向量库'的组合,完美弥补了单一知识库的短板:
- 互补覆盖:图库处理'关系型知识',向量库处理'语义型知识',覆盖结构化、半结构化、非结构化知识场景;
- 提升效率:关系查询走图库,语义查询走向量库,避免单一知识库的'一刀切'检索瓶颈;
- 适配多代理:graph_kg 代理调用图库,vec_kg 代理调用向量库,实现代理与知识库的精准绑定。
2 本地 Docker 部署:Neo4j 图数据库搭建
2.1 部署准备
- 依赖环境:Docker 已启动;
- 核心端口:7474(Web 管理界面)、7687(Bolt 协议端口,代码连接核心);
- 初始配置:用户名
neo4j,密码password(Docker Compose 中已预设)。
2.2 启动与验证
- 启动服务:通过 Docker Compose 启动 Neo4j;
- Web 界面验证:浏览器访问
http://localhost:7474,输入用户名密码登录,首次登录需修改密码(保持与代码配置一致); - 代码连接验证:通过 LangChain 的
Neo4jGraph类测试连接,核心代码:
from langchain_community.graphs import Neo4jGraph
# 初始化 Neo4j 连接
graph = Neo4jGraph(
url='bolt://localhost:7687',
username="neo4j",
password="password", # 与 Web 界面修改后的密码一致
database="neo4j"
)
print("Neo4j 连接成功!")
2.3 数据建模:从文本到图结构的自动转换
系统通过 LLMGraphTransformer 将非结构化文本(如 doc/company.txt)自动转换为图结构(实体 + 关系),无需手动建模,核心流程如下:
2.3.1 核心依赖
from langchain_experimental.graph_transformers import LLMGraphTransformer
from langchain_core.documents import Document
2.3.2 数据加载与转换
import os
current_dir = os.path.dirname(os.path.abspath(__file__))
company_txt_path = os.path.normpath(os.path.join(current_dir, , ))
(company_txt_path, , encoding=) file:
content = file.read()
documents = [Document(page_content=content)]
graph_llm = ChatOpenAI(temperature=, model_name=, api_key=key, base_url=base_url)
graph_transformer = LLMGraphTransformer(llm=graph_llm)
graph_documents = graph_transformer.convert_to_graph_documents(documents)
graph.add_graph_documents(graph_documents)
()


