拉新机器人-偏离流程设计

这是一个非常关键的问题:当客户没有按照预设流程提问时,机器人该如何应对?

在实际场景中,用户可能随时偏离设计好的流程,提出任意问题(比如突然问“你们客服电话是多少?”、“优惠活动什么时候结束?”等)。如果处理不好,用户体验会大打折扣。


🧠 一、核心原则:让机器人具备“上下文理解”和“灵活应答”的能力

我们希望机器人能做到:

  1. 识别用户当前意图(是否偏离流程)
  2. 保持原有流程状态
  3. 回答非流程问题后,自然引导回原流程

🔄 二、解决方案设计(结合 LangGraph)

✅ 方案思路:

  • 在每一步对话中都加入一个全局意图识别节点
  • 如果发现是流程外的问题,就进入一个通用问答节点
  • 回答完后再回到原来的流程位置

📦 三、扩展 AgentState 状态结构

from typing import TypedDict, Optional

class AgentState(TypedDict):
    user_id: str
    message: str
    intent: str  # 当前意图,如 register、faq、off_topic 等
    current_step: str  # 当前处于哪个流程步骤
    is_registered: bool
    collected_info: dict
    context: list  # 对话历史,用于 LLM 上下文理解

🔄 四、新增节点函数:全局意图识别 & 通用问答

1. 意图识别节点(判断是否偏离流程)

def detect_intent(state: AgentState) -> AgentState:
    prompt = f"""
你是一个智能客服助手,请分析以下用户消息的意图:
"{state['message']}"

请判断:
- 是否与注册流程有关?
- 是否是常见问题咨询(如价格、联系方式)?
- 是否完全偏离流程?

返回 intent 类型(register/faq/off_topic)
"""
    response = llm.invoke(prompt)
    intent = response.content.strip().lower()
    return {**state, "intent": intent}

2. 处理非流程问题的通用问答节点

def handle_off_topic(state: AgentState) -> AgentState:
    prompt = f"""
用户说:“{state['message']}”

请根据你的知识库回答该问题。如果你不确定答案,请说明“我暂时无法提供准确信息”。

注意:请保持简洁明了。
"""
    response = llm.invoke(prompt)
    reply = response.content.strip()
    return {
        **state,
        "message": reply,
        "intent": "faq" if "contact" in reply or "price" in reply else "off_topic"
    }

⚙️ 五、条件分支逻辑调整

我们可以使用 conditional_edges 来实现如下逻辑:

def route_after_intent(state: AgentState):
    if state["intent"] == "register":
        return "guide_to_register"
    elif state["intent"] in ["faq", "off_topic"]:
        return "handle_off_topic"
    else:
        return "offer_next_steps"

然后把这个判断作为每个主流程节点之后的判断逻辑。


📈 六、更新后的完整流程示意

greet_user
   ↓
detect_intent ────→ [intent=register] → guide_to_register → collect_user_info → offer_next_steps
                   ↘ [intent=faq/off_topic] → handle_off_topic → resume_flow

🔁 七、如何“恢复流程”?

你可以设计一个“流程恢复”节点,例如:

def resume_flow(state: AgentState) -> AgentState:
    print(f"Resuming flow from step: {state['current_step']}")
    # 根据 current_step 返回到对应节点
    return {**state, "message": "刚刚我们说到哪里了?让我们继续吧!"}

并在 handle_off_topic 后跳转回来:

workflow.add_edge("handle_off_topic", "resume_flow")

✅ 八、优化建议

技术点 建议
意图识别增强 使用微调模型或关键词 + LLM 结合判断
FAQ 知识库集成 接入向量数据库 + RAG 提供更精准答案
多轮记忆机制 使用 LangGraph 的 checkpointer 实现会话持久化
用户打断容忍度高 不强制用户按流程走,而是智能适应

💡 九、举个例子

假设用户说:

“你们客服电话是多少?”

系统回复:

“我们的客服电话是400-123-4567,工作时间为每天9:00-18:00。刚刚我们说到注册流程,是否需要我继续帮您完成注册?”


✅ 十、总结

场景 应对方式
用户不按流程提问 加入全局意图识别节点
非流程问题 引导至通用问答节点
回答完后继续流程 使用 resume_flow 节点恢复流程
流程中断频繁 使用 checkpointer 记录状态

如果你想,我可以为你生成一个完整的可运行代码模板,包含:

  • 完整的 State Graph 定义
  • 示例 LLM 回答模拟
  • 支持上下文记忆和流程恢复

是否需要我继续生成这个完整示例代码?

posted @ 2025-06-22 10:20  向着朝阳  阅读(18)  评论(0)    收藏  举报