混合知识库搭建:本地 Docker 部署 Neo4j 图数据库与 Milvus 向量库
介绍如何在本地通过 Docker 部署 Neo4j 图数据库和 Milvus 向量库,构建混合知识库以支持多代理 RAG 系统。内容涵盖双引擎设计逻辑、Docker 启动验证、数据建模与索引构建、Cypher 查询优化及检索协同策略。通过结合图谱关系与语义向量,解决单一知识库在实体关系挖掘与细粒度文本检索上的局限,提升检索精准度与响应效率。

介绍如何在本地通过 Docker 部署 Neo4j 图数据库和 Milvus 向量库,构建混合知识库以支持多代理 RAG 系统。内容涵盖双引擎设计逻辑、Docker 启动验证、数据建模与索引构建、Cypher 查询优化及检索协同策略。通过结合图谱关系与语义向量,解决单一知识库在实体关系挖掘与细粒度文本检索上的局限,提升检索精准度与响应效率。

'Neo4j 图库+Milvus 向量库'的组合,完美弥补了单一知识库的短板:
neo4j,密码password(Docker Compose 中已预设)。http://localhost:7474,输入用户名密码登录,首次登录需修改密码(保持与代码配置一致);Neo4jGraph 类测试连接,核心代码:from langchain_community.graphs import Neo4jGraph
# 初始化 Neo4j 连接
graph = Neo4jGraph(
url='bolt://localhost:7687',
username="neo4j",
password="password", # 与 Web 界面修改后的密码一致
database="neo4j"
)
print("Neo4j 连接成功!")
系统通过 LLMGraphTransformer 将非结构化文本(如 doc/company.txt)自动转换为图结构(实体 + 关系),无需手动建模,核心流程如下:
from langchain_experimental.graph_transformers import LLMGraphTransformer
from langchain_core.documents import Document
import os
# 1. 加载文本知识库(公司相关文本)
current_dir = os.path.dirname(os.path.abspath(__file__))
company_txt_path = os.path.normpath(os.path.join(current_dir, "doc", "company.txt"))
with open(company_txt_path, 'r', encoding="utf-8") as file:
content = file.read()
documents = [Document(page_content=content)]
# 2. 初始化 LLMGraphTransformer(通过大模型自动提取实体与关系)
graph_llm = ChatOpenAI(temperature=0, model_name="qwen-plus-2025-12-01", api_key=key, base_url=base_url)
graph_transformer = LLMGraphTransformer(llm=graph_llm)
# 3. 文本→图结构转换(实体:如 Company、Technology;关系:如 DEVELOPS、COOPERATES_WITH)
graph_documents = graph_transformer.convert_to_graph_documents(documents)
# 4. 插入 Neo4j 图数据库
graph.add_graph_documents(graph_documents)
print(f"成功插入{len(graph_documents)}个图文档,包含实体数:{len(graph_documents[0].nodes)}")
| 实体类型 | 实体示例 | 关系类型 | 关系示例 |
|---|---|---|---|
| Company | 小米科技有限责任公司、华为技术有限公司 | DEVELOPS | 华为→DEVELOPS→鸿蒙操作系统 |
| Technology | 5G 通信技术、智能手表芯片 | COOPERATES_WITH | 小米→COOPERATES_WITH→高通 |
| Operating_system | 鸿蒙操作系统、MIUI | ADOPTS | 华为手机→ADOPTS→鸿蒙操作系统 |
图知识库的检索核心是 Cypher 语句生成,为避免大模型生成语法错误,系统通过 Few-shot 示例优化 Cypher 生成逻辑:
from langchain_core.prompts import PromptTemplate
from langchain_community.chains.graph_qa.cypher import GraphCypherQAChain
# 1. Few-shot 示例(覆盖常见查询场景)
examples = [
{"question": "都有哪些公司?", "query": "MATCH (c:Company) RETURN c.id"},
{"question": "小米在技术创新方面有什么突破?", "query": "MATCH (c:Company)-[r:DEVELOPS|INTRODUCES]->(t) WHERE c.id CONTAINS '小米' RETURN c.id as company, type(r) as relation, t.id as technology"},
{"question": "华为的鸿蒙操作系统有什么特点?", "query": "MATCH (c:Company)-[:DEVELOPS]->(os:Operating_system) WHERE c.id CONTAINS '华为' RETURN os.id"}
]
# 2. 构建 Cypher 生成 Prompt
cypher_prompt_template = """You are a Neo4j Cypher expert. Generate syntactically correct Cypher queries. Schema: {schema} Important rules: 1. Company names are stored as FULL names (e.g., "小米科技有限责任公司"). ALWAYS use CONTAINS for partial matching 2. Use pattern: WHERE c.id CONTAINS 'keyword' instead of exact match 3. For relationships, use [:DEVELOPS|INTRODUCES] for technology/products 4. NEVER use undefined variables (like type(r) without defining r) Examples: {examples} Question: {question} Cypher:"""
cypher_prompt = PromptTemplate(
template=cypher_prompt_template,
input_variables=["schema", "question"],
partial_variables={"examples": "\n".join([f"Q: {ex['question']}\nCypher: {ex['query']}" for ex in examples])}
)
# 3. 创建 Cypher QA Chain
cypher_chain = GraphCypherQAChain.from_llm(
graph=graph,
cypher_llm=llm,
qa_llm=llm,
cypher_prompt=cypher_prompt,
validate_cypher=True, # 开启 Cypher 语法校验
allow_dangerous_requests=True
)
通过 Few-shot 示例,大模型生成 Cypher 的准确率提升 60% 以上,避免了'实体名称精确匹配失败''关系类型错误'等常见问题。
docker logs rag-milvus,输出'Milvus is ready'即启动成功;Milvus 类测试连接,核心代码:from langchain_milvus import Milvus
from langchain_core.embeddings import Embeddings
# 1. 初始化 DashScope Embeddings(生成文本向量)
class DashScopeEmbeddings(Embeddings):
def __init__(self, model: str, api_key: str):
self.model = model
self.api_key = api_key
# 实现 embed_documents 和 embed_query 方法(参考项目代码)
embeddings = DashScopeEmbeddings(model="text-embedding-v4", api_key=key)
# 2. 连接 Milvus 并创建集合
vectorstore = Milvus(
embedding=embeddings,
connection_args={"uri": "http://localhost:19530"},
collection_name="company_milvus",
drop_old=True # 测试时删除旧集合,生产环境设为 False
)
print("Milvus 连接成功!")
向量库的核心是'文本分块→向量生成→索引构建',系统通过 RecursiveCharacterTextSplitter 实现合理分块,提升检索精度:
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 1. 文档分块(关键参数:chunk_size=250,chunk_overlap=30)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=250, # 每个文本块最大长度(字符数)
chunk_overlap=30, # 文本块重叠长度(避免上下文断裂)
length_function=len
)
splits = text_splitter.split_documents(documents) # documents 为之前加载的公司文本
print(f"文档分块完成,共生成{len(splits)}个文本块")
# 2. 向量插入与索引构建(自动生成向量并创建 IVF_FLAT 索引)
vectorstore = Milvus.from_documents(
documents=splits,
collection_name="company_milvus",
embedding=embeddings,
connection_args={"uri": "http://localhost:19530"},
drop_old=True
)
print("Milvus 向量索引构建完成!")
Milvus 向量库通过 as_retriever() 方法生成检索器,结合 RAG 链实现'检索→生成'的闭环:
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 1. 构建检索器(设置返回 Top2 相关文本块)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
# 2. 构建 RAG 生成 Prompt(限制响应长度,确保简洁)
prompt = PromptTemplate(
template="""You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise: Question: {question} Context: {context} Answer: """,
input_variables=["question", "context"],
)
# 3. 构建 RAG 链(检索→Prompt→生成→解析)
rag_chain = prompt | graph_llm | StrOutputParser()
# 4. 测试检索与生成
user_question = "苹果公司的环保目标是什么?"
docs = retriever.invoke(user_question)
response = rag_chain.invoke({"context": docs, "question": user_question})
print(f"检索结果:{response}")
text-embedding-v4 模型,生成 768 维向量,平衡检索精度与存储成本。系统通过 Supervisor 的路由规则,决定不同需求对应的知识库调用策略:
用户需求:'华为的鸿蒙操作系统有什么特点?适配哪些智能设备?'
text-embedding-v4)。index_params={"M": 16, "efConstruction": 200};本文详细讲解了混合知识库的搭建全流程:从 Neo4j 图数据库的 Docker 部署、自动建模、Cypher 优化,到 Milvus 向量数据库的分块策略、向量插入、RAG 链构建,再到双库的协同逻辑,完整覆盖了'关系型知识 + 语义型知识'的存储与检索需求。混合知识库是多代理系统的'知识基石',其设计的合理性直接决定了代理执行的精准度与效率。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online