LangChain 项目上线后我最怕的不是 bug,是没有测试——DeepAgents 的测试该怎么写

LangChain 项目上线后我最怕的不是 bug,是没有测试——DeepAgents 的测试该怎么写
用 LangChain 做的项目你写过测试吗我做过三个 LangChain 项目没一个有正经测试。不是不想写是不知道怎么写。chain 是黑盒中间状态看不到LLM 输出不确定同一个输入每次结果不一样依赖外部 APImock 成本比写业务代码还高。结果就是上线后每次改 prompt 都心惊胆战每次升级依赖都怕 regression每次用户报 bug 都只能手动复现。直到用 DeepAgents 做到 Day 11 的综合项目我决定在 Day 12 把这件事补上。发现 DeepAgents 的测试比 LangChain 好写很多——因为 Agent 的每一步都是可观测的 tool call不是 chain 的黑盒中间态。这是 Day 12 的笔记也是整个 12 天系列的收尾。把测试、优化、踩坑汇总和学习路线回顾一次讲完。阅读提示适合谁看用 LangChain/LangGraph 做过项目但没有测试、不敢重构看完能做什么给 DeepAgents Agent 写单元测试和集成测试知道优化从哪下手带走什么判断12 天学完后什么场景该用 DeepAgents、什么场景 LangGraph 更合适全文约 15 分钟一、全局地图Day 12 在哪一层12 天计划走到终点第一阶段Day 1-3框架认知——是什么、怎么装、源码长什么样第二阶段Day 4-8核心模块——Agent、Tool、Memory、Workflow、Multi-Agent第三阶段Day 9-10工程化能力——容错与可观测性、RAG 集成Day 11综合项目——把所有模块拼成 MVPDay 12本篇测试、优化、总结图 112 天学习路线总览Day 12 是收尾但不是可选的。**没有测试的项目不是完成了是还没出事**。二、为什么 LangChain 的测试这么难写先说清楚痛点不是为了吐槽而是为了理解 DeepAgents 在测试这件事上做了什么不一样的事。LangChain 测试的三大障碍来自我自己的项目经验障碍 1chain 是黑盒chain RetrievalQA.from_chain_type(llmllm, retrieverretriever)result chain.invoke(退货政策是什么)你只能看到result看不到中间的 retrieval 结果、prompt 拼接、LLM 原始输出。要测中间态要么加 callback要么拆 chain成本很高。障碍 2LLM 输出不确定同一个输入跑 10 次可能得到 10 个不同表述的回答。用assertEqual测不了用assertIn又太松。障碍 3依赖链太长从DocumentLoader到Embeddings到VectorStore到LLM每个都是外部依赖。全 mock 工作量大不 mock 又不稳定。DeepAgents 在这三个问题上的设计选择让测试变得可行Agent 的每一步都是tool calltool call 有明确的输入输出可以直接断言Agent 的推理过程可以通过state完整观测Tool 是普通函数mock 成本低三、DeepAgents 的测试策略三层结构图 2DeepAgents 知识图谱我总结了一个三层测试结构从内到外L1Tool 单元测试最便宜、最先写每个 Tool 就是一个普通函数输入字符串、输出字符串。测试方式跟普通 Python 函数完全一样。代码 1— Tool 单元测试import pytestfrom unittest.mock import MagicMock, patch# 假设这是你的 RAG Tooldef search_docs(query: str, retriever) - str: 搜索内部文档库。 docs retriever.invoke(query) if not docs: return 没有找到相关文档。 results [] for i, doc in enumerate(docs): source doc.metadata.get(source, unknown) results.append(f[{i1}] ({source})\n{doc.page_content}) return \n\n---\n\n.join(results)# 测试def test_search_docs_returns_results(): mock_retriever MagicMock() mock_doc MagicMock() mock_doc.page_content 退货政策7天无理由退货 mock_doc.metadata {source: policy.md} mock_retriever.invoke.return_value [mock_doc] result search_docs(退货, mock_retriever) assert 退货政策 in result assert policy.md in result mock_retriever.invoke.assert_called_once_with(退货)def test_search_docs_no_results(): mock_retriever MagicMock() mock_retriever.invoke.return_value [] result search_docs(不存在的内容, mock_retriever) assert 没有找到相关文档 in result关键点retriever 是注入的依赖不是全局变量。这样 mock 成本极低——只需要一个MagicMock。L2Agent 集成测试中等成本测 Agent 的推理链路给一个输入检查它是否调了正确的 tool、传了正确的参数。代码 2— Agent 集成测试from deepagents import create_deep_agentfrom unittest.mock import MagicMock, patchdef test_agent_calls_search_docs_for_knowledge_question(): # 准备 mock tool mock_search MagicMock(return_value[1] (policy.md)\n退货政策7天无理由退货) mock_search.__doc__ 搜索内部文档库 agent create_deep_agent( modelopenai:gpt-4o, tools[mock_search], system_prompt你是知识库助手先检索再回答。, ) # 运行 result agent.invoke( {messages: [{role: user, content: 退货政策是什么}]} ) # 断言search_docs 被调用了 mock_search.assert_called() # 断言最终回答包含关键信息 final_message result[messages][-1].content assert 退货 in final_message or 7天 in final_message注意这里 mock 的是 tool 函数本身不是 LLM。LLM 仍然用真实的——因为你要测的就是LLM 是否正确地调用了 tool。如果 mock LLM就失去了集成测试的意义。L3端到端测试最贵、最后写从用户输入到最终输出全链路测试。包含真实的 LLM 调用、真实的向量检索。代码 3— 端到端测试pytest.mark.e2edef test_e2e_rag_agent(): 端到端测试需要真实 API key 和向量索引。 # 使用真实的组件 from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings embeddings OpenAIEmbeddings(modeltext-embedding-3-small) vectorstore FAISS.load_local(./test_index, embeddings, allow_dangerous_deserializationTrue) retriever vectorstore.as_retriever(search_kwargs{k: 3}) def search_docs(query: str) - str: docs retriever.invoke(query) return \n.join(d.page_content for d in docs) agent create_deep_agent( modelopenai:gpt-4o, tools[search_docs], system_prompt你是知识库助手。先检索再回答。, ) result agent.invoke( {messages: [{role: user, content: 如何配置 CI/CD}]} ) # 断言回答不是空的且包含技术内容 answer result[messages][-1].content assert len(answer) 50 assert any(kw in answer.lower() for kw in [ci, cd, pipeline, 部署, 自动化])关键点用pytest.mark.e2e标记CI 里可以单独跑或跳过。端到端测试不适合每次 commit 都跑适合 nightly 或发版前跑。四、性能优化从哪下手Agent 的性能瓶颈通常不在单个 tool 的执行速度而在LLM 调用次数和上下文长度。优化 1减少不必要的 LLM 调用Agent 的 ReAct 循环每一步都调一次 LLM。如果你的任务是确定性流程不需要 LLM 判断用WorkflowDay 7替代 Agent。场景用 Agent用 Workflow用户意图不确定✅❌执行路径固定❌✅需要动态决策✅❌纯顺序执行❌✅经验判断如果你的 prompt 里写了如果……则……否则……大概率应该用 Workflow 的条件路由而不是让 Agent 每次都推理一遍。优化 2控制上下文长度Agent 的每轮对话都会把历史消息发给 LLM。对话轮数越多token 消耗越大延迟越高。# 不好每轮都带全部历史agent create_deep_agent(modelopenai:gpt-4o, tools[...])# 好限制历史窗口agent create_deep_agent( modelopenai:gpt-4o, tools[...], max_history_messages20, # 只保留最近 20 条)优化 3Tool 结果精简RAG Tool 返回的文档片段不要太多。top_k4通常够了top_k10会浪费大量 token。# 不好返回太多retriever vectorstore.as_retriever(search_kwargs{k: 10})# 好精简返回retriever vectorstore.as_retriever(search_kwargs{k: 3})# 更好只返回关键字段def search_docs(query: str) - str: docs retriever.invoke(query) # 只返回内容不返回 metadata节省 token return \n---\n.join(d.page_content[:500] for d in docs)优化 4并行 Tool 调用如果 Agent 需要调用多个独立的 tool可以让它们并行执行。DeepAgents 支持 tool 的并行调用前提是 tool 之间没有依赖。五、踩坑汇总12 天踩过的所有坑我把整个学习过程中踩过的坑按模块整理方便你按模块排查。Agent 模块Day 4坑现象解法Agent 不调工具直接用 LLM 知识回答system_prompt 明确要求必须使用工具Agent 死循环反复调同一个 tool 不停检查 tool 返回值是否让 Agent 认为任务未完成Agent 返回格式不对想要 JSON 返回纯文本用response_format参数约束输出格式Tool 模块Day 5坑现象解法Tool 描述不准确LLM 选错 tool优化 tool 的 docstring写清楚什么时候用Tool 参数校验缺失LLM 传了错误类型参数用 Pydantic 做参数 schema或者在函数里加类型检查Tool 报错吞掉了Agent 静默失败在 tool 里显式 raise不要 return “错误” 字符串Memory 模块Day 6坑现象解法多用户串记忆A 的偏好被 B 看到namespace 用lambda rt: (user_id,)记忆没生效Agent 不知道用户偏好检查memory参数和 backend route 路径前缀一致InMemoryStore 重启丢失测试通过生产丢了生产用PostgresStoreWorkflow 模块Day 7坑现象解法条件路由死循环循环判断不停检查条件边的终止条件并行节点结果丢失只拿到一个分支的结果检查 state reducer 是否正确合并Multi-Agent 模块Day 8坑现象解法Orchestrator 自己全干了不调度给 Workerprompt 强调你只负责调度Worker 之间上下文丢失后一个 Agent 没收到前一个的结果prompt 要求把前序结果放进 contextSubGraph 思维残留想给 Worker 加 add_edge放下画图思维信任 LLM 调度RAG 模块Day 10坑现象解法表格被切碎检索到半张表用MarkdownHeaderTextSplitter按标题切分检索结果重复top_k 个 chunk 都来自同一篇文档用 MMR 检索策略Embedding 不一致检索精度断崖下降建索引和查询用同一个模型Agent 每次都检索闲聊也调 search_docsprompt 区分需要检索和不需要检索六、12 天学习路线回顾12 天走下来我们经历了四个阶段第一阶段框架认知Day 1-3Day 1搞清楚 DeepAgents 是什么、解决什么问题、跟 LangChain/LangGraph 的关系Day 2环境搭建、跑通 QuickStartDay 3源码结构、模块划分第二阶段核心模块Day 4-8Day 4Agent 定义——create_deep_agent背后就是 LangGraph 的 StateGraphDay 5Tool 注册——函数即工具docstring 即描述Day 6Memory 管理——文件即记忆backend 路由Day 7Workflow 编排——条件路由、并行执行Day 8Multi-Agent 协作——Orchestrator Workers消息传递第三阶段工程化能力Day 9-10Day 9容错与可观测性——错误处理、重试、TracingDay 10RAG 集成——RAG-as-Tool文档问答第四阶段实战综合Day 11-12Day 11综合项目——把所有模块拼成 MVPDay 12测试、优化、总结一句话总结这 12 天的核心收获DeepAgents 不是 LangChain 的替代品是 LangGraph 的上层封装。 它解决的不是能不能做的问题是能不能少写样板代码、能不能更好调试的问题。七、DeepAgents vs LangChain/LangGraph迁移决策框架学完 12 天该不该从 LangChain/LangGraph 迁移到 DeepAgents我做了一个决策框架适合迁移的场景你的项目大量使用 ReAct Agent 模式Day 4 的样板代码省得最多你需要 Agent 自主管理记忆Day 6 的 filesystem memory 是独有优势你的调试成本很高tool call 日志比 chain 黑盒好调试太多你要做多 Agent 协作sub_agents 比 SubGraph 嵌套简单不适合迁移的场景你的项目主要是 RAG chain不需要 Agent → LangChain 的 RetrievalQA 更简单直接你需要精细控制图结构复杂的条件路由、循环、分支→ LangGraph 显式图更灵活你的团队已经深度使用 LangChain 生态大量自定义 callback、集成→ 迁移成本高你用的不是 OpenAI/Anthropic 模型 → DeepAgents 的模型支持范围可能不如 LangChain 广如果只做一件事先用 DeepAgents 重写你最简单的一个 Agent 场景比如一个 tool 的 ReAct Agent对比一下代码量和调试体验。如果觉得好再逐步迁移其他模块。八、给读者的下一步建议决策帮助如果你是刚入门按 12 天计划再走一遍每天 1.5-2 小时两周能走完如果你已经在用 LangChain先迁移一个最简单的 Agent 场景对比代码量和调试体验如果你在做生产系统重点关注测试本篇的三层结构和可观测性Day 9如果你在做技术选型DeepAgents 适合 Agent-heavy 项目LangGraph 适合 Graph-heavy 项目九、系列总结12 天前我从 LangChain 的样板代码和 chain 黑盒里跳出来开始看 DeepAgents。12 天后我的判断是DeepAgents 最大的价值不是新功能而是减少样板代码 提升可观测性。 它把 LangGraph 的图编程模型包装成了Agent 即函数的接口降低了心智负担但没有牺牲灵活性。它不是万能的。复杂的图结构、精细的流程控制、非主流模型支持这些场景 LangGraph 仍然更合适。但对于大多数 Agent 项目——尤其是Agent 几个 Tool 一点 Memory 一个 RAG这种最常见的组合——DeepAgents 的开发体验确实好很多。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】