建构 AI Agent 应用——知识与记忆

118 阅读25分钟

你的智能体如今已具备工具与编排,足以采取行动完成真实工作。但在大多数场景中,你还会希望智能体既记得发生过什么,又知晓超出模型权重之外的更多信息。本章聚焦知识记忆——两种互补却不同的方式,用来充实智能体的上下文。

知识(常以检索增强生成,RAG,实现)会在生成时引入可验证的事实或领域内容——如技术规格、政策文档、产品目录、客户或系统日志——让智能体在即时对话之外“知道”更多,以补充模型自身(具体体现在其权重与偏置)存储的信息。记忆则捕获智能体自身的历史:过去的用户交互、工具输出与状态更新,使其在多轮与跨会话中维持连续性,“记得”过往并据此影响后续决策。

在第 5 章中,我们提出了上下文工程:动态选择、组织并装配所有输入到模型的上下文窗口,以获得更佳结果。记忆是上下文工程的基础性支撑:它提供可被选择与装配进有效提示的知识、历史与事实。换言之,记忆是知识的存放处,而上下文工程是利用这些知识产生智能行为的方式

本章将以 LangGraph 为例,它是搭建有状态智能体工作流的底层编排框架(第 1 章介绍过)。LangGraph 将你的应用定义为由节点(纯函数,如大模型调用、记忆更新、工具调用)与(控制流转移)组成的有向图,使开发者能以声明式方式建模复杂的多步流程。应用的整个状态被视为单个、强类型的 Python 对象(常为 TypedDict),在运行时沿图传递,数据管理清晰且类型安全。不同于仅支持 DAG 的编排工具,LangGraph 原生支持环与条件分支,从而无需额外样板代码即可实现循环、重试与动态决策路径。它还内置流式输出检查点机制,让长时任务可持久化并从断点精准恢复。

通过把记忆机制(滚动上下文窗、关键词抽取、语义检索等)作为一等公民节点,LangGraph 让记忆逻辑模块化、可测试;边则保证记忆更新与 LLM 调用的先后顺序正确,确保在正确的时间正确的上下文注入模型。由于状态(包括记忆内容)可被检查点化与恢复,你的智能体得以跨会话保持连续性并抵御失败——这一切皆在统一的图框架内完成。

接下来我们将从智能体记忆的基础开始:从简单的滚动上下文窗语义记忆检索增强生成以及知识图谱等高级方法。贯穿全章,我们将强调这些记忆系统如何融入上下文工程流水线,构建扎实、强大且与目标与环境高度对齐的智能体。

记忆的基础方法(Foundational Approaches to Memory)

管理上下文窗口(Managing Context Windows)

最简单的记忆方式就是依赖上下文窗口。它指一次调用中传入基础模型的全部输入信息;模型单次能接收与关注的最大 token 数称为上下文长度,等同于该请求的“工作记忆”。经验上,1 个 token 约等于 ¾ 个英文单词或约 4 个字符;例如 1,000 个 token ≈ 750 个英文词。许多流行模型经历了约 4k token(≈3,000 词,约 12 页)与 8k token(≈6,000 词,约 24 页)的阶段;GPT-5Claude 3.7 Sonnet 现已支持最高约 272,000 token 输入;Gemini 2.5 的输入上限可达百万级 token

上下文窗口是开发者应当高效使用的关键资源:要给模型恰好足够的信息来完成任务,而非越多越好。最简单的策略是把当前问题 + 本会话的历史都放进去;当窗口被占满时,采用先进先出地丢弃最旧的内容(滚动窗口)。它实现简单、复杂度低,能覆盖大量用例。但缺点也明显:当交互足够长时,再重要的内容也会被挤出窗口;而在提示很长或模型回答啰嗦时,这会发生得很快。模型也可能在长提示中遗漏关键信息,因此将最相关内容凸显并放在提示尾部附近,有助于被采纳。这一标准做法可在 LangGraph 代理中这样纳入(代码原文保留):

from typing import Annotated
from typing_extensions import TypedDict

from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, MessagesState, START

llm = ChatOpenAI(model="gpt-5")

def call_model(state: MessagesState):
   response = llm.invoke(state["messages"])
   return {"messages": response}

# Fails to maintain state across the conversation
input_message = {"type": "user", "content": "hi! I'm bob"}
for chunk in graph.stream({"messages": [input_message]}, stream_mode="values"):
   chunk["messages"][-1].pretty_print()

input_message = {"type": "user", "content": "what's my name?"}
for chunk in graph.stream({"messages": [input_message]}, stream_mode="values"):
   chunk["messages"][-1].pretty_print()

传统全文检索(Traditional Full-Text Search)

传统全文检索是许多大规模检索系统的基石,也是一种稳健成熟的方法,可向启用基础模型的智能体精准注入历史上下文。其核心是倒排索引:对文本进行分词、归一化(小写化、词干提取)与停用词过滤,并将每个术语映射到其出现的文档或片段列表。这样查询时无需扫描全库,只要沿着术语的倒排表就能快速找到包含关键词的段落。

结果排序通常使用 BM25:它综合词频(术语在段落中出现的频度)、逆文档频率(术语在语料中的稀有程度)与长度归一化(惩罚过长/过短段落)。当用户查询到来时,系统用同样的分析管线处理,并由 BM25 产出Top K 结果。常见做法是将这些命中段落(必要时先截断或摘要)直接注入到模型提示中,确保模型在不耗尽上下文长度的情况下看到最相关的历史。用 Python 实现非常容易(通常会存入数据库),示例代码如下(原文保留):

# pip install rank_bm25

from rank_bm25 import BM25Okapi
from typing import List

corpus: List[List[str]] = [
    "Agent J is the fresh recruit with attitude".split(),
    "Agent K has years of MIB experience and a cool neuralyzer".split(),
    "The galaxy is saved by two Agents in black suits".split(),
]
# 2. Build the BM25 index
bm25 = BM25Okapi(corpus)

# 3. Perform retrieval for a fun query
query = "Who is a recruit?".split()
top_n = bm25.get_top_n(query, corpus, n=2)

print("Query:", " ".join(query))
print("Top matching lines:")
for line in top_n:
    print(" •", " ".join(line))

在这个示例中,我们用 BM25 为几句“特工台词”建立了简单索引,并为给定查询取回最相关的句子。把这些高分段落直接注入提示,就能在不传入所有历史消息的前提下,让模型看到关键历史,同时保持在上下文限额内

当然,基于关键词的方法擅长精确匹配,但可能错过更宽泛的主题、同义改写或概念关联。为了捕捉更深层的“基于含义”的记忆——让智能体即使在表述不同的情况下也能想起相关理念——我们接下来转向语义记忆与向量库

语义记忆与向量库(Semantic Memory and Vector Stores)

语义记忆是一种长期记忆,用于存储和检索一般性知识、概念与过往经验。它让系统把信息与经验存起来,并在需要时高效取出以提升后续表现。实现这一点的主流方式是使用向量数据库:在大规模场景下实现快速索引与检索,使智能体能以更深的理解与更高的相关性响应查询。

语义搜索导论(Introduction to Semantic Search)

与传统的关键词检索不同,语义搜索试图理解查询的上下文与意图,因此能得到更准确、更有意义的结果。它关注词语与短语的含义而非精确匹配,借助机器学习技术理解上下文、同义词以及词间关系。即便文档不包含与查询完全相同的词,检索系统也能把握意图,返回语境相关的结果。

这一方法的基础是嵌入(embeddings) :把词/句表示为向量,依据其在大规模语料中的使用方式捕捉语义。把大段文本投射到稠密数值向量空间后,我们获得了适合存储与检索的丰富表示。Word2Vec、GloVe、BERT 等模型通过把语义相近的词放在高维空间的近邻,革新了机器对语言的理解。大型语言模型(LLM)进一步提升了嵌入在各种文本上的表现(更大的嵌入模型与更丰富的训练数据)。在智能体系统中,语义搜索显著提升了记忆检索的效果,尤其是在跨文档检索语义相关而非词面相同的信息时。

用向量库实现语义记忆(Implementing Semantic Memory with Vector Stores)

首先,为要存储的概念与知识生成语义嵌入。这些嵌入通常由基础模型或其他 NLP 技术产生,把文本编码为稠密向量,捕捉数据点在连续向量空间中的语义属性与关系。例如,一句描述历史事件的句子可被转换成表达其含义的向量。接着,我们需要一个能高效存放与检索这些高维向量的地方——这就是向量数据库

常用的向量库/向量索引包括 FAISS(Facebook AI Similarity Search)Annoy(Approximate Nearest Neighbors Oh Yeah) 等。它们针对高维向量的存储与相似度搜索做了优化,可在查询向量与库中向量之间进行快速近邻检索

当智能体收到查询或需要回忆信息时,会对查询进行向量化,然后在向量库中做相似度搜索,找到最相关的嵌入项并取回其原始内容。这些查找速度快、可扩展,能在大规模信息上迅速检索,提升动作与回答的质量。示例(原文代码保留):

from typing import Annotated
from typing_extensions import TypedDict
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, MessagesState, START
llm = ChatOpenAI(model="gpt-5")
def call_model(state: MessagesState):
   response = llm.invoke(state["messages"])
   return {"messages": response}
from vectordb import Memory
memory = Memory(chunking_strategy={'mode':'sliding_window', 'window_size': 128, 
'overlap': 16})
text = """
Machine learning is a method of data analysis that automates analytical 
model building. It is a branch of artificial intelligence based on the 
idea that systems can learn from data, identify patterns and make 
decisions with minimal human intervention. Machine learning algorithms 
are trained on datasets that contain examples of the desired output. 
For example, a machine learning algorithm that is used to classify 
images might be trained on a dataset that contains images of cats 
and dogs. Once an algorithm is trained, it can be used to make 
predictions on new data. For example, the machine learning algorithm 
that is used to classify images could be used to predict whether a new 
image contains a cat or a dog.
"""
metadata = {"title": "Introduction to Machine Learning", "url": 
"https://learn.microsoft.com/en-us/training/modules/" + 
    "introduction-to-machine-learning"}
memory.save(text, metadata)
text2 = """
Artificial intelligence (AI) is the simulation of human intelligence in machines
that are programmed to think like humans and mimic their actions.
The term may also be applied to any machine that exhibits traits associated with
a human mind such as learning and problem-solving.
AI research has been highly successful in developing effective techniques for 
solving a wide range of problems, from game playing to medical diagnosis.
"""
metadata2 = {"title": "Artificial Intelligence for Beginners", "url": 
"https://microsoft.github.io/AI-for-Beginners"}
memory.save(text2, metadata2)
query = "What is the relationship between AI and machine learning?"
results = memory.search(query, top_n=3)
builder = StateGraph(MessagesState)
builder.add_node("call_model", call_model)
builder.add_edge(START, "call_model")
graph = builder.compile()
input_message = {"type": "user", "content": "hi! I'm bob"}
for chunk in graph.stream({"messages": [input_message]}, {}, 
stream_mode="values"):
   chunk["messages"][-1].pretty_print()
print(results)

检索增强生成(Retrieval-Augmented Generation, RAG)

把记忆纳入智能体,不仅是存与管知识,还要增强生成的相关性与准确性。RAG检索生成结合:用检索找到相关信息,用生成模型融合这些信息并产出上下文增强的回答,广泛提升应用表现。

流程概览:

  1. 索引阶段:准备可能有用的文档,按块切分(模型只需相关片段而非整篇)。将每个块嵌入后写入向量数据库(见图 6-1——索引流水线:切分→编码→入库)。

image.png

  1. 检索阶段:针对用户查询,在文档库或向量库中检索相关片段
  2. 生成阶段:把检索到的上下文与原始问题一起输入生成模型,模型结合外部检索信息与自身知识,生成连贯且贴合上下文的答案(见图 6-2——运行时:查询→检索→拼接→生成)。

image.png

RAG 通过把外部知识引入生成过程,显著提升答案的信息量、准确度与可解释性,尤其适合领域/企业特定知识或政策对输出的影响。

语义体验记忆(Semantic Experience Memory)

把外部知识库接入语义存储固然有效,但智能体每次新会话仍像从零开始;而在长时或复杂任务中,早期上下文也会逐渐被挤出窗口。语义体验记忆可同时解决这两点:

  • 对每次用户输入,用嵌入模型生成其向量表示;
  • 用该向量在历史交互存储中做向量检索,找出最相似的过往片段
  • 在上下文窗口中预留空间给这些最佳匹配,其余空间再放系统消息、最新用户输入和最近对话。

这样,智能体不仅能依托广泛的知识库,还能基于累积的交互经验进行个性化与自适应的响应与行动。

GraphRAG(图检索增强生成)

现在我们转向一种更高级的 RAG 版本:它更复杂、集成成本更高,但能更好地处理更广泛的问题。图检索增强生成(GraphRAG)是在 RAG 基础上的扩展,引入了图数据结构来加强检索过程。通过使用图,GraphRAG 能够管理并利用信息之间复杂的相互关系与依赖,显著提升生成内容的丰富度与准确性

基础 RAG 的工作方式是:把文档切块、将这些块嵌入到向量空间,并在查询时检索语义相似的块来增强 LLM 的提示。该方法在简单事实查找直接问答中有效,但当出现以下情况时会吃力:

  • 需要把分散在多份文档中的信息“连点成线”;
  • 查询需要概括数据集的高层语义主题
  • 数据集庞大、杂乱,或以叙事而非离散事实组织。

例如,如果没有任何单个检索块能完整覆盖 Geoffrey Hinton 的所有工作,基础 RAG 可能回答失败。“GraphRAG”通过从数据集中构建知识图谱(实体 + 关系) ,从而实现多跳推理关系链式连接结构化总结,来解决这一问题。

使用知识图谱

几分钟内,GraphRAG CLI 就能在你的文本上产出全局洞察局部上下文——无需 Python。若你需要更多可控性与灵活度,生产级管道也可通过 neo4j-graphrag-python 包用少量代码实现。借助官方 neo4j-graphrag 库,你只需配置 Neo4j 连接、定义嵌入器与检索器,就能立即获得完整的 GraphRAG 能力。用于教学或本地实验,轻量工具如 nano-graphrag 或社区仓库(如 example-graphrag)也能用几百行 Python 展示端到端流程。

该体系利用图数据库/知识图谱来存储与查询互联数据。在 GraphRAG 中,检索阶段不仅拉取相关文档或片段;它还会分析并检索图中的节点与边,以呈现数据中的复杂关系与上下文。GraphRAG 包含三大组件:

  • 知识图谱(Knowledge graph)
    用图的形式存储数据,实体(节点)与关系(边)显式定义。图数据库在管理关联数据和支持多跳/多关系复杂查询方面效率极高。
  • 检索系统(Retrieval system)
    负责高效查询图数据库,抽取与输入查询或上下文最相关的子图节点簇
  • 生成模型(Generative model)
    将检索到的图数据作为依据进行综合生成,产生连贯且语境丰富的响应。

GraphRAG 代表了智能体能力的一次重要跃升:它能在复杂的互联数据基础上进行检索与生成。随着技术演进,它将开启更多前沿应用,使系统更聪明、具备更强上下文感知,并能处理日益复杂的任务。知识图谱改变了信息被检索与用于生成的方式,使不同应用中的回答更智能、贴合语境且更准确。本文不展开算法细节;目前已有多个开源实现,落地到你的数据集也日益容易。如果你的数据集很大、需要复杂推理,而“切块+向量检索”的标准做法开始遇到瓶颈,GraphRAG 虽然更贵、更复杂,但在实践中常能取得更好效果

构建知识图谱

知识图谱以结构化且富语义的方式提供信息,是提升智能系统(包括 GraphRAG)能力的基石。构建高质量知识图谱的流程包括:数据采集、处理、集成与运维。方法论概览如下:

  1. 数据收集
    从数据库、文本文档、网站、用户生成内容等多源汇集数据,确保多样性与质量。在组织内部,往往是一组影响智能体输出的核心政策与文档
  2. 数据预处理
    清洗与预处理:去除无关/冗余信息、纠错、格式标准化,以降噪并提高后续实体抽取的准确度。
  3. 实体识别与抽取
    识别数据中的关键元素(作为图节点),如人物、地点、组织、概念等。常用 NER 等技术,可能需在大规模数据上训练的模型来进行高质量识别与分类。
  4. 关系抽取
    在识别实体后,解析并抽取连接它们的谓词作为边。非结构化数据的关系抽取较难,但基础模型的效果在持续提升。
  5. 本体设计(Ontology)
    定义图中的类别与关系,形成骨架/模式。设计本体即定义实体类型及可用关系类型,以系统化组织知识图谱,支持更有效的查询与检索。
  6. 图填充(Graph population)
    依据本体,将抽取到的实体与关系写入图数据库(如 Neo4j、OrientDB、Amazon Neptune),创建节点与边。
  7. 集成与验证
    将图与现有系统集成,并验证其准确性与实用性。包括跨库链接、实体消歧,以及确认图对领域的真实反映;可通过用户测试或自动化校验确保完整性与可用性
  8. 维护与更新
    图是动态体,需定期更新与维护:新增数据、更新现有信息、随着新实体/关系类型出现而迭代本体。自动化与 ML 模型可显著提升维护效率。

构建知识图谱能显著改善复杂/多跳检索。通常做法是基于 RDF 数据模型抽取语义三元组(主语-谓语-宾语) 。基础模型如今已相当擅长三元组抽取,使得大规模构图成为可能。见图 6-3。

image.png

图 6-3. 知识图谱构建流程。 文档经模型处理抽取主谓宾式的语义三元组(如“Jay-Z,配偶,Beyoncé”),结构化为知识图谱,便于高效的语义查询与推理。

为了进一步降低门槛,如今搭一个基础的 GraphRAG 流水线相当简单:微软的 GraphRAG 库(pip install graphrag)提供 CLI,可直接对文档集做索引与查询——几乎零配置。例如:

pip install graphrag
mkdir -p ./ragtest/input
curl https://www.gutenberg.org/ebooks/103.txt.utf-8 -o ./ragtest/input/book.txt
graphrag init --root ./ragtest
graphrag index --root ./ragtest

graphrag query \
--root ./ragtest \
--method global \
--query "What are the key themes in this novel?"

graphrag query \
--root ./ragtest \
--method local \
--query "Who is Phileas Fogg and what motivates his journey?"

若你偏好可编程控制,Neo4j GraphRAG Python 包可用少量代码(连接 Neo4j、定义嵌入器与检索器、发起查询)构建完整 GraphRAG 管道。面向轻量或教学的实现,社区也有 nano-graphrag、示例仓库(如 example-graphrag)等,几百行代码即可拆解核心流程。

对想把原型推进到稳健、可扩展系统的团队,Neo4j 尤其合适:作为企业级图数据库,它的原生图存储与无索引邻接架构保证图扩展到数十亿节点/关系时仍能近似常数时间遍历。生产部署通常采用 Neo4j Enterprise/AuraDB,提供集群、容错、ACID 与多区域支持。使用 Neo4j 的 GraphRAG 工具链或基于 Cypher 的流程完成实体抽取与关系定义后,即可顺滑走向规模化部署:

  • 用 Cypher(CREATE/MERGE批量入库,实现干净、去重的图;
  • 增量加载避免重复;
  • 通过读写集群、缓存分片与优化查询规划器提升性能

简言之,Neo4j 让你从 Notebook 原型顺利过渡到生产级、图后端的 RAG,同时兼顾性能、可靠性与可维护性。

当你定义好本体并抽取出实体与关系后,就可以开始填充知识图谱。在 Neo4j 中使用 CypherCREATE 子句指定带标签与属性的节点,并用有向关系连接。最佳实践是:先加载/匹配已存在的节点以避免重复,再单独为每条关系发 CREATE。按“创建节点 → 匹配节点 → 创建关系”的步骤组织脚本,便于调试与扩展。示例:

// Create nodes for concepts and entities
CREATE (:Concept {name: 'Artificial Intelligence'});
CREATE (:Concept {name: 'Machine Learning'});
CREATE (:Concept {name: 'Deep Learning'});
CREATE (:Concept {name: 'Neural Networks'});
CREATE (:Concept {name: 'Computer Vision'});
CREATE (:Concept {name: 'Natural Language Processing'});

CREATE (:Tool {name: 'TensorFlow', creator: 'Google'});
CREATE (:Tool {name: 'PyTorch', creator: 'Facebook'});
CREATE (:Model {name: 'BERT', year: 2018});
CREATE (:Model {name: 'ResNet', year: 2015});

// Create relationships between concepts
MATCH
  (ai:Concept {name:'Artificial Intelligence'}),
  (ml:Concept {name:'Machine Learning'})
CREATE (ml)-[:SUBSET_OF]->(ai);

MATCH
  (ml:Concept {name:'Machine Learning'}),
  (dl:Concept {name:'Deep Learning'})
CREATE (dl)-[:SUBSET_OF]->(ml);

MATCH
  (dl:Concept {name:'Deep Learning'}),
  (nn:Concept {name:'Neural Networks'})
CREATE (nn)-[:USED_IN]->(dl);

MATCH
  (ai:Concept {name:'Artificial Intelligence'}),
  (cv:Concept {name:'Computer Vision'})
CREATE (cv)-[:APPLICATION_OF]->(ai);

MATCH
  (ai:Concept {name:'Artificial Intelligence'}),
  (nlp:Concept {name:'Natural Language Processing'})
CREATE (nlp)-[:APPLICATION_OF]->(ai);

// Create relationships to tools and models
MATCH
  (tensorflow:Tool {name:'TensorFlow'}),
  (nn:Concept {name:'Neural Networks'})
CREATE (tensorflow)-[:IMPLEMENTS]->(nn);

MATCH
  (pytorch:Tool {name:'PyTorch'}),
  (nn:Concept {name:'Neural Networks'})
CREATE (pytorch)-[:IMPLEMENTS]->(nn);

MATCH
  (nlp:Concept {name:'Natural Language Processing'}),
  (bert:Model {name:'BERT'})
CREATE (bert)-[:BELONGS_TO]->(nlp);

MATCH
  (cv:Concept {name:'Computer Vision'}),
  (resnet:Model {name:'ResNet'})
CREATE (resnet)-[:BELONGS_TO]->(cv);

MATCH
  (tensorflow:Tool {name:'TensorFlow'}),
  (bert:Model {name:'BERT'})
CREATE (bert)-[:BUILT_WITH]->(tensorflow);

MATCH
  (pytorch:Tool {name:'PyTorch'}),
  (resnet:Model {name:'ResNet'})
CREATE (resnet)-[:BUILT_WITH]->(pytorch);

// Query for finding relationships between concepts
MATCH path = shortestPath(
  (concept1:Concept {name: 'Natural Language Processing'})-[*]-(concept2:Concept 
      {name: 'Deep Learning'})
)
RETURN path;

// Query for finding all models that use TensorFlow
MATCH (model:Model)-[:BUILT_WITH]->(tool:Tool {name: 'TensorFlow'})
RETURN model.name AS model, model.year AS year;

加载完成后,你的知识图谱即可支持多跳遍历(如 shortestPath)和丰富的关系模式,这远超平面表或纯向量库能表达的能力。这为高级 GraphRAG 工作流奠定基础——智能体可在运行时沿图遍历,收集跨多度关系的上下文,实现对结构化知识的强力推理。你可以在图上查找某个元素,再取回与其相距一跳或多跳的所有元素。见图 6-4:当回答复杂问题时,控制器会遍历图并进行多跳推理,扩展系统可回答问题的范围与复杂度。

image.png

图 6-4. 利用知识图谱回答问题。 控制器将用户问题路由到知识图谱,检索相关的结构化信息,与语言模型推理结合,返回语境丰富、由多跳信息支撑的答案。

动态知识图谱的前景与隐忧

动态知识图谱在实时应用中的知识管理与利用上更进一步。图会随新信息持续更新、适应上下文变化,这能显著强化 GraphRAG。然而,它也带来特定挑战。本节概述其收益与风险,并提醒:原型化容易,生产化艰巨,需谨慎设计“如何高效取回任务所需上下文”。

同时,模型架构的进步正把上下文窗口推向史无前例的长度:如 Google 的 Gemini 2.5、OpenAI 的 GPT-4.1 支持百万级 token(约 75 万词、2,500+ 页),可以在一次前向中“记住”并处理整本文档,催生了无检索式的大上下文生成。一些无索引 RAG系统将检索逻辑“内嵌”到长上下文模型中,由模型在内部完成切块与相关性评分,从而简化了管线:智能体不再编排独立的检索/排序节点,而是把整份知识库(如手册或规格)直接载入提示,依赖注意力机制找出相关段落。

无检索方式也有权衡:一次处理百万 token 需要大量算力,会带来时延与成本,可能抵消流水线简化带来的收益;而且模型也不保证总能在海量上下文中准确定位所需那一处信息。尽管未来随着模型、上下文与算力增长,复杂的文本/向量检索也许会被边缘化,但当下的业界共识是:混合架构仍有价值——即便在多页上下文下,RAG 在事实查询企业用例中仍常优于纯长上下文模型,尤其当时效性精排很关键。实践中,很多生产系统会结合扩展上下文与选择性检索,在性能、成本与事实准确性之间取得平衡。

动态图在实时信息处理上尤为有利,可整合新闻、社媒、监控等不断变化的数据,确保回答基于最新且相关的信息。另一个优势是自适应学习:图能连续自更新,无需频繁再训练或人工批量更新;这在医学、技术、金融等快速演进领域至关重要。知识图谱以结构化方式提供可操作的关键信息,相比向量库有更大的灵活性,尤其有助于把握实体的丰富语境。

但其缺点也必须严肃对待:

  • 维护复杂度:持续注入新数据易引入错误与不一致,并可能在图中传播
  • 资源开销:更新、验证与维护动态图的计算成本高,图越大越复杂,越考验可扩展性;
  • 安全与隐私:涉及用户或敏感数据时,必须严格遵循合规;实时性会增加合规难度与风险;
  • 依赖与过度信任:若过度依赖图的自动洞察,可能忽视图未覆盖的外部因素。

缓解策略包括:健全的自动化验证机制;使用分布式数据库/云计算构建可扩展架构;强化安全措施(加密、访问控制、匿名化)以满足法规;在关键决策中保持人类监督,避免“自动驾驶式”失误。

记笔记(Note-Taking)

该技巧中,基础模型被提示仅对输入上下文做笔记,而非直接答题——类似我们在人类阅读时写页边批注/段落小结。笔记在问题呈现之前生成,并在求解时将这些笔记与原始上下文交错使用。实验显示,该方法在多种推理与评测任务上效果良好,并有潜力适配更广的场景。见图 6-5:在传统“原味”推理中,模型接收上下文与问题后直接给答;在链式思维(CoT)中,模型先推理再作答;在自我笔记(self-note)中,模型先对上下文的多个部分生成笔记,再对问题生成笔记,最后生成答案。图 6-5 展示了笔记如何通过在最终作答前将模型生成的笔记与原始上下文交织,来加强标准推理流程。

image.png

图 6-5. 记笔记式工作流。 标准流程中,模型直接处理上下文与问题生成答案;“笔记法”中,模型先对上下文部分与问题分别生成笔记,再产出最终答案,从而实现更深入的推理与更好的任务表现。

结论

记忆对智能体系统的成功至关重要。虽然仅依赖“近期交互”的上下文窗口这一标准做法足以覆盖许多用例,但在更具挑战性的场景中,投入更健壮的记忆方案会带来显著收益。本文探讨了多种路径,包括语义记忆、GraphRAG,以及工作记忆。

本章深入阐述了如何构建并利用记忆来增强智能体能力:从管理上下文窗口等基础概念,到语义记忆与向量库的高级应用,再到动态知识图谱与工作记忆等新实践,我们覆盖了在智能体系统研发中起关键作用的一系列技术与方法。

在智能体应用中,记忆系统不仅是“存数据”,更在于重塑智能体与环境及终端用户的交互方式。通过持续改进这些系统,我们可以构建更智能、更敏捷、更有能力的智能体,使其更高效地完成更广泛的任务。下一章将探讨智能体如何从经验中学习,并随时间自动改进。