模块 2 · 编排内核

14 节点 LangGraph:
从回忆到归档

客户线不走顾问通用 tool→llm→guard 编排(agent_service.py),而是 登录客户 14 节点 LangGraph 编排(customer_service.py)里一张更大的 LangGraph。 入口永远是 recall_memory,出口经 save_memory 写记忆后收尾。

14 个节点一览(改分支前先认门牌号)

1recall_memory · 拉 Redis/MySQL 窗口
2intent_classify · LLM 分意图
3rag_search · fin_* Milvus
4param_extract · 抽查询参数
5tool_call · Core 只读 Tool(core_ro_tool.py)
6interpret · 解读 fact_text
7generate · RAG 拼回复
8chitchat · 闲聊
9reject · 合规拒绝
10transfer_human · 转人工
11fallback · 兜底话术
12save_note · 客户记一笔
13save_memory · 写回合记忆
14profile_maybe_extract + archive_check
分支规则: intent_classify 之后走 RAG(产品/政策/FAQ)、走 Tool(持仓/流水/风评)、或走静态话术(拒绝/转人工/闲聊)。所有生成分支最后都汇入 save_memory。 口吻护栏与转人工决策见模块 4。

群聊动画:客户问「我持仓多少」

下面按节点顺序播放(数据查询分支);若问「申购费率多少」则在节点 2 后改走 rag_search → generate。

图构建 · 登录客户 14 节点 LangGraph 编排(customer_service.py)
g.set_entry_point("recall_memory")
g.add_edge("recall_memory", "intent_classify")
g.add_conditional_edges("intent_classify", _route, {...})
g.add_edge("tool_call", "interpret")
g.add_edge("rag_search", "generate")
# 各生成分支 → save_memory → profile → archive → END
白话

先回忆上下文,再让 LLM 判意图,然后走 RAG 或 Tool 或静态话术。

数据类问题:param_extract → tool_call → interpret,数字 100% 来自 Core。

无论哪条分支,最后都要 save_memory,再异步做画像和归档。

客户问「基金申购费率多少」,LangGraph 走哪条分支?