大模型记忆工程体系之四——知识记忆:结构化知识的“专属存储”,支撑专业场景落地
在大模型智能体的记忆体系中,知识记忆与长期记忆容易混淆,但二者有明确区别:长期记忆侧重“用户交互相关的关键信息”(如用户偏好、任务总结),而知识记忆侧重“结构化、体系化的通用/专业知识”(如行业规则、常识、知识图谱、外部文档内容)。
比如,养老行业智能体的长期记忆可能存“用户专注于智能照护领域”,而知识记忆会存“养老行业政策、老年用户操作习惯、照护提醒相关常识、外部需求文档内容”;再比如,医疗智能体的知识记忆会存“疾病症状、用药规则、医疗指南”,这些知识不依赖于用户交互,是智能体完成专业任务的基础。
知识记忆的生命周期为“长期保存”,可定期更新,核心作用是“为智能体提供专业知识支撑”,避免智能体因知识不足导致回复错误或不专业。以下是工业界最常用的两种知识记忆形式,附完整可执行代码和专业场景落地建议。
一、最常用:检索增强记忆(RAG Memory)—— 外部文档知识存储
检索增强记忆(RAG,Retrieval-Augmented Generation)是知识记忆的核心实现方式,核心逻辑是“将外部文档(PDF、Word、TXT等)分割、转成向量,存入向量数据库,智能体需要时,通过语义检索提取文档中的相关知识,结合大模型生成专业回复”。
这种方式的优势是“无需将所有知识硬编码到Prompt中”,可灵活更新知识库(只需添加/删除文档),适合需要调用外部知识的场景(如行业政策解读、文档咨询、专业领域问答)。
可执行代码(以养老行业政策文档为例)
from langchain.document_loaders import TextLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 加载外部知识库(支持TXT、PDF等格式,此处以TXT为例,PDF需用PyPDFLoader)
# 示例:加载养老行业政策文档(可替换为自己的文档路径)
loader = TextLoader("养老行业政策.txt") # TXT文档加载
# 若为PDF文档,替换为:loader = PyPDFLoader("养老行业政策.pdf")
documents = loader.load()
# 2. 分割文档(避免单条文本过长,超出大模型上下文窗口)
# chunk_size:单条文本长度(500-1000为宜),chunk_overlap:文本重叠长度(50-100),保证上下文连贯
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = text_splitter.split_documents(documents)
# 3. 将分割后的文档存入向量数据库(知识记忆持久化)
embeddings = OpenAIEmbeddings(api_key="你的API密钥")
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings, persist_directory="./knowledge_memory_db")
# 4. 构建检索链(智能体可通过检索链获取知识记忆)
llm = ChatOpenAI(model="gpt-3.5-turbo", api_key="你的API密钥")
# chain_type="stuff":将检索到的知识直接拼接进Prompt,适合短文本检索;复杂场景可使用"map_reduce"
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever(search_kwargs={"k": 2}))
# 5. 检索知识记忆,生成专业回复(模拟智能体查询养老政策)
# 示例1:查询养老智能体开发的政策支持
query1 = "开发养老智能体可申请哪些政策补贴?需要满足什么条件?"
response1 = qa_chain.invoke(query1)
print(f"用户查询:{query1}")
print(f"智能体回复(基于知识记忆):{response1['result']}")
# 示例2:查询老年用户操作习惯相关要求
query2 = "养老智能体的操作设计需符合老年用户的哪些习惯?"
response2 = qa_chain.invoke(query2)
print(f"\n用户查询:{query2}")
print(f"智能体回复(基于知识记忆):{response2['result']}")
# 6. 知识库更新(新增文档,无需重新初始化向量数据库)
new_loader = TextLoader("养老行业新政策.txt")
new_documents = new_loader.load()
new_splits = text_splitter.split_documents(new_documents)
vectorstore.add_documents(new_splits) # 新增文档到知识库
print("\n知识库已更新,新增养老行业新政策内容")
实操要点
- 文档分割技巧:chunk_size建议500-1000Token,chunk_overlap设置50-100,避免分割后文本语义断裂;长文档(如几百页PDF)可先按章节分割,再按Token长度分割。
- chain_type选择:
-
- stuff:适合短文本、检索结果少(k≤3)的场景,速度快,开发简单;
- map_reduce:适合长文档、检索结果多的场景,先分别总结每条检索结果,再汇总生成最终回复,精度更高;
- refine:适合需要逐步优化回复的场景,基于前一条检索结果,结合下一条结果优化内容,适合专业深度问答。
- 知识库维护:定期新增最新文档(如行业新政策)、删除过期文档(如失效政策),避免检索到无效知识;可设置定时更新任务,自动化维护知识库。
- 适用场景:行业政策解读、外部文档咨询、专业领域问答(如医疗、法律、教育)、智能客服(需调用产品手册、服务规则)。
二、进阶实现:知识图谱记忆(Knowledge Graph Memory)—— 结构化知识关联
当知识具有明确的关联关系(如“老年用户”→“操作习惯”→“字体放大”“语音控制”),单纯的RAG记忆无法体现知识间的逻辑关联,此时需使用知识图谱记忆。核心逻辑是“将知识拆分为‘实体-关系-实体’三元组,构建知识图谱,智能体可通过图谱检索关联知识,生成更具逻辑性的回复”。
比如,养老行业的知识图谱可包含:实体(养老智能体、照护提醒、传感器)、关系(包含、依赖)、属性(照护提醒的属性为“定时、重复、异常预警”),智能体查询“照护提醒需要什么支持”时,可通过图谱检索到“依赖传感器数据、需要语音控制”等关联知识。
可执行代码(基于Neo4j知识图谱,工业级落地)
from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI
from langchain.chains import GraphCypherQAChain
# 1. 初始化Neo4j知识图谱(需先安装Neo4j数据库,配置地址、用户名、密码)
graph = Neo4jGraph(
url="bolt://localhost:7687",
username="neo4j",
password="你的数据库密码"
)
# 2. 构建养老行业知识图谱(实体-关系-实体三元组)
# 新增实体和关系(可批量导入,此处为示例)
graph.query("""
CREATE
(a:养老智能体 {name: "养老智能体"}),
(b:核心功能 {name: "照护提醒"}),
(c:核心功能 {name: "用药提醒"}),
(d:依赖设备 {name: "传感器"}),
(e:用户需求 {name: "语音控制"}),
(a)-[:包含]->(b),
(a)-[:包含]->(c),
(b)-[:依赖]->(d),
(a)-[:满足]->(e),
(b)-[:需要]->(e)
""")
# 3. 初始化大模型和知识图谱检索链
llm = ChatOpenAI(model="gpt-3.5-turbo", api_key="你的API密钥")
# 自动生成Cypher查询语句,检索知识图谱
chain = GraphCypherQAChain.from_llm(llm, graph=graph, verbose=True)
# 4. 检索知识图谱记忆,生成关联回复
# 示例1:查询养老智能体的核心功能及依赖设备
query1 = "养老智能体包含哪些核心功能?这些功能需要依赖什么设备?"
response1 = chain.invoke(query1)
print(f"用户查询:{query1}")
print(f"智能体回复(基于知识图谱):{response1['result']}")
# 示例2:查询照护提醒需要满足什么用户需求
query2 = "养老智能体的照护提醒功能需要满足用户的什么需求?"
response2 = chain.invoke(query2)
print(f"\n用户查询:{query2}")
print(f"智能体回复(基于知识图谱):{response2['result']}")
# 5. 知识图谱更新(新增实体和关系)
graph.query("""
CREATE
(f:核心功能 {name: "健康数据监测"}),
(g:依赖设备 {name: "血压计"}),
(a:养老智能体 {name: "养老智能体"})-[:包含]->(f),
(f)-[:依赖]->(g)
""")
print("\n知识图谱已更新,新增健康数据监测功能及依赖设备")
实操要点
- 知识图谱选择:新手可先用Neo4j(开源、易部署、社区成熟),大规模场景可使用NebulaGraph(高并发、支持海量数据)。
- 三元组设计:核心是“实体明确、关系清晰”,避免模糊关系(如“相关”“有关”),尽量使用具体关系(如“包含”“依赖”“满足”)。
- 适用场景:知识关联密集的场景(如医疗诊断、法律条款解读、行业知识梳理),需要智能体生成逻辑连贯、关联紧密的专业回复。
- 优势与不足:优势是知识关联清晰,回复逻辑性强;不足是开发成本高于RAG记忆,需维护知识图谱,适合中大型智能体项目。
三、知识记忆与其他记忆的融合(工业界最佳实践)
实际开发中,知识记忆需与会话记忆、长期记忆、任务记忆结合,才能实现“个性化+专业性+自主性”的智能体。以下是融合示例,附完整代码,实现“用户个性化需求+任务推进+专业知识支撑”的闭环。
from langchain.memory import ConversationBufferWindowMemory, VectorStoreRetrieverMemory, CombinedMemory
from langchain_community.vectorstores import Chroma
from langchain_community.graphs import Neo4jGraph
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA, GraphCypherQAChain
from langchain.prompts import ChatPromptTemplate
# 1. 会话记忆(保证当前对话连贯)
short_term_memory = ConversationBufferWindowMemory(k=5, return_messages=True)
# 2. 长期记忆(存储用户偏好)
embeddings = OpenAIEmbeddings(api_key="你的API密钥")
long_term_vectorstore = Chroma(embedding_function=embeddings, persist_directory="./long_term_memory_db")
long_term_memory = VectorStoreRetrieverMemory(retriever=long_term_vectorstore.as_retriever(search_kwargs={"k": 2}))
# 3. 知识记忆(RAG+知识图谱,提供专业支撑)
# 3.1 RAG记忆(外部文档知识)
knowledge_vectorstore = Chroma(embedding_function=embeddings, persist_directory="./knowledge_memory_db")
rag_chain = RetrievalQA.from_chain_type(llm=ChatOpenAI(api_key="你的API密钥"), chain_type="stuff", retriever=knowledge_vectorstore.as_retriever(search_kwargs={"k": 1}))
# 3.2 知识图谱记忆(结构化关联知识)
graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="你的数据库密码")
graph_chain = GraphCypherQAChain.from_llm(llm=ChatOpenAI(api_key="你的API密钥"), graph=graph)
# 4. 组合记忆(会话+长期)
combined_memory = CombinedMemory(memories=[short_term_memory, long_term_memory])
# 5. 模拟完整交互(个性化+任务+专业知识)
# 步骤1:存入长期记忆(用户偏好)
long_term_memory.save_context({"input": "我是社区养老服务中心的,需要开发适配老年用户的智能体"}, {"output": "已记录你的场景和需求"})
# 步骤2:模拟当前对话(任务推进+专业咨询)
short_term_memory.save_context({"input": "帮我推进养老智能体开发,先确认照护提醒功能的设计细节,需要符合老年用户习惯和行业政策"}, {"output": "将结合专业知识和你的需求,给出设计细节"})
# 步骤3:提取组合记忆,获取个性化信息
memory_context = combined_memory.load_memory_variables({"input": "照护提醒功能怎么设计?"})
# 步骤4:调用知识记忆,获取专业知识(政策+关联设备)
rag_response = rag_chain.invoke("养老智能体照护提醒功能的老年用户操作要求和行业政策")
graph_response = graph_chain.invoke("照护提醒功能需要依赖什么设备,需要满足什么用户需求")
# 步骤5:大模型结合所有记忆,生成个性化专业回复
llm = ChatOpenAI(model="gpt-3.5-turbo", api_key="你的API密钥")
prompt = ChatPromptTemplate.from_messages([
("system", "结合会话记忆、长期记忆、知识记忆,生成贴合用户场景的专业回复,确保兼顾个性化、任务推进和专业准确性。"),
("placeholder", "{memory_context}"),
("human", "照护提醒功能怎么设计?"),
("system", f"专业知识参考(政策+操作):{rag_response['result']}"),
("system", f"专业知识参考(设备+需求):{graph_response['result']}")
])
final_prompt = prompt.format(memory_context=memory_context)
response = llm.invoke(final_prompt)
print("智能体最终回复:")
print(response.content)
四、知识记忆落地总结
知识记忆的核心价值是“为智能体提供专业知识支撑”,解决智能体“专业度不足”的痛点,落地时需根据知识类型选择合适的实现方式:
- 外部文档知识(如政策、手册):优先使用RAG记忆(开发简单、灵活更新,适合大多数场景);
- 结构化关联知识(如实体关系、行业规则):使用知识图谱记忆(逻辑清晰、回复更具专业性,适合中大型项目);
- 最佳实践:知识记忆与会话、长期、任务记忆融合,实现“个性化交互+自主任务推进+专业知识支撑”的闭环;
- 关键技巧:定期维护知识库/知识图谱,控制检索精度,避免无关知识干扰回复。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)