尚硅谷大模型技术之高频面试题
版本:V2.1.9
主流项目 / 智能客服系统(LangGraph)

智能客服系统(LangGraph)

4 个问题

项目周期#

  • 2人团队,总计约6个月。
  • 需求分析与技术选型1周
  • 环境搭建与系统开发8周
  • 测试与部署1周
  • 基础任务流开发与集成2周
  • GraphRAG流程开发1周
  • 集成与调试1周
  • LLM微调数据准备2周
  • LLM微调与评估1周
  • 模型部署与测试2周
  • 更多任务流扩展4周

技术栈#

  • 后端框架:FastAPI+Uvicorn
  • 数据库:MySQL(业务数据)
  • 图数据库:neo4j
  • ORM:SQLAlchemy
  • 向量检索:Sentence-transformers
  • CLI配置:Click
  • LLM集成:LangChain
  • 实时双向通信:WebSocket
  • Agent框架:LangGraph(状态图编排)

功能介绍#

基于LLM驱动的多轮对话系统和知识图谱构建的智能电商客服系统,主要有以下功能:

提供任务型对话,根据预设流程进行对话,通过多轮对话交互帮助用户完成特定任务,如物流、订单、售后相关业务流程等。

提供知识库问答对话,基于知识图谱和GraphRAG,支持售前产品咨询的复杂问题和多跳推理。

支持话题切换和闲聊,接入LLM支持用户的非业务对话,并对回复内容做出严肃限制,避免涉及敏感内容的回复。

项目架构#

Q总体架构#

Q生成“命令生成模型”的微调数据#

准备覆盖重要对话流程的端到端测试数据,准备命令生成微调数据集。

Q命令生成模型微调与部署#

数据集#

覆盖高频步骤路径与边界场景(如模糊意图、多意图、口语化表达等)。

共计约1万条样本,按8:2划分训练集和验证集。

训练集:8000条左右。

验证集:2000条左右。

模型训练#

Q信息型对话(GraphRAG)#

LLM根据Prompt从用户输入中提取入口节点实体和其对应的类型。

获取入口节点实体和标签之后,使用混合检索从Neo4j中检索出若干候选入口节点。

LLM根据用户输入、候选入口节点、Neo4j的schema信息,生成Cypher查询语句。

将生成的Cypher语句交给LLM进行验证,返回Cypher中的存在的语法与逻辑错误。

LLM根据验证出的错误信息对Cypher进行修正,得到最终的Cypher语句。

执行查询语句,将查询结果返回LLM作为上下文参考。

LLM根据用户输入和上下文参考生成回复。

项目串讲#

这个智能客服项目,本质上是一个基于大语言模型的多轮对话系统,支持任务型对话、知识型对话、闲聊型对话。

它的核心能力是:把复杂的客服业务流程,通过配置文件定义好,然后让大模型理解用户意图,自动执行这些流程。

整个系统最关键的设计思想是:不让大模型直接生成回复,而是让它生成"命令",由系统来执行这些命令。

这样做的好处是,既能利用大模型强大的理解能力,又能保证业务流程的可控性。

但问题是:

怎么让大模型知道该生成什么命令?

怎么管理复杂的多轮对话状态?

怎么在对话过程中灵活切换不同的业务流程?

这个项目真正的难点其实是:

如何设计一套机制,让系统既能处理结构化的业务流程(比如订单查询、物流跟踪),又能灵活应对开放式的问答和闲聊。

下面我重点讲一下这个系统是怎么解决这些问题的。

一是核心设计:LangGraph 图式编排#

整个对话处理流程,是用 LangGraph 编排成一个图。

图里有 5 个核心节点:understand(理解)、policy(决策)、action(执行)、guard(守护)、response(响应)。

当用户发来一条消息,系统会:

understand 节点:把用户的话交给大模型,让它生成结构化命令#
policy 节点:根据命令决定下一步要执行什么动作#
action 节点:执行具体的动作(比如查数据库、调API)#
guard 节点:检查是否还有命令没执行完,如果有就跳回 policy 继续#
response 节点:把所有执行结果整理成消息,返回给用户#

这个图的精妙之处在于:policy 和 action 之间可以循环多次。

比如用户说"我要查物流,订单号是12345,顺便帮我改个地址",大模型会一次生成 3 条命令,系统会依次执行这 3 条命令,直到全部完成。

二是 Tracker:对话的记忆体#

Tracker 是整个系统的状态管理核心。

每个用户都有一个会话级别独立的 Tracker,里面记录了:

  • 槽位值(比如 order_id=12345、receiver_name=张三)
  • 对话历史(用户说了什么、系统回了什么)
  • 对话栈(当前在执行哪个流程、执行到哪一步了)
为什么需要对话栈?#

因为对话是会中断和嵌套的。

举个例子:#

用户在查物流(Flow A),中途突然问"你们客服电话是多少"(知识检索),回答完之后要继续查物流。

这时候系统会先把 Flow A 压栈,然后处理知识检索,检索完了弹栈,回到 Flow A 继续。

对话栈让系统能够自然地处理对话中断、嵌套、回退,这是传统状态机很难做到的。

三是Flow:把对话流程配置化#

Flow 是这个系统最核心的机制。

一个 Flow 就是一个业务流程,用 YAML 文件定义,包含多个步骤。

比如订单查询的 Flow,会定义像如下的步骤:

收集订单号(如果用户没说,就问他要)#
查询订单(调用自定义的 action_query_order)#
根据订单状态,决定是显示物流信息还是显示订单状态#

Flow 支持很多高级特性:

  • 条件分支:根据槽位值决定走哪个分支
  • 嵌套调用:一个 Flow 可以调用另一个 Flow(比如售后流程里调用地址修改流程)
  • 动态跳转:根据业务逻辑动态决定下一步

关键是,这些都是通过配置文件定义的,不需要写代码。

要新增一个业务流程,只需要写一个 YAML 文件就行了。

四是命令生成:怎么让大模型知道该干什么#

这是最核心的部分。

系统会给大模型构建一个超级详细的 Prompt,里面包含:

  • 当前对话状态(有哪些槽位、活跃的 Flow 是什么、对话历史)
  • 可用的 Flow 列表(每个 Flow 能干什么)
  • 可用的命令类型(StartFlow、SetSlot、Answer、CancelFlow 等)
  • 决策规则(什么情况下用什么命令)

大模型根据这个 Prompt,生成结构化的命令。

比如:

StartFlow(flow_order)

SetSlot(order_id, "12345")

然后系统会解析这些命令,依次执行。

这里有个很巧妙的设计:Prompt 里会动态裁剪内容。

因为 Flow 可能有很多个,槽位也可能有很多个,全部塞进 Prompt 会超长。

所以系统会根据当前上下文,只保留最相关的 Flow 和槽位。

这样既能给大模型足够的信息,又不会超出 token 限制。

五是策略决策:FlowPolicy 和 EnterpriseSearchPolicy#
系统有两个核心策略:#
  • FlowPolicy:如果当前有活跃的 Flow,就执行 Flow 的下一个步骤。

这个策略优先级最高,因为 Flow 是明确定义的业务流程,必须优先保证执行。

  • EnterpriseSearchPolicy:如果没有活跃的 Flow,就从知识库检索答案,这个策略处理知识和型问答。
两个策略是互补的:#
  • 结构化的任务用 Flow 处理,保证业务逻辑的准确性
  • 知识型的问答用检索处理,灵活应对各种问题

策略集成器会按优先级选择最合适的策略,如果都不行,就返回"我没听懂"。

六是Action:怎么对接外部系统#

Action 是系统与外部世界交互的桥梁。

当需要查数据库、调 API、执行业务逻辑时,就需要写一个自定义 Action。

比如查询订单的 Action:

可以定义一个Action ,继承抽象基类,实现run函数:

  • 读取 Tracker 里的槽位值
  • 调用数据库或 API
  • 修改槽位值
  • 返回响应消息

系统启动时会自动扫描 `actions/` 目录,把所有 Action 注册进来,不需要手动配置。

七是多通道接入:REST、WebSocket、控制台#

系统支持多种接入方式:

REST API:提供标准的 HTTP 接口,可以集成到任何前端

WebSocket:实时双向通信,适合需要即时反馈的场景。比如客服系统,需要实时推送订单状态变化。

Inspect 调试页面:Web 可视化界面,可以:

  • 查看对话栈的变化
  • 查看每一步生成的命令
  • 手动修改槽位值
  • 重放历史对话

这个调试页面对开发非常有用,能直观地看到系统内部是怎么运行的。

八是CLI 工具:从初始化到部署#

系统提供了一套完整的命令行工具:

  • init:初始化项目,生成目录结构和配置文件
  • train:训练模型,把 Flow 定义、对话样本打包成模型文件
  • run:启动服务,提供 REST API 和 WebSocket 接口
  • inspect:启动调试页面,可视化查看对话流程

整个流程非常顺畅:init 创建项目 → 编写 Flow 和 Action → train 打包模型 → run 启动服务 → inspect 测试调试 → run正式启动。

这个系统的核心设计思想就三点:

命令驱动:大模型生成命令,系统执行命令,既灵活又可控#
Flow 配置化:业务流程用 YAML 定义,不用写代码,易维护易扩展#
对话栈管理:用栈结构管理对话上下文,自然处理中断和嵌套#
技术亮点:#
  • LangGraph 图式编排,让流程清晰可控
  • Tracker 统一状态管理,避免状态不一致
  • 多策略融合决策,灵活应对不同场景
  • 自动发现和注册机制,开发体验友好
  • 完整的工具链支持,从开发到部署一站式

对于开发者来说,这个框架提供了一个强大的基础设施,可以快速构建各种对话应用。

无论是客服机器人、任务助手、还是知识问答系统,都能轻松实现。