这个想法看起来很简单:把所有笔记放在一个文件夹里,让代理去处理,然后得到一个记得一切的助手。实际上,代理找到的不是你想要的,混淆文档,忘记五分钟前说过的话。原因在于它的内存工作方式。

代理没有内存

模型只有一个上下文窗口,它只存活一个会话。其中包含当前对话的消息和文件、规则、技能以及如果工具维护的话来自过去会话的简短笔记。其他一切对模型来说不存在。

所谓的代理内存由两部分组成:外部存储和一个从中提取所需片段并将其放入上下文的机制。这个机制称为RAG。

什么是RAG

RAG代表Retrieval-Augmented Generation。名称中有三个步骤:

  • Retrieval — 从存储中找到适合问题的片段。
  • Augmented — 将它们添加到请求中。
  • Generation — 从依赖添加文本的模型获取答案。

这样就解决了上下文限制的问题。你不能把整本书或笔记库放在请求中:要么放不下,要么太贵。RAG只向模型传递精华部分。

它如何逐步工作

数据准备。文本被切割成小片段,称为块。每个块通过embed模型,将其转换为长数字序列,即嵌入。这些数字描述了文本的含义。嵌入被存储在向量数据库中。

问题处理。用户的问题也被转换成嵌入。数据库将其与保存的嵌入进行比较,并找到最相似的。这就是语义搜索:按意义匹配,而不是按词匹配。

上下文组装。找到的块的文本被代入请求中并发送到模型。

代理的任何内存工具都建立在这三个步骤之上。只是细节不同。

RAG是开发,不是按钮

没有现成的"Claude Code的RAG"在一个文件中。这是一个单独的工程学科,有两条路:自己构建流程或连接现成的解决方案。以下是两者。

自己构建:基础

最方便的是从LlamaIndex框架开始。这是一套为每个RAG任务准备好的模块。它可以单独覆盖整个管道,也可以将更强大的工具联系在一起进行单独的步骤。有三个阶段:分块、嵌入、向量数据库。

分块

搜索按块进行,因此分块对其他所有内容都有影响。主要策略:

  • 按大小。文本每400–512个标记切割一次,不考虑含义。快速且可预测,但句子或表格可能被切割。重叠可以救援:一个块末尾的10–20%在下一个块开始时重复。
  • 递归。按自然边界切割,首先按段落。可以设置自定义分隔符,因此该方法也适用于代码。
  • 按句子。收集完整的句子,直到达到限制。思想不会中断,但长句子会产生太大的块。对对话和问答很好。
  • 按页面。一页 — 一个块。适用于PDF、报告和演示文稿,其中保持表格与其标题相邻很重要。
  • 语义。计算每个句子的嵌入,并在相邻句子意义分歧的地方切割。更准确,但每次调用嵌入模型都需要时间和金钱。
  • 使用模型的力量。文档交给语言模型,它自己决定边界在哪里,同时为每个块编写简要描述。最昂贵和最慢的方法。
  • 后期(late chunking)。模型首先处理整个文档,以便每个词都获得整个文本的上下文,然后文本才被分割成块。这是在常规切割之上的额外层。需要一个具有长上下文的嵌入模型。

选什么。从递归切割400–512个标记开始,重叠10–20%。有一个分析表明,简单的递归512标记切割在答案准确性方面优于复杂方法。语义和模型分块对大型数据库中的分析任务有意义。

通常有两件事更有用:

  • 块的元数据(标签、日期、文档类型)及对其进行过滤;
  • 在切割前清理源文件中的垃圾。

工具。简单的管道LlamaIndex就足够了。如果需要更多策略和速度,可以查看Chonkie库。对于PDF和Office文件,以下内容会有用:

  • pytesseract, pdf2image, PIL — 用于识别扫描件的基本组合。
  • LlamaParse — 来自LlamaIndex生态系统的解析器,保存表格和多列布局。
  • Unstructured — 从PDF、Word、PowerPoint、HTML和电子邮件中提取文本,保留标题和列表。
  • Docling — 具有广泛格式支持的类似任务工具。
  • pdfplumber — 提供文本以及单词坐标,因此可以显示引用来自文档的哪个位置。

对于Markdown笔记,LlamaIndex有一个解析器,可以在块的元数据中保留标题结构。

嵌入

不应该在这个阶段卡住:有很多嵌入模型,对于个人数据库来说它们之间的差异很小。可以使用本地多语言模型,如paraphrase-multilingual-MiniLM-L12-v2或nomic-embed-text。

特殊情况是多模态模型,如Gemini Embedding 2。它们将文本、图片、音频、视频和PDF转换到一个语义空间中,无需为每种格式构建单独的链。该模型是收费的。

向量数据库

嵌入被存储在这里并进行搜索。数据库可以是本地的或云端的。本地数据库在RAM中保存向量,因此需要配置为保存到磁盘。否则重启后一切都需要重新计算。在云中,提供商负责处理。

  • Pinecone — 云端,无需管理。有混合搜索和元数据过滤。付费,不在本地安装。
  • Qdrant — 开源且快速,具有发达的过滤功能。本地安装的好选择。
  • Chroma — 轻量级,一条命令即可安装。适合原型和小型个人数据库。
  • Milvus — 用于非常大的数据量,可在本地和云中工作。
  • pgvector — PostgreSQL扩展。如果数据已经在Postgres中,很方便。

接下来,管道可以与代理一起构建:你已经了解这些步骤和术语,可以描述你想要什么。

还有哪些其他类型的RAG

Graph RAG

普通RAG将文本切成独立的片段,丢失了它们之间的连接。图形变体从文本中提取实体和它们之间的关系,并将其存储在图形数据库中。代理不仅看到片段,还看到它与什么相关。这种方法在连贯文本上效果很好:书籍、文章、转录、个人笔记。对于分散的表格,效果较差。

对Obsidian用户的重要说明:[[note]]形式的链接对图形管道没有任何帮助。对它来说这是普通文本,它自己构建连接。

工具:Microsoft GraphRAG作为框架,Neo4j作为图形数据库,Gephi用于可视化。深入学习有Essential GraphRAG这本书。

Agentic RAG

这是任何管道之上的一个层。代理自己管理搜索:解析请求,选择工具,评估发现,如果数据太少则用不同的措词重复搜索。循环继续,直到有足够的上下文来回答。

工具:简单情况下用LangChain,需要循环、分支和自检时用LangGraph。

Hierarchical RAG

文档被分成大的父片段,这些片段再分成小的子片段。在子片段中进行搜索,因为它们的噪音更少,而模型返回完整的父片段。这解决了一个古老的困境:小块准确,但上下文贫乏,大块相反。

在LlamaIndex中,有RaptorPack,以及HierarchicalNodeParser和AutoMergingRetriever对:第一个将文档切割成多个级别,第二个将找到的小片段粘合成父片段。

现成的解决方案

几乎所有列出的工具都通过MCP连接到代理。

  • Mem0 — 开箱即用的管道,支持云端或本地部署。融合向量搜索、图谱和元数据,能够重新排列结果。记忆自动充实:系统从对话中提取关键事实和解决方案。图谱部分明显比向量部分更简单。
  • QMD — Markdown笔记本地搜索工具。本地模型扩展查询,然后并行执行关键词搜索和语义搜索,结果合并并重新排列。分块时考虑Markdown结构。对内存需求较高。
  • OpenViking — 将记忆以文件系统形式存储,地址格式为viking://。每条记录有三个细节级别:简短摘要、概览和完整文本。搜索先选择合适的目录,然后逐层深入,因此更易于验证。
  • Graphiti — 在图数据库基础上的扩展,将事实与时间关联:实体何时出现、关系如何变化、事实何时过时。适合不断变化的数据,比如项目历史记录。
  • Hindsight — 具有四种记录类型的图谱记忆:世界事实、代理经验、带置信度评分的观点和观察。可按语义、关键词、图谱和时间搜索。安装后即刻可用,通过插件集成到Claude Code。
  • Cognee — 可配置的知识引擎:向量、图谱和元数据。接受数十种格式,自动构建实体图谱,数条命令即可启动。

如何开始

  1. 建立最小管道:递归分割、本地嵌入模型、Chroma或Qdrant。
  2. 用十个真实问题测试它。
  3. 添加元数据和过滤器。
  4. 仅在发现具体搜索错误的地方增加复杂性。

文章中大多数工具在本地安装时是免费的。