跳到主要内容

reading-notes — unlocking-data-genai-rag(通读积累)

真实章结构(按 spineId):全书 3 部 19 章。Part1=ch1-5,Part2=ch6-11,Part3=ch12-19。 文件 → 章映射:04=ch1 RAG是什么;05=ch2 代码实验室;06=ch3 实际应用;07=ch4 系统组件;08=ch5 安全; 10=ch6 Gradio接口;11-30=ch7 向量与向量库;31-49=ch8 相似检索;50-71=ch9 定量评测; 72=ch10 LangChain核心组件;73=ch11 LangChain进阶;75=ch12 agent+LangGraph;76=ch13 本体知识工程; 77-87=ch14 GraphRAG;88-108=ch15 语义缓存;109-128=ch16 agentic memory;129=ch17 记忆代码; 130-136=ch18 LangMem程序性记忆;137-153=ch19 完整记忆集成。导航章:01,02(preface可读),03,09,30,71,108,153-156。

Preface (02-fm-preface.txt)

  • L14: 第二版立场——RAG 已从「检索内容」扩展为 semantic caches / episodic memory / 知识图谱 / agentic memory 的底座。
  • L17: AI 版图转向 agent 架构;RAG 是 agentic memory 的骨架。L20: 第二版反映这一转变。
  • L23: 技术清单:LangChain、LangGraph、Neo4j、Chroma、OpenAI;向量库/向量化/向量搜索、提示工程、知识图谱、语义缓存、CoALA 记忆框架(working/episodic/semantic/procedural)。
  • L39: Part 3 = agentic RAG:agents+LangGraph→本体+GraphRAG→语义缓存→agentic memory(claim: 全部高级模式都建在 RAG 上)。
  • L120-129: ch16 CoALA+Mem0/LangMem/Zep对比;ch17 episodic+semantic 代码;ch18 LangMem 分层程序性记忆(user/community/task/global);ch19 prompt_memory/gradient/metaprompt 学习算法+域转换框架。

ch1 What Is RAG (04, 695行)

  • L55: RAG 最初动机——LLM 没见过公司私有数据。
  • L74-86: 五优点:准确性/相关性、定制、灵活、扩展训练外知识、减少幻觉(RAG 有据可查)。
  • L100-118: 挑战:garbage in garbage out(L100);数据要清洗(PDF 账单例,L103);计算开销(单次 LLM >1s,叠加多步、多次调用,L106);数据存储爆炸(同一数据多形态:向量库,L109);信息过载(需过滤排序,L112);幻觉需要验证层且该层本身依赖 RAG 数据(L115);组件复杂度高(L118)。
  • L150/153/156: prompting vs prompt design vs prompt engineering 三分。
  • L163: LangChain 2025-02:99k stars、月下载 2800 万;2025-05 单月 7000 万超过 OpenAI SDK。L166: LlamaIndex 2025-10 月下载约 520 万,专注检索/索引。
  • L175: inference 定义。
  • L185-209: agent 词汇:agentic AI、tool calling、MCP(Anthropic 开放标准)、ReAct、CoT、agent memory(短/长期)、orchestration、HITL(on hotpath)vs HOTL(off hotpath,L206)、multi-agent。
  • L219: 上下文窗口定义(单次能处理的 token 上限)。Table 1.1(L238-420):4,096(GPT-3.5 Turbo 0613/Llama2)→8k→8,192(GPT-4)→16,385→32k→128k(GPT-4o/Llama3.1/DeepSeek R1&V3)→200k(Claude)→258k(Qwen3-Max)→400k(GPT-5 API)→512k(Llama 4 Maverick)→1M(Gemini 1.5/2.5、Claude Sonnet 4)→2M(Gemini 2.0 extended)→10M(Llama 4 Scout)。L430: DBRX 32k→Scout 10M = 300 倍;按 token 计费,别乱塞。
  • L566: lost in the middle;needle in a haystack 已改善、multiple needles 仍难;对策:关键信息放开头结尾。
  • L436-439: FMFT vs PEFT。L557-560: 微调擅长教任务/口吻,不利于事实回忆;类比:背长文几个月后忘细节(长期记忆)vs 输入新鲜(短期记忆)。L563: 早期 GPT-3.5 4,096 token ≈ 5 页;现在 1-10M ≈ 1,000-10,000 页。L573: token≠word,ice cream 两 token;窗口含输入+输出。L578: 微调成本因 LoRA/量化/representative fine-tuning 大降。
  • L581: 结论——RAG 管事实,微调管任务与领域口吻。
  • L594-604: 三阶段:索引(查询前)、检索、生成。L611-638: 技术步骤 7 步:查询向量化→向量搜索→返回结果+唯一键→取回原文→过滤/后处理→拼提示词→LLM 应答。L630: 原书提示词模板「You are a helpful assistant for question-answering tasks… If you don't know the answer…just say you don't know」。

ch2 Code Lab: An Entire RAG Pipeline (05, 776行)

全书后续代码的地基章。11 步搭完整 RAG 管道:LangChain+Chroma+OpenAI。

  • L37: 代码在 github.com/PacktPublishing/Unlocking-Data-with-Generative-AI-and-RAG-Second-Edition。
  • L43: 作者自述:旅行时用 Chromebook+Colab;活跃时云费用可超 $1,000/月,所以本地 VS Code 跑 Jupyter 省钱(L46)。
  • L67: 选型提醒——不必总用最贵模型;例:Meditron(Llama 2 医学微调版)在医学域可能更好;LLM 可互查。OpenAI API 预付费最低 $5(L114),credit 一年过期。
  • L139-152: 固定版本安装 langchain==1.1.0 等langchain 1.x 全家桶。
  • L263: RecursiveCharacterTextSplitter 递归按 [" "," "," ",""] 切,保段落→句子→词。
  • L355-364: WebBaseLoader+SoupStrainer 只抓 post-content/post-title/post-header 三类 CSS;L406: 换网页要看 CSS 类,爬网页有很多这种坑。L349: 换网页要重启 kernel 否则两页内容都在库里。
  • L428-452: chunk_size=1000, chunk_overlap=200(L443-446: overlap 保边界上下文)。
  • L465: 选 Chroma 因为本地好跑;有些向量库提供免费 embedding(L468: OpenAI embedding 每条零点几美分)。
  • L471-474: Chroma.from_documents + as_retriever。L504: retriever 是做相似搜索的接口。
  • L510-512: 试检索:「How does RAG compare with fine-tuning?」。
  • L530-545: 检索+生成 6 步;L539: 把检索内容填进模板变量叫 hydrating。
  • L558-572: hub.pull("jclemens24/rag-prompt"),模板正文「You are an assistant for question-answering tasks… If you don't know the answer, just say that you don't know.」input_variables=[context, question]。
  • L608-609: format_docs 用 " ".join 把文档列表拼成字符串。
  • L638: llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0);gpt-4o-mini 便宜。
  • L652-658: LCEL 管道 rag_chain = ({"context": retriever | format_docs, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser())。L646: LCEL 可读且能优化速度。
  • L692: invoke("What are the advantages of using RAG?")。
  • L709-732: 输出示例(带 markdown 加粗三要点)。
  • L742: LLM 实际看到的完整 prompt(context 是检索回来的 chunk,截断展示)。
  • L734: 模型选择经济账——便宜模型+好提示可能就够。
  • L764: 作者自白:网上搜 RAG trouble 有百万级问题——「除了最简单的应用都有问题」;本书其余章节就是对付这些。

ch3 Practical Applications of RAG (06, 396行)

应用面章+小代码实验室(给答案加出处)。应用清单:客服/技术支持/金融/医疗聊天机器人、自动化报告、电商描述与推荐、内外部知识库、个性化、培训教育。

  • L58: RAG chatbot = 检索公司数据 + 生成连贯回答。
  • L82-85: 金融例:查信用卡利率——数据埋在数据库/PDF/安全层后面;RAG 机器人可答「你的利率是 21.9%」并附「你只付过两次利息」;可跨账户追问「我的信用卡利率比房贷高多少」;能记住整个对话上下文。
  • L91: 医疗例:新诊断糖尿病患者——分析病史/用药/化验给个性化建议+预约。
  • L106-109: 自动化报告:标准报告+初始分析问题自动喂给 RAG;报告数据+底层数据都进 RAG,让非技术员工直接追问数据,不用等分析师。
  • L121: 非结构化数据在索引阶段被转换:PDF 拆元素分级,标题/表头权重高于段落;图片识别成表格→表格摘要→向量化。
  • L151: 电商例:Rylee 常买环保产品→描述强调可持续性;买跑鞋+关注马拉松→描述强调缓震/稳定/耐久。
  • L169: Aubri 买徒步装备→推荐登山靴+袜子+背包+登山杖(连带购买)。
  • L217: LLM 直连做调研会幻觉;RAG 让 LLM 扎根真实数据;可加多次 LLM 调用验证相关性;可要求附全部引用。
  • L259: JIT(just-in-time)学习。L262: 识别组织内 SME(subject matter expert)牵线员工互学。
  • 代码实验室 3.1(L271-356):RunnableParallel 让 retriever 与 question 并行;rag_chain_with_source = RunnableParallel({context: retriever, question: RunnablePassthrough()}).assign(answer=rag_chain_from_docs);输出含 metadata.source,即每个片段的 URL 出处。lambda 匿名函数讲解(L303-310)。
  • L353: 出处对用户的价值:理解答案依据、事实核查、在其上继续。

ch4 Components of a RAG System (07, 519行)

把 ch2 代码按组件拆讲:索引/检索/生成 + 提示词/LLM/UI/评测。

  • L99: indexing 通常离线预处理(用户还没打开应用就做);实时索引少见。
  • L126: 数据都要变成可搜索格式(向量)。
  • L144: OpenAI API 用 BPE 分词;英文 1 token ≈ 4 字符;常见词单 token。
  • L149: embedding 服务 token 上限例:8191;chunk_overlap 要计入 chunk 大小;overlap 防止把法律文档里的地址切成两半找不到。
  • L157: Chroma+OpenAIEmbeddings 只是众多组合之一。
  • L167: retriever 在索引阶段定义、检索阶段使用——先建基础设施。
  • L239-251: 查询向量化的位置:.as_retriever() 内建了「把查询变成与库内同格式的 embedding 再检索」。
  • L258: 成本透明:OpenAI embedding $0.10/1M tokens;查询「What are the advantages of using RAG?」= 10 tokens = $0.000001。
  • L391-396: 关键实验:直接问 GPT-3.5「RAG 的优点」——它答成「Red, Amber, Green 项目状态报告」!GPT-3.5 训练截止 2022-01。证明:没有 RAG,连「RAG」这个词模型都可能理解错。
  • L451-456: 后处理:AIMessage(JSON)→ StrOutputParser → 纯字符串。
  • L474: UI 收集反馈(thumbs up/down)→ 反哺检索与生成质量。
  • L480-486: 评测维度:accuracy/relevance/response time/user satisfaction;详见 ch9。
  • L504: 引出下一章安全。

ch5 Managing Security in RAG Applications (08, 627行)

RAG 安全双向:RAG 本身是安全方案(限数据/可靠/透明)+ RAG 特有风险(黑盒/隐私/幻觉)+ 红蓝对抗。

  • L64-70: RAG 作为安全方案:按用户限数据访问、加密、内容更可靠、引用可溯源。
  • L106: 黑盒:主流 LLM 参数超 1 万亿,无法解释输出如何得出。L112: explainable AI 研究方向,但当前主流 LLM 都不可解释;替代:HITL、加第二个 LLM 审查(L115)。
  • L124: PII 监管成形中;Google/Microsoft 自定标准。
  • L127-130: 核心矛盾:RAG 给了「对客户数据前所未有的访问」,载体却是不完全理解的 LLM——做错是灾难。
  • L145: Economist 作家问「金门大桥第二次被运过埃及是什么时候」,ChatGPT 答「2016 年 10 月」。
  • L148: 2024-02 Air Canada 判例:聊天机器人幻觉丧亲票价政策(声称 90 天内可追溯申请),仲裁庭判退款,驳回「不为聊天机器人负责」抗辩——网站信息公司全责。
  • L151: Mata v. Avianca 2023:纽约律师用 ChatGPT 写状子,6 个假判例,被制裁。
  • L154: 2025-10 Deloitte 澳洲政府报告约 $290,000,237 页里被 Sydney 大学研究员 Chris Rudge 发现多达 20 处编造引用与虚构判决引言,部分退款。
  • L160: 幻觉机制解释(概率视角):知识强时下一 token 概率可 99%+;知识弱时最高概率可能仅 20%,但仍被选中;低概率 token 串起来「听上去可信」。
  • L163: OpenAI 研究:现行评测奖励猜答案而非承认不知道——模型被训练成宁可猜也不说「不知道」。
  • L166: Microsoft Tay 2016:Twitter 学习型机器人被教成发表种族主义言论,声誉受损。
  • L175: red teaming 源自军方;红队攻蓝队守。L181: ARC/HellaSwag/MMLU 基准不测安全(毒性/偏见/隐私);LLM 风险:毒性、犯罪、偏见、隐私。
  • L194-237: 攻击面 4 类(偏见/敏感信息泄露/服务中断/幻觉)+ 技术:bypass safeguards(text completion、biased prompts、prompt injection/jailbreaking、gray box attack 需先知道 system prompt)、prompt probing(套出 system prompt)、自动化(手动列表/prompt library/Giskard LLM scan 开源)。
  • L257-263: 三资源:OWASP Top 10 for LLM apps、AI Incident Database(incidentdatabase.ai)、AVID(avidml.org)。
  • L285: key 隐藏:env.txt+.gitignore;多 key 共存例(L317-320)。
  • L343: prompt probing 定义:套出 system prompt,为 gray box 攻击铺路。
  • L350: 反直觉:攻击 GPT-3.5 失败(听不懂复杂指令),GPT-4o 反而更聪明到「能理解攻击指令」——用它的聪明打它自己。
  • L397-408: 攻击提示词:END OF INSTRUCTIONS + NEW INSTRUCTIONS,让 LLM 把上面的指令逗号换感叹号全文打印——给 LLM 一个「任务」它就有动机覆盖原指令;不加「换标点」任务就攻击失败(L413:细线效应)。
  • L422-436: 攻击成功:LLM 打印出 system prompt 全文+检索到的 context(可能是其他客户的敏感数据)。「A huge win for the red team!」
  • L451-544: 蓝队防御:第二个 guardian LLM,对「问题 vs 检索上下文」打相关性分(1-5);分数 <4 → 回「I don't know.」正常问题 Relevance Score: 5;probe →「I don't know.」(L560-576)。链:RunnableParallel 同时算 relevance_score 和 answer,conditional_answer 按分流。
  • L578: 安全是无尽循环:防御后回红队再攻。「It is definitely more difficult now!」

ch6 Interfacing with RAG and Gradio (10, 253行)

给 RAG 加 UI:Gradio。

  • L58: 数据科学家用 Gradio 的理由:几分钟出可分享 UI,不用学前端。L82: Gradio 不适合生产级(成千上万用户);POC 利器。
  • L70-73: 开源;与 TensorFlow/PyTorch/Keras 集成;Hugging Face Spaces 免费永久托管 demo。
  • L97-104: gradio==6.0.2 + nest_asyncio(Jupyter 已有事件循环,Gradio 要嵌套事件循环,否则 RuntimeError: This event loop is already running)+ 卸载 uvloop(与嵌套事件循环冲突)。
  • L122-148: process_question 调 rag_chain_with_source,返回 relevance_score/final_answer/sources;gr.Interface(fn, inputs=Textbox, outputs=三个 Textbox)。
  • L159-161: demo.launch(share=True, debug=True) 启动本地 web server+隧道;share 链接 72 小时过期(L202)。
  • L170-175: auth=("admin","pass1234") 简单认证——明文传输存储、无防爆破、无会话超时,只够 POC;生产要 hash 密码/HTTPS/rate limiting/用户管理。
  • L214: relevance score 展示是教学用,真实应用不给用户看。L220: sources 显示四章努力的结果;例中 4 个来源相同(只有一个数据源)。

ch7 The Key Role Vectors and Vector Stores Play in RAG (11-30, ~20文件)

两行代码撑一章(向量化 Chroma.from_documents 一章、as_retriever 下一章,L52-70)。

  • L12(embeddings vs vectors): embeddings 是 NLP 语境下对 vector 的叫法;RAG 里 embeddings/vectors/vector embeddings 可互换。
  • 13(what is a vector): 数学表示(可算)、快(搜索比此前技术快)、精确(语义表示);Despicable Me 反派 Vector 台词「a quantity represented by an arrow with both direction and magnitude」——向量有方向和大小,不是一串数。
  • 15: 向量化出现在两处——原始数据索引时+用户查询时。
  • 14(dimensions): 问题「What are the advantages of using RAG?」→ 1536 维向量;前 5 维:-0.006319054113595048, -0.0023517232115089787, 0.015498643243434815, -0.02267445873596028, 0.017820641897159206(L16-18)。每数 17-20 位小数=64 位双精度浮点。L50: Embedding size: 1536。ada 默认 1536,截断会丢上下文(L55)。
  • L58-61: text-embedding-3-large 可变尺寸→Matryoshka embeddings(俄罗斯套娃);adaptive retrieval:先搜低维(快),锁定邻近后换高维精搜;提速 30-90%。
  • L33(quantization): 把高精度浮点压低精度,省内存省算力,但 lossy。
  • 22: embedding 质量不能只看通用基准:OpenAI ada-002 在 MTEB 61.0%,text-embedding-3-large 64.6%——不代表对你的应用好 3.6%;要用自己的数据实测(ch9 评测)。
  • 23 cost: OpenAI 最贵 embedding $0.13/M tokens;800 token 页=$0.000104;企业级乘起来可达 $1,000s-10,000s。
  • 24 network: API embedding 断网即瘫;不能配「备用本地模型」——查询必须用同一模型(L7)。
  • 25 speed: 网络延迟 vs 本地推理;本地不一定快(取决于模型);批量生成可优化。
  • 26 compatibility(重点): 不同 embedding 模型的向量不可比——即使同一厂商;OpenAI 三款互相不兼容;换模型=全部重嵌入。
  • 27: 数据源:SQL/NoSQL/NewSQL/数仓/数据湖;pgvector 例(团队 PostgreSQL 专长→顺手);SharePoint 等企业非结构化库是 RAG 第一批数据源(L17-22)。
  • 28(vector store vs vector database): vector database=专门数据库(Pinecone/Milvus/Weaviate);vector store=伞术语,含 pgvector 扩展、FAISS 库;LangChain 抽象层用 vector store,本书从之(L19)。
  • 28 架构(L25-40): 索引层(KD-tree、HNSW——多层连接图,随机起点跳向最相似,免全库比对)+存储层+处理层(可选)。
  • 17: 相似搜索=算查询向量与库内向量的距离;返回按距离排序;生产中 chunk 带 foreign key 指回完整内容(L21)。
  • 17(The amount of text you vectorize matters): 此章代码换用 SemanticChunker(embedding_function)(L47)——按语义切;不管文本多长,embedding 维度恒定(1536),短查询与长 chunk 可比(L58-61);chunk 越大语义越稀释、越小上下文越少——要平衡(L64)。
  • 17(Not all semantics): 常见错误=用第一个向量化算法不测;bark(狗叫)vs bark(树皮)老模型分不清;领域模型(科学论文训练)在专业域更好;embedding 模型也能微调(L83)。
  • 18 TF-IDF: 1972,Karen Spärck Jones 提出 IDF:「the specificity of a term can be quantified as an inverse function of the number of documents in which it occurs」;莎士比亚 37 部剧:Romeo df=1/idf=1.57 最高;sweet df=37/idf=0——只出现在少数文档且高频的词才是文档的特征。sklearn 实现;输出 top IDF 全是数字(1024/192/2024)——TF-IDF 无语义理解+语料未清洗的教训(L52-57)。sparse vs dense 向量之分(L36)。TF-IDF top 文档与 OpenAI retriever 结果一致(L80)——小语料上「1972 年的小算法打平 OpenAI」,但真实场景(大数据/复杂查询)不行(L82)。BM25 基于 TF-IDF(下章)。
  • 19 Word2Vec/Doc2Vec/Sentence2Vec: 无监督学习;word/doc/sentence 三级;选 Doc2Vec(整文档),vector_size=100 时检索结果与 OpenAI 不同;改成 1536 后一致但结果不稳定(L66-84);比 TF-IDF 强在神经网络看上下文。
  • L37: 「你也算训练过语言模型了——TF-IDF 和 Doc2Vec 都是」。
  • 20 BERT: 110M 参数 bert-base-uncased;768 维;预训练(Wikipedia+BookCorpus,预测下一句);未微调直接用,top 结果跑偏(法律文档 chunk)——本地小模型在专业域需微调(L53-63)。
  • 21: bert-large=340M。OpenAI embedding 现基于 GPT-4o-mini 架构;GPT-3≈175B、GPT-4≈1.76T 参数;GPT-5 估计 3-5T 参数、训练数据 114T tokens≈85-90T 词,约为 GPT-3(17T 词,45TB)5 倍。BERT 训练语料 3.3B 词 vs GPT-3 17T 词。OpenAI 三款:ada-002(GPT-3)、text-embedding-3-small/large(GPT-4,支持 Matryoshka)。Google gemini-embedding-001(2025-07 GA):3072 维、100+语言、MTEB 多语言榜首;AWS Titan V2(2024-05):8192 tokens/5 万字符,512 维保 99% 精度、256 维 97%;Cohere Embed v4(2025-10):128k 上下文≈200 页文档。
  • 29 常见向量库:Chroma(开源 Apache 2.0,简单,自托管;批量更新后要手动重建索引)、LanceDB(多模态 lakehouse,compute-storage 分离)、Milvus(云原生、K8s、GPU 索引 CAGRA;2.6 版 100x 性能)、pgvector(0.8.0:halfvec 4000 维/sparsevec 1000 非零维;9x 查询提速、100x 相关性)、Pinecone(全托管;2025-02 二代 serverless;RBAC/审计日志;贵)、Weaviate(Go 写;v1.31 MUVERA 编码;schema 优先;GraphQL)。选型六要素:现有基础设施兼容/扩展性能/易用维护/安全合规(GDPR/HIPAA)/成本许可/生态集成。

ch8 Similarity Searching with Vectors (31-49, R=检索专章)

  • 31: 层级:vector search ⊃ similarity algorithm ⊃ distance metric(L64-68)——常被混用的三个词是三层。vector space=embedding space=latent space(L83)。2D 图示:查询 X 的四个结果(大点)看着不如某些小点近,但那是在 1536 维里算的——投影到 2D 骗眼睛(L86-93)。
  • 32 语义例:两句毯子评论(cozy temperature / warmer and snug)vs 无关句「Taylor Swift was 34 years old in 2024」;sentence_transformers 的 paraphrase-MiniLM-L6-v2 模型,384 维输出(3, 384);all-mpnet-base-v2 性能高约 50%。MTEB:all-mpnet 57.8% / ada-002 61.0% / text-embedding-3-large 64.6% / NV-Embed-v2 69.32%(2025 领先);MTEB 被批评过拟合基准;Mistral-embed 在某些检索任务 77.8% 胜过更贵的 OpenAI 模型。
  • 33 Euclidean (L2): 算最短距离,越低越相似。4.62(两评论)/ 7.31(评论1 vs 随机)/ 6.34(评论2 vs 随机)。
  • 34 dot product: 不是距离而是投影量级,越高越相似;12.27 / -0.77 / 0.95。
  • 35 cosine: 方向差;0.452(两评论)/ 0.970 / 0.954。「Taylor Swift 不是暖毯子的语义等价物」(L32)。其他:Lin/Jaccard/Hamming/Manhattan/Levenshtein。
  • 36 dense search 边界:语义搜索依赖训练域;查序列号/代码/ID/人名等「指称」时语义差→用关键词。
  • 37 sparse search: 词袋计数,向量大多为零(sparse);BM25=基于 TF-IDF,常见词降权、稀有词高分。
  • 38 hybrid: dense+sparse 两路检索,RFF/RRF(Reciprocal Rank Fusion)融合;RRF 只用排名位置(1/rank),不归一化异质分数(L181-186)。代码实验室:换 PDF 数据源 google-2023-environmental-report.pdf(L76),RecursiveCharacterTextSplitter 切 1000/200;dense_retriever k=10 + BM25Retriever k=10;LangChain 一行版=EnsembleRetriever(L150)。sparse embedding 不入库、内存直用(L145);Chroma 本身 ephemeral,vectorstore.persist() 存 sqlite。
  • 39 k-NN: 暴力全比+排序取前 k;复杂度 O(n*d),数据翻倍时间翻倍;作者经验:25,000-30,000 embeddings、256 维用 k-NN,检索评测指标提升 2-6%,值得;最常用 Euclidean。
  • 40 ANN: 牺牲精度换速度;子线性查询时间;索引技术四件套:LSH(哈希分桶)、KD-tree/Ball tree(空间划分)、PQ(子向量+码本压缩)、HNSW(多层图);HNSW 比喻:飞机→火车→小范围找(L94);六度分隔灵感(L98-101);FAISS 与 pgvector 提供多种索引实现(L43)。
  • 服务面:pgvector(L2/cosine/L1/Hamming/Jaccard;唯一同时支持 exact+approx k-NN 之一;IVF+HNSW 组合)、Elasticsearch(分布式、全文+聚合+地理)、FAISS(Facebook,十亿级,GPU)、Vertex AI Vector Search(托管,ScaNN)、Azure AI Search(集成向量化+混合搜索+多模态)、ANNOY(Spotify,随机投影+树森林,小数据快)、Pinecone(2024 serverless GA,存算分离)、Weaviate(2025-03 AI agents)、Chroma(嵌入式,HNSW,2024 Chroma Cloud)。

ch9 Evaluating RAG Quantitatively and with Visualizations (50-71)

  • 50: 评测两个时机:构建中(换组件组合对比)+部署后(数据过时/用户查询漂移/基础设施问题)。金融例:五年分析报告语料,五级飓风类新事件超出语料——价值随时间衰减(L76-81)。
  • L94: 「不测就没法知道改了什么变好了/变坏了」;L97: 出错时定位:检索器?提示词?LLM?
  • 标准基准:embedding=MTEB(ArguAna/ClimateFEVER/FiQA2018/HotpotQA/MSMARCO/SciFact 等 15 数据集);向量搜索=ANN-Benchmarks(accuracy/speed/memory)+BEIR(zero-shot,MSMARCO/HotpotQA/CQADupStack);LLM=Artificial Analysis(质量/速度/价格)+Open LLM Leaderboard(ARC/HellaSwag/MMLU/TruthfulQA/WinoGrande/GSM8K)。
  • 54: 基准只管初选;真正要知道自己的系统好不好,必须自建评测。
  • ground truth(55-60):理想输出数据集;来源:人工标注(贵)/SME+规则模板(hydrating 例:手机客服模板「To resolve [issue], you can try [solution]」)/众包(MTurk)/合成(fine-tuned LM 或检索法代理)。狗癌症兽医研究例(L16-19)。
  • ragas 代码实验室(60-66):ragas==0.4.0;TestsetGenerator+SingleHopSpecificQuerySynthesizer 生成 10 个 QA(实际得 7 个);⚠️ 成本警告:10 个样本 6 个指标跑一轮 $2-2.50,LLM 调用上千次;结果存 CSV 避免重跑。三 LLM 分工:llm(主)/generator_llm(生成测试集)/critic_llm(评测,gpt-4o-mini)。
  • 指标结果(64-65):检索:context_precision 0.906(similarity) vs 0.841(hybrid);context_recall 0.950 vs 0.925;生成:faithfulness 0.978 vs 0.946;answer_relevancy 0.968 vs 0.965;端到端:answer_correctness 0.776 vs 0.717;answer_similarity 0.970 vs 0.969。本例 dense 全胜 hybrid(小数据集,作者提醒别过度解读)。
  • 64: ragas precision/recall 与传统 IR 的 precision/recall 概念相似但考虑排序与对齐,非二元判断。
  • 65: faithfulness=答案对 context 的事实一致性(0-1);answer_relevancy=答案与问题的贴合度;另有 context relevancy/context entity recall/aspect critique(二值,可自定义维度)。
  • 66 创始人 Shahul Es 见解:第一障碍=没有测试数据→合成;要人工审查合成数据;显式 vs 隐式反馈(隐式有噪声但有用);reference vs reference-free 指标——ragas 主推 reference-free(faithfulness、answer relevancy),部署场景没有 ground truth 也能评;ragas 论文 arxiv.org/abs/2309.15217。
  • 67-69: BLEU(n-gram 重叠,表层)、ROUGE(召回视角,覆盖率)、语义相似度(cosine/STS,不同措辞同义)。
  • 70: 人工评测仍不可替:连贯性/语气/矛盾/整体体验;组合多种评测。

ch10 Key RAG Components in LangChain (72)

三大件选项百科:vector store / retriever / LLM,每个都演示「换掉 Chroma/ChatGPT 的最小改动」。

  • L38: LangChain vector store 类是统一接口——换后端不动检索逻辑。L62: LangChain 现有 49 种 vector store 集成。
  • FAISS(L98-121): faiss-cpu/faiss-gpu(GPU 版需 NVIDIA+CUDA,Apple Silicon 不行);聚类+量化索引,GPU 并行比较。
  • Weaviate(L141-282): embedded 模式(随应用启停,数据持久);schema 强制(string/int/number/Boolean/date);GraphQL 风格但不直接用 GraphQL;批量操作 client.batch;注意 "id" 是内部保留字段要用 "doc_id"(L242);先 delete_class 再建(L185-188)。
  • L285: 换组件是 LangChain 的核心价值——「新向量库出来可以相对快速换掉」。
  • 检索器(L291-496): dense(as_retriever k=10)/score threshold(search_type="similarity_score_threshold", score_threshold=0.5)/MMR(search_type="mmr",兼顾相关与多样,防冗余)/BM25 sparse/EnsembleRetriever(weights=[0.5,0.5], c=0;c 是重排参数,非零时启用 rerank 模型)。
  • WikipediaRetriever(L430-465): load_max_docs=10;query「加勒比海盗黄金时代」→ Golden Age of Piracy 词条+title/summary/source 元数据。同类:PubMedRetriever、ArxivRetriever(200万+论文)、KayAiRetriever(SEC 财报)。
  • kNN retriever(L471-493): 反直觉论断——「kNN 精度仍优于 ANN;只是不扩展」;作者:百万级数据点+1536 维对小项目仍算小,优先 kNN,等到等待时间不可忍受再换 ANN。KNNRetriever.from_texts(splits, OpenAIEmbeddings(), k=10)。
  • L496: 还有 time-weighted retriever(新近性)与 Long-Context Reorder(治 lost in the middle)。
  • LLM 部分(L499-812): gpt-4o-mini 是 GPT-4 系最便宜但仍是 gpt-3.5-turbo 的 10 倍价;gpt-4-32k 反而不如 4o-mini 快和强、上下文大 4 倍——「别假设最新=最贵」。Together AI:200+ 开源模型 API;Llama 3.3 70B Turbo $0.88/M tokens、Mixtral 8x7B $0.60/M;同一 RAG 链换 Llama3/Mixtral 输出与 gpt-4o-mini 相当甚至更全,成本大幅更低。
  • L788: 所有 LLM 实现 Runnable 接口:ainvoke/batch/abatch/stream/astream;async 默认起线程跑同步方法;batch 用多线程或 asyncio.gather,max_concurrency 控并发。

ch11 Using LangChain to Get More from RAG (73)

三个配套组件:document loaders / text splitters / output parsers。

  • loaders(L43-208): 同一份 Google 环境报告 PDF 转 HTML/Word/JSON 再分别用 BSHTMLLoader/PdfReader/Docx2txtLoader/JSONLoader(jq_schema='.text')加载; loaders 产物可互换(docs 变量);不同 loader 会加自己的 metadata,要用 {**doc.metadata, "id":...} 合并(L184-195);PDF 提取器:PyPDF2/PyPDF/PyMuPDF/MathPix/Unstructured/AzureAIDocumentIntelligenceLoader/UpstageLayoutAnalysisLoader。
  • splitters(L211-368): 为什么切:embedding 模型输入上限(OpenAI 8,191 tokens,超了报错)+文档越大向量里语义稀释越重。ChunkViz(chunkviz.up.railway.app,Greg Kamradt)可视化:recursive splitter 在 434 chunk 处保住整段;character splitter 任何设置都切在句中(L223-240)。CharacterTextSplitter 坑:默认分隔符 \n\n,本文档没有双换行→永不切分(L284)!RecursiveCharacterTextSplitter 加 ". " 分隔符:段落→句子→词逐级;递归算法三步:找边界→切两半→对剩余递归(L345-356)。overlap 类比 CNN 滑窗(L297)。splitting=chunking 同义。
  • output parsers(L371-末): StrOutputParser(已知);JsonOutputParser+Pydantic BaseModel 定义 FinalOutputModel(relevance_score: float, answer: str);新版模型多内建 JSON/XML 结构化输出,这个 parser 是给不支持的模型用的(L404);两链合一,conditional_answer 相关时走 format_json_output。
  • Part 2 完。下一部分 Part 3 (ch12-19):agents/GraphRAG/缓存/记忆。

ch12 Combining RAG with the Power of AI Agents and LangGraph (75)

  • L46: agent 的祛魅定义:「把已经在用的 LLM 调用放进一个循环,任务完成才退出。就这么简单——it's just a loop, folks!」
  • L56: 图术语:node(椭圆框)/edge(线)/conditional edge(虚线=决策点)。
  • L68: LLM 是 agent 的大脑;L83: 与真实大脑不同,大脑可随时换/可多个互相校验。
  • L92: LangGraph 2024 年推出,基于 LCEL;旧的 AgentExecutor 仍在但 LangGraph 是官方推荐。两大能力:轻松定义循环图+内建记忆/持久化(L99-104)。
  • L115-128: ReAct=reason+act:思考→行动→观察→再思考…;论文 arxiv.org/abs/2210.03629;ReAct 等实现会过时但概念沉淀进 LangGraph。
  • L125: persistence 维持 agent 记忆,支撑多会话并行与 HITL;详见 ch16。
  • 代码实验室:agent 决定「检索本地索引还是 web 搜索」。工具:web_search=TavilySearchResults(max_results=4) + create_retriever_tool(ensemble_retriever,"retrieve_google_environmental_question_answers","Extensive information about Google environmental efforts from 2023.")(L205-210);工具名要写得啰嗦——那是给 LLM 看的说明书(L216);chat 模型普遍为 tool calling 微调过,非 chat 模型可能不会用工具(L227);toolkits=3-5 个相关工具的包(如 GitHub toolkit)(L236)。
  • AgentState(L260-263): TypedDict + Annotated[Sequence[BaseMessage], add_messages]——每个节点 append 不覆盖;状态只活在本轮执行(L267),跨会话记忆在 ch16。
  • score_documents 条件边(L339-448): Pydantic scoring(binary_score yes/no)+llm.with_structured_output;yes→generate,no→improve(改写问题后回到 agent 再检索)。improve 节点让 LLM 推断「语义意图」重写问题(L476-494)。
  • 图组装(L559-633): StateGraph(AgentState);add_node agent/retrieve(ToolNode)/improve/generate;set_entry_point("agent");agent→(tools_condition)→retrieve 或 END;retrieve→(score_documents)→generate 或 improve;improve→agent(回环);compile()。
  • 运行(L699+): graph.stream 逐节点打印;第一跳 agent 决定调用 retrieve_google_environmental_question_answers,tool_calls 带 id/arguments JSON。print 是 agent 的「想法」可视化。

ch13 Ontology-Based Knowledge Engineering for Graphs (76)

  • L14: 本体=领域知识的形式化表示,给 agent 显式的概念/关系/约束——向量相似与关键词之外的第三条路,换来了精确推理、可解释、事实落地。
  • L100: ontology 定义:classes/properties/relationships;业务规则、监管约束、实体逻辑连接都可显式编码。KG 核心概念与 ch12 相通:node/edge/path/hop/subgraph。
  • L112: RAG 是「重新专业化」——agent 要有明确的领域专长,本体是知识骨干。
  • L130-136: RDFS vs OWL:RDFS 定义类与属性层级(subClassOf),系统懂继承(员工是人,人有名字→员工有名字);OWL 加逻辑约束(「经理=管理至少一人的员工」「无人可既是公司又是人」)、对称/传递/基数关系;可自动推理出隐含事实、检测逻辑不一致。选型:简单层级用 RDFS,复杂建模/校验/推理用 OWL;很多项目从 RDFS 起步按需加 OWL。
  • 代码实验室:Protégé 5.6.5 建金融本体,OWL 2 DL,Turtle (.ttl) 语法(比 RDF/XML 可读,语义不变)。
  • 七步前期工程(L157-196):domain/scope(明确排除衍生品、期权、私募、价格数据)/purpose+users(个人投资者)/use cases/competency questions(本体的试金石):「AAPL 是股票还是债券?」「USTB 是什么工具?」「谁监管 MSFT?」「SEC 监管哪些股票?发行人是谁?」「你知道哪些股票/债券?」——ch14 用这些验证 KG。
  • 实体(L203-216): AAPL/MSFT/USTB;Apple_Inc/Microsoft_Corp/US_Treasury/SEC;层级 FinancialInstrument→Equity→Stock、FinancialInstrument→Debt→Bond、Organization→RegulatoryAuthority;关系 hasTicker(datatype)/issuedBy/isRegulatedBy/ownedBy;domain=谁能有此属性,range=属性取值类型——让 reasoner 能发现建模错误(L262)。
  • owl:Thing=OWL 内建根类,不可删(推理依赖)(L336)。disjoint classes:Equity 与 Debt 互斥→AAPL 不能同时是债务工具(L384)。bulk entry 用 tab 缩进粘贴(L321-331)。
  • 术语(L340): classes=类别,individuals=实例(「AAPL 是一个个例,不是一个人」),entities=构件总称,assertions=把实例和属性连起来的事实(hasTicker "AAPL")。
  • SKOS 注释(L565+): rdfs:label/definition/scope note/example/hidden label(同义词:equity share、common stock——帮检索)/alternative label;SKOS 概念:Concept/ConceptScheme/Collection;hidden label 的意义=用户搜「普通股」也能命中 Stock。
  • 产出 FinancialOntology.ttl → ch14 导入 Neo4j 回答五个 competency questions。

ch14 Graph-Based RAG (77-87)

  • 77 L32-38(术语!): 本章刻意不叫 GraphRAG——那是 Microsoft Research 的项目名:LLM 全自动建图/结构化/查询的完整管线,实体分组与搜索方式都不同(global search 看高层聚类概览,local search 缩放到具体节点);实验显示 GraphRAG 多跳问题胜过标准 RAG;论文 arxiv.org/abs/2404.16130,github.com/microsoft/graphrag。本书讲的是更简单的 graph-based RAG。
  • 77 五大优势(L53-71): 显式边遍历→过滤噪声返回精准子图;实体+同义词+消歧路径(治多义词);多跳推理(A→B→C 链);可解释可追溯(每个节点边带 provenance,监管域刚需);子图整体摘要而非碎片;异构数据源统一 schema;增量更新保新鲜,减少幻觉且免重训。
  • 77 L81-101: 循环图(,ch12 LangGraph,金融互相影响、假设驱动探索,要防死循环)vs 本体 KG(DAG 有向无环,is-a/part-of 类型层级,直接查询型,给 LLM 过滤出 schema 合规的事实)。两者是不同的图!
  • 78-87 代码实验室:turtle → rdflib 解析三元组 → 三份 CSV(nodes/edges/data)→ Neo4j Desktop 导入(bolt://127.0.0.1:7687);neo4j==6.0.3、rdflib==7.5.0、faiss-cpu。
  • 82: 导入用通用 :Resource 标签→补 rdf:type 成员关系 (:IS_A) 边,12 对(L61);锚点概念节点:All Stocks/All Bonds/All Orgs/All Regulators,:INCLUDES 连成员,幂等刷新;验证:All Bonds=1、All Stocks=2(L88)。
  • 84(核心机制 hybrid embeddings): 问题——用户问「equities regulated by the SEC」但图里标签是 Stock,边名也不知道。解法:把实体自己的信息+连接上下文拍平成一段自然语言文本再嵌入。AAPL 的 hybridText:「Stock AAPL [AAPL] issued by Apple Inc. regulated by SEC — A security representing equity ownership in a corporation. Issuer regulated by SEC.」——含类别/标签/ticker/发行人/监管者/注释/发行人的监管者(多跳二阶关系预埋进向量)。效果:equity 一词图里不存在也能命中(recall);语义搜索发现实体,Cypher 取回精确事实(两种检索互补)。作者断言:这是 KG-RAG 胜过纯向量 RAG 的最大原因(L63)。
  • 85(检索+扩展): vector_search(FAISS top-k)→graph_expand(Cypher *1..depth 取邻居)→build_llm_context;关键研究:Wu & Tsioutsiouliklis 2024——KG 表示格式实验:自然语言 44.6%、JSON 26.1%(反而低于基线!)、Python 静态字典 67.9%(比基线+78%);微调后 91.5%。原因:LLM 预训练见过大量代码,能把字典查找当显式推理步骤「执行」。输出格式
    'type'
    ['AAPL'] returns 'Stock'。引用 [E1][E2]。
  • 86(生成): rag_chain = make_context | chat_prompt | llm | StrOutputParser;五个 competency questions 全部答对:AAPL is a stock / USTB is a bond / MSFT regulated by SEC / SEC 监管的股票=AAPL(Apple Inc)、MSFT(Microsoft Corp) / 两只股票一只债券。Python 字典格式让 LLM 扎根结构化 KG 而非幻觉训练数据。
  • 87 最佳实践:持续用 Protégé 演化本体→定期导出重导入;约束/索引/锚点保图干净;全文+语义+路径查询分层;别局限本体——其他数据基建也能这么用。

ch15 Semantic Caches (88-108)

  • 88 L46: 目标——延迟与推理成本降 10-100 倍且保持准确。
  • L99-108 长尾模式:单一查询可占全部流量 20%+;60-70% 查询只被问几次;头部 20% 查询≈80% 用量;「顶级 agent 公司广告吹处理 68% 查询」。Pareto index:α=1.0 时优化 top 20% 覆盖 ~80% 流量;α=2.0 需处理 40% 类型。Pareto principle=80/20。
  • L111: agent 每次都「推理」新查询=多次 LLM 调用;单次 2-20+ 秒,消费级应用不可接受;再怎么优化单次调用,规模化下总会无解——所以有语义缓存。
  • L127-136 interceptor 层:用向量搜索拦截查询、用缓存里的 solution path 替代 agent 的规划步骤;agent 第一步不是回答而是规划工具选择。语义缓存一般不消除推理,只替代规划段;静态内容(FAQ)可全免推理;也可缓存优化过的 SQL 改善生成段。
  • L132: AWS/OpenAI/Intercom 报告:语义缓存加持的 agent 响应 600ms-2s vs 不加的 5-6s。
  • 89 组件:查询嵌入+相似阈值(连续统,要校准)+元数据(provenance 来源与模型版本/timestamps(股价 vs 法国首都例)/relevance scoring(0.95 vs 0.70))+solution path——缓存的不是答案而是「通往答案的路」。
  • 90 智能层:区分「Roth IRA 税收优惠」vs「Roth IRA 提取规则」(看起来像但意图不同);同一概念不同表达(顾问 vs 年轻投资者)要识别为等价。
  • 90L16-38 为什么用:推理念一次 $1,热门查询 1000 次/天=$1000;有缓存只 $1;推理利用率/成本/延迟(2-20s → 0.03-0.3s)/语义覆盖(阈值上方的变体全被覆盖)/一致性(LLM 非确定性,同问不同答在金融是事故)/细粒度控制(人工换更好的工具进 solution path)。
  • 90L45-80 未命中分层:key-value 精确查找(50-60ms,邮件营销链接触发这种已知查询常人工保证字面一致)→语义向量回退(100ms-2s)→完整 agent 规划(2-10s,结果回填缓存);规则回退(Rasa Two-Stage Fallback、Dialogflow CX);意图分类路径(FAQ→模板,技术支持→诊断树,复杂→人工)。
  • 代码实验室(91-98):SemanticCache 类:sentence-transformers all-MiniLM-L6-v2 + ChromaDB + cosine;search threshold=0.75;soln_path 存 metadata。增强四步:entity masking——AAPL/TSLA→[TICKER]、2023/2024→[YEAR],「[TICKER] stock price in [YEAR]」一条缓存通吃(否则缓存碎片化);cross-encoder verification——「What's my balance?」vs「What's my account number?」嵌入相近但意图不同,第二阶段交叉编码器把两个查询放一起重读打分;adaptive thresholds——金融交易类高阈值宁缺勿错,探索类低阈值;auto-population——miss 时调 fallback 并把结果回填,「今天的每次 miss 都是明天的 hit」。
  • 99-103 填充/查询扩展:LLM 改写(「How do I invest in bonds?」→多种说法);回译(经中间语言往返,罗曼语系风格变化、汉藏语系多样性高);同义词与缩写展开(新手「retirement savings」vs 顾问「qualified plan allocations」);合成查询前置生成(模式:搜「IRA contribution limits」的人接着问「catch-up contributions」);Morgan Stanley 从 7000 条固定查询到「有效回答任意问题」;⚠️扩展前先查重:同解路径的别加(会冲突污染缓存),不同解路径的必须加。域约束:EBITDA≠earnings、gross≠net、realized≠unrealized gains、「Fed」=Federal Reserve、「munis」=municipal bonds。
  • 104-107 驱逐:TTL(股价过期/概念不过期)→LRU+semantic decay(语义漂移:语言与领域知识演变)→performance-based pruning(高命中但用户不满意、查询重述率、会话放弃率、下游任务完成度)→semantic clustering 去冗余。
  • 收尾:语义缓存=生产级 AI 的控制层,记住「怎么答常见问题」;记忆(下一章)是记住「agent 见过和做过什么」。

ch16 Agentic Memory (109-128)

  • 109 L14: 记忆把 stateless 响应器变成会学习/适应/建立关系的系统;agentic memory = RAG 的进化:基本 RAG 检索静态文档,agentic memory 是被 agent 交互持续更新的动态知识库。
  • L55: 多存储并用(polyglot):KG 管结构化关系、向量库管语义相似、关系库管事务状态、时间库管演化。
  • 110 演进史:2000s AIML 有限状态机(会话结束即忘)→任务型对话的 slot filling(出发城市/目的地/日期,预设槽位之外记不住)→ChatGPT 拐点:对话自然但每次会话孤立;上下文窗口几千 token,塞进 system prompt+历史+新消息后只剩几百 token 给记忆——「把几周交互总结成几百 token 是徒劳的」;拼接历史的自救与三难(truncation 丢早期上下文/summarization 压掉细节+加延迟/selective retention 需启发式);RAG 思想解锁长期记忆(外部库容量无限,难点变成检索);上下文窗口 4k→8k→32k→128k→1M+,但贵、慢、大语境丢信号(lost in noise);agent 范式:必须在决策点拿到对的记忆,否则重复失败路径、忘约束、丢进度;二元(短/长期)不够→认知科学启发:episodic 保情境细节、semantic 抽象事实、procedural 无意识驱动行为→CoALA(Princeton 等机构 2024)统一词汇。
  • 111 working memory:RAM 类比;严格说不在 CoALA 框架内但是一切长期记忆的原料——工作记忆质量差,下游全遭殃;rolling summary/选择性保留。
  • 112 episodic:可检索的经历事件库;case-based reasoning:新问题搜相似旧案例与解法;「agent 对自己的经验库做 RAG」。
  • 113 semantic:事实库;社区 vs 个人的区分;KG 支撑多跳(投资目标→风险因子→市场分析一循环)。
  • 114 procedural:怎么做事的知识;显形为 system prompt、工具使用模式、学到的 RAG 策略(何时触发检索、怎么写检索查询、查哪个记忆库);改变它=改变 agent 行为本身。
  • CoALA 定义(L14 fun fact):Princeton 等机构 2024 提出;四记忆类型+交互(working 从长期库拉取,episodic 结晶为 semantic,procedural 编排一切)。
  • 范围维度:community(集体智慧:一个用户发现的有效解法抽象共享;匿名化+多用户阈值才晋升)×personal(显式事实+隐式模式:交流风格/活跃时段/反复出现的担忧;严格命名空间隔离,防串户);working memory 只有个人的;3 长期类型×2 范围=6 类;医疗例一次检索同时用四类(社区语义医学知识+社区 episodic 成功治疗模式+个人语义病史+个人 episodic 治疗偏好)。
  • 118-120 实现挑战:聊天日志是为调试/合规设计的,缺 tool 调用/推理链/置信度——要给管道加遥测;全渠道事件(点「保存」=认可比口头承认更明确);memory sclerosis:老记忆霸占检索结果,向量搜索不懂时间性——需合并/衰减/冲突解决/归档;语义事实稳定多年,episodic 很快过时——一刀切必败。
  • 三框架对比:Mem0=extract-update-retrieve 管线,统一存储不分认知类型;KV+向量+可选图(Mem0g);两阶段更新(extract→merge/invalidate/consolidate);LOCOMO 基准比 OpenAI 记忆实现准 26%、延迟与 token 省 ~90%;41k+ stars、月 API 调用 1.86 亿+。LangMem=直接实例化 CoALA 分类:语义/episodic/procedural 各有命名空间与提取管线;hot-path 工具调用即时写+background 异步提取;与 LangGraph BaseStore 原生集成;唯一生产级 procedural 实现。Zep/Graphiti=时序 KG;三层子图:episode(原始对话保真)/semantic entity(实体+事实三元组)/community(标签传播聚类);bi-temporal:每条边 4 个时间戳(t_valid/t_invalid 真实世界、t_created/t_expired 系统级),新事实矛盾时语义比较+置 t_invalid 不丢历史,支持任意时点重建图状态;检索=向量 cosine+BM25+图 BFS,RRF 融合;检索时零 LLM 调用(P95 300ms);deep memory retrieval 94.8%、LongMemEval +18.5%、延迟降 90%;无 procedural。
  • 124 选型:Mem0=统一长期记忆够用;LangMem=事实/经历/程序真的需要分别管理;Zep/Graphiti=时间动态主导(医疗进程/组合演化/合规审计);混合:LangMem procedural+Graphiti temporal episodic/semantic。
  • 125-128 评测:memoryless 评单轮,memory 系统要评轨迹(短=会话内连贯,中=跨会话保留与延迟后检索,长=真实学习);指标:retrieval precision/recall、延迟开销、存储效率(value-per-byte)、利用率(hot vs cold);行为评测:跨会话一致性、引用自然度(避免生硬的「As you mentioned before...」)、学习效率(纠正次数随交互下降)、error recovery(「没有重复犯错比任何正面指标都更有力」)、个性化准确度;监控:P50/P95/P99、缓存命中率、检索分布(是否总用同一小撮记忆);病灶:memory bloat(什么都存,信噪比下降)与 memory sclerosis(老记忆称霸)。

ch17 RAG-Based Agentic Memory in Code (129)

三个代码实验室建 CoALA 记忆。基座=ch12 agent 精简版:gpt-4.1-mini、AgentState 加 working_memory/episodic_recall/semantic_facts 占位;Chroma persist_directory="./memory_store"(记忆跨会话存活);工作记忆=最近 5 条消息窗口(L205)。

  • episodic:store_episodic_memory 把整段对话(带 conversation_id/timestamp/message_count metadata)存向量库;retrieve 用 similarity_search k=3 filter={"type":"episodic"}(Chroma metadata 支持 MongoDB 风格操作符,$eq);agent_with_episodic_memory 检索 k=2 相关旧对话,带时间戳格式化进提示词;store_conversation_node 在对话结束后写回(≥2 条消息才存)。「客服例:用户上周问过物流,回来问『我的订单怎么了』,机器人调出整段旧对话,不用用户重讲」。
  • semantic:从对话中抽取事实存 type:semantic,检索 filter {"type":{"$eq":"semantic"}};持续学习循环——每次对话充实记忆库。

ch18 Procedural Memory for RAG with LangMem (130-136)

  • L14: procedural memory 是「记得住的 agent」与「自己学习/自愈/改进的 agent」的分界;本书记忆章也证 RAG 基本原则无处不在(「没有 RAG 这些都不可能」)。
  • L17: LangMem=LangChain 的程序性记忆 SDK;agent 审视自己的轨迹→提取稳定行为模式→通过提示词与策略更新演化操作手册;四大收益:自学/自愈(检测纠正失败模式)/每次交互喂学习环/客户智能(重复意图、摩擦点、解决模式,免人工标注)。
  • 分层作用域:user/community/task/global(层级命名空间);模式不是全都该全局学——系统自动判定每条模式该在哪层生效。任务级=特定请求类型的专门化打法。
  • 架构分离:procedural_memory.py 核心 DomainAgent 接口,域逻辑全在 domain_investment/ 目录;换域=实现接口,核心系统零改动(医疗:老年患者上午就诊效果更好;客服:特定情况早提退款防升级,企业客户爱技术深潜、个人用户爱分步指南;教育:视觉学习者用图解)。
  • 学到的策略是可读指令,可查看/编辑/删除,每条带自己的成功指标,可独立回滚;A/B 测试+灰度+即时回滚防回归。
  • 136: 传统 RAG 检索文档,记忆增强 RAG 检索个性化上下文,procedural memory 优化的是 agent 的运作机制本身——元学习层。

ch19 Advanced RAG with Complete Memory Integration (137-153)

  • 137 L23(诚实声明!): LangMem 是真实开源库但只提供原语(create_memory_manager/create_prompt_optimizer);coala_agent.py 等是作者自建框架,演示如何用 LangMem 积木搭生产级学习 agent。
  • 三记忆协作:episodic 给对话上下文,semantic 供抽取的事实,procedural 应用学到的策略。
  • LangMem 三算法(143-147):prompt_memory(单遍快速学习,分钟级抓住明显模式,如「用户要具体数字不要模糊表述」)/gradient(批判与提案分离,后台专攻失败案例,防重蹈覆辙)/metaprompt(多阶段反思,日/周级深析累积历史,发现小样本看不到的关联,如「早晨问波动率的用户需要更多情绪安抚」)。组合用法:prompt_memory 实时、gradient 后台、metaprompt 定期;规则带来源算法/置信度/样本量标签;冲突时优先级:具体(用户级)胜通用、高置信胜低置信、新胜旧;prompt_memory 70% 置信的规则被 metaprompt 千次对话验证后升到 95%。
  • 域指标设计(148-149):domain_metrics 字典编码「成功是什么」——你选什么指标,agent 就长成什么样;投资顾问默认 returns 50%/satisfaction 30%/goal 20%;权重是目标间的「汇率」:50/30/20 下,agent 学会「接受收益降 3% 换满意度升 5%」(0.03×50=1.5=0.05×30);保守型 20/60/20 学出「充分解释风险」;冲突解法:学条件策略「只对明确重收益的用户用激进策略」。「agent 会精确优化你告诉它的东西——不管那是不是你真正的目标」。
  • 150 域转换框架:四文件换概念(rebalance→作业辅导等),用 LLM 辅助转换;层级学习同样适用(按风险偏好分组投资者=按学习风格分组学生);核心三文件零改动。
  • 151-152: 四记忆合一=完整 CoALA 认知架构;模块化让领域专家不懂记忆系统也能造专业 agent;结语:AI 的未来不止是更聪明的算法,而是能持续学习的系统。