模块 2 · 三张牌编排

tool → llm → guard
群聊走一遍

顾问线 LangGraph 只有三个业务节点(加 START/END): tool → llm → guard。比客户 14 节点图短,但归属校验在 对话 Tool 编排(tool_service.py)run_tool 里,和客户线铁律口径一致。

节点职责(背下来少踩坑)

tool_node

match_intent("advisor", message) 命中关键词 → 对话 Tool 编排(tool_service.py)run_tool 查 Core / 知识库 → 结果写入 tool_results。

llm_node

System prompt(顾问边界)+ Tool 摘要注入 + 历史窗口 + 本轮用户话 → DeepSeek 组织自然语言。

guard_node

顾问线不附客户/风控那种尾部免责声明(needs_disclaimer("advisor") 为 false)。

群聊:理财师问「客户 CUST-9527 持仓如何」

简化播放 tool → llm → guard 全链路(前面 四 Agent 对话 HTTP 入口(chat.py)已验 JWT + G-01)。

CODE · 顾问通用 tool→llm→guard 编排(agent_service.py)tool_node
tool_name = tool_service.match_intent(
    state["agent_type"], state["user_message"]
)
record = tool_service.run_tool(
    tool_name=tool_name,
    agent_type=state["agent_type"],
    customer_id=state.get("customer_id") or "",
    ...
)
白话

先靠关键词判断要不要查库;闲聊不命中就 tool_results 为空,LLM 纯聊。

customer_id 来自会话绑定(四 Agent 对话 HTTP 入口(chat.py)归属校验后的值),不是 LLM 生成的。

query_holdings 和 customer 线共用 Core 只读 Tool 定义(core_tools.py)定义,但跑在 顾问通用 tool→llm→guard 编排(agent_service.py)图里。

理财师问「这位客户仓位怎么样」,tool_node 如何选中 query_holdings?