4-接入LangGraph与LangChain
4 - 深度研搜:接入 LangGraph 与 LangChain 本章课程目标: 理解为什么 DeepAgents 需要复用已有 LangGraph / LangChain 能力。 掌握 CompiledSubAgent 的作用和基本配置方式。 理解 LangGraph 子智能体为什么必须包含可累加的 messages 状态字段。 能判断复杂子任务应该交给 LangGraph,还是交给 LangChain Agent。 学习建议: 这一章学的是“复用现成能力”,不是重新学 LangGraph 或 LangChain。读的时候重点看 CompiledSubAgent 如何把已有图、Agent 或 Runnable 包成 DeepAgents 能调度的子智能体。如果 StateGraph、add_messages、条件边、@tool、create_agent() 还不熟,先回看对应章节,否则这里会像在看一层薄薄的适配胶水。 对应代码分支: 04-deepagents-langgraph-langchain 上一章我们学习了字典式子智能体。它适合定义简单、轻量、职责明...
3-子智能体进阶与异步执行
3 - 深度研搜:子智能体进阶与异步执行 本章课程目标: 掌握字典方式配置子智能体的基本写法。 能判断一个能力更适合做成普通工具,还是拆成子智能体。 理解同步流式执行和异步流式执行的区别,能使用 astream() + asyncio.gather() 并发处理多个任务。 了解 DeepAgents 子智能体嵌套的设计边界。 学习建议: 这一章重点不是“多建几个助手”,而是判断任务什么时候真的值得拆。读代码时按三步走:先看子智能体负责什么,再看它如何注册到主智能体,最后从 stream() 输出里观察主智能体有没有把任务交给它。异步部分先看调度结果,再回头看实现细节。 对应代码分支: 03-deepagents-subagents-async 参考资料:DeepAgents 子智能体:https://docs.langchain.com/oss/python/deepagents/subagents 前两章我们已经跑通了一个最小 DeepAgent:主智能体可以接收用户问题,调用 internet_search 工具,最后整理出结果。 第 1 章讲的是子智能体的概念和设计边...
2-DeepAgents快速入门与流式解析
2 - 深度研搜:DeepAgents 快速入门与流式解析 本章课程目标: 跑通第一个 DeepAgent:给智能体配置联网搜索工具,并用 invoke() 获取最终结果。 理解 result["messages"] 的结果结构,知道一次 Agent 执行过程中模型和工具分别做了什么。 掌握 stream() 的基本使用方式,能解析 DeepAgents 的流式输出。 能区分“模型决策”“工具执行”和“最终回复”几类关键事件,并知道子智能体调度也可以作为后续扩展事件识别。 为下一章学习 subagents 配置和主智能体调度做准备。 学习建议: 这一章先跑,再拆。先把最小示例执行成功,确认普通返回和 stream() 都能看到结果;再回头看 messages、chunk、tool_calls、content 这些字段分别从哪里来。DeepAgents 内部节点第一遍不用追到底,先能读懂流式输出里每一段代表什么。 对应代码分支: 02-quickstart-streaming 上一章我们已经理解了 DeepAgents 的定位:它适合处理长链路、复杂、多步...
1-DeepAgents基础与核心概念
1 - 深度研搜:DeepAgents 基础与核心概念 本章课程目标: 理解为什么在普通大模型调用、工具型 Agent 之后,还需要 DeepAgents 这类深度智能体框架。 掌握 LangChain、LangGraph、DeepAgents 三者之间的定位差异。 理解 DeepAgents 的四个核心能力:任务规划、上下文管理、子智能体、长期记忆。 理解高阶提示词为什么会和 DeepAgents 一起出现,以及它在复杂任务中的作用。 建立多智能体设计的边界感:知道什么时候适合使用子智能体,什么时候不应该滥用多智能体。 学习建议: 这一章先建立边界,不急着写代码。重点看普通 Agent 为什么处理长任务会吃力,DeepAgents 把规划、文件、子智能体、长期上下文这些能力放在什么位置。读完后最好能回答:什么任务值得交给 DeepAgents,什么任务用普通 Agent 或一条链就够了。下一章再进入 create_deep_agent()、invoke()、stream()。 1、项目导读1.1 项目背景「深度研搜(DeepAgents 多智能体)」是一个面向复杂研究任务...
17-前后端联调与日志追踪
17 - 电商问数:前后端联调与日志追踪 本章课程目标: 统一后端给前端的 SSE 消息协议:progress、result、error。 理解节点异常为什么不能被吞掉,以及什么时候应该继续抛出异常。 在 QueryService 中把节点消息统一序列化成 SSE 文本。 完成前后端联调,让页面能展示进度、结果和错误。 使用 request_id、ContextVar 和 loguru 追踪并发请求日志。 学习建议: 这一章用“出错时怎么查”来读会更有效。先看前后端消息协议,再看节点异常如何被捕获,QueryService 如何兜底,最后看 request_id 怎样把一次请求的日志串起来。联调不是只看页面能不能显示结果,更要确认失败时前端、后端和日志都能给出有用线索。 对应代码分支: 17-api-integration-logging 官方文档参考: FastAPI 中间件:https://fastapi.org.cn/tutorial/middleware/ Python contextvars:https://docs.python.org/zh-cn/3/libr...
16-查询接口实现与依赖组装
16 - 电商问数:查询接口实现与依赖组装 本章课程目标: 把第 15 章的假流式接口替换成真实问数工作流。 使用 FastAPI 依赖注入组装 Repository、Session、Client 和 Service。 使用 lifespan 管理 Qdrant、ES、MySQL、Embedding 等应用级资源。 学习建议: 这一章开始把 API 和问数工作流接起来。读的时候沿着一条请求走:HTTP 进入路由,路由拿到 QueryService,QueryService 调用 LangGraph,执行进度再通过 SSE 返回前端。依赖函数看起来多,但本质是在按层次组装底层对象;别把装配代码误读成业务逻辑。 对应代码分支: 16-api-query-service 第 15 章已经验证了 StreamingResponse + SSE 可以正常工作,但当时返回的是 fake_streamer() 模拟数据。本章要把它换成真实的问数智能体。 最终调用链路如下: 1234567前端 / Apifox -> POST /api/query -> query_rou...
15-API接口基础与FastAPI入门
15 - 电商问数:API 接口基础与 FastAPI 入门 本章课程目标: 理解为什么问数智能体最后要封装成 HTTP API。 搭建一个最小可测试的 /api/query 接口。 理解普通响应、流式响应和 SSE 协议之间的关系。 理解 FastAPI 的三个工程基础:lifespan、middleware、Depends。 为下一章接入真实 QueryService 做好准备。 学习建议: 这一章先学 API 骨架,不急着接入真实问数工作流。重点看请求怎么进来、响应怎么出去、为什么要流式返回、SSE 每段数据如何约定,以及 FastAPI 的路由、依赖、生命周期分别管什么。把这些基础看清,下一章再接 QueryService 时就不会觉得文件关系散。 对应代码分支: 15-api-streaming-basics 官方文档参考: FastAPI 流式响应:https://fastapi.org.cn/advanced/custom-response/#streamingresponse SSE 协议讲解:https://www.ruanyifeng.com/blog/...
14-SQL生成与执行闭环
14 - 电商问数:SQL 生成与执行闭环 本章课程目标: 理解 SQL 生成前,智能体已经准备好了哪些上下文。 理解为什么生成 SQL 后不能马上执行,而要先用 EXPLAIN 做校验。 完成一次端到端测试,把问数智能体从自然语言问题跑到 SQL 查询结果。 学习建议: 这一章要看闭环,不要只看生成提示词。完整顺序是生成 SQL、校验 SQL、必要时校正、最后执行查询。重点留意条件分支如何决定走校正还是执行,以及错误信息怎样被带回给模型修正。跑通这条链路后,问数智能体才真正从“理解问题”走到“查出结果”。 对应代码分支: 14-agent-sql-loop 1、本章在问数链路中的位置前面几章已经完成了 SQL 生成前的准备工作: 123456用户问题 -> extract_keywords -> recall_column / recall_metric / recall_value -> merge_retrieved_info -> filter_table / filter_metric -> add_extra_contex...
13-SQL生成前的信息过滤与补全
13 - 电商问数:SQL 生成前的信息过滤与补全 本章课程目标: 理解为什么召回信息合并之后,还要继续过滤表、字段和指标。 掌握 filter_table 如何让大模型从候选表结构中选出必要表和字段。 掌握 filter_metric 如何让大模型从候选指标中选出必要指标。 理解为什么要把 table_infos、metric_infos 转成 YAML 后放进提示词。 看懂 add_extra_context 如何补充当前日期、星期、季度、数据库方言和版本。 学习建议: 这一章是 SQL 生成前的质量闸口。先看过滤节点如何把上一章合并出的上下文变短、变准,再看额外上下文节点如何补上模型不能凭空知道的信息,比如当前日期、数据库类型、项目约束。读完后要能说清:哪些信息该删,哪些信息必须补。 对应代码分支: 13-agent-filter-extra-context 1、本章在问数链路中的位置上一章完成了 merge_retrieved_info,把字段、指标、字段取值三路召回结果整理成两份核心上下文: 12table_infos # 按表组织好的表结构上下文metric...
12-召回信息合并与上下文构建
12 - 电商问数:召回信息合并与上下文构建 本章课程目标: 理解为什么字段、指标、字段取值三路召回后,还不能直接生成 SQL。 掌握 table_infos 和 metric_infos 这两个后续核心上下文的结构。 看懂 merge_retrieved_info 如何把分散的 ColumnInfo、MetricInfo、ValueInfo 合并成按表组织的信息。 学习建议: 这一章不调用大模型,本质是把上一章召回来的候选信息整理成 SQL 生成能用的上下文。读代码时先拿一组样例输入,观察它如何分组、去重、补字段、转类型,最后变成下游更好消费的结构。这里看懂了,后面 SQL 提示词为什么能写得更稳就有依据。 对应代码分支: 12-agent-merge-retrievals 1、本章在问数链路中的位置 上一章完成了关键词抽取和三路召回。三路召回结束后,state 里会有三份结果: 123retrieved_column_infos # 召回到的字段信息retrieved_metric_infos # 召回到的指标信息retrieved_value_infos # ...