别再只调API了!用LangChain和AutoGen手把手教你搭建一个能‘思考’的智能客服Agent
从API调用到智能体架构用LangChain与AutoGen构建会思考的电商客服当你在电商平台输入上周买的衬衫尺码不对怎么办时屏幕另一端可能正上演着一场精密的认知交响曲——这个看似简单的问询触发了一个具备记忆、推理和决策能力的数字生命体。它需要检索你的订单记录、理解退货政策、判断商品类别适用规则最后生成符合平台话术的解决方案。这远非传统API调用能够实现而是智能体Agent技术的典型应用场景。1. 为什么我们需要会思考的Agent在2023年之前大多数AI客服还停留在关键词匹配和固定话术库阶段。当用户提出衣服太大想换小一号但缺货怎么办这类复合需求时系统要么要求用户分步操作要么直接转人工。大语言模型的出现改变了这一局面但单纯调用ChatGPT API会遇到三个致命问题缺乏业务上下文模型不知道你的库存数据、促销政策或用户画像不可控的输出风险可能生成不符合企业规范的承诺高昂的推理成本用GPT-4处理每个简单查询如同用超级计算机做加减法智能体架构正是为了解决这些痛点而生。它本质上是一个具备自主决策能力的AI系统核心特征包括状态感知实时获取订单系统、库存数据库等业务状态工具使用调用搜索API、计算器、数据库查询等能力记忆机制维护对话历史和个人化用户画像推理链条将复杂问题拆解为可执行步骤# 一个基础Agent的决策循环示例 def agent_loop(user_input, memory): context retrieve_relevant_data(user_input) # 知识检索 tools select_tools(context) # 工具选择 plan generate_step_by_step_plan(user_input, context, tools) # 任务拆解 for step in plan: execute_step(step) # 执行动作 update_memory(memory, plan_results) # 记忆更新 return generate_response(plan_results) # 响应生成2. 框架选型LangChain还是AutoGen目前最流行的两个智能体框架各有侧重我们通过电商客服场景下的对比来理解它们的差异特性LangChainAutoGen设计哲学模块化乐高积木多Agent协作会议核心优势快速构建单一Agent工作流模拟多角色协作解决问题知识检索内置RAG支持完善需配合其他库实现调试难度中等逻辑线性较高异步交互适合场景标准流程处理复杂问题拆解代码复杂度相对简单需要设计Agent交互协议LangChain更适合处理明确的线性流程比如标准的退换货申请from langchain.agents import AgentExecutor from langchain.agents.openai_functions_agent.base import OpenAIFunctionsAgent # 构建退换货处理Agent def build_return_agent(): tools [get_order_tool, check_inventory_tool, policy_lookup_tool] agent OpenAIFunctionsAgent.from_llm_and_tools(llm, tools) return AgentExecutor(agentagent, toolstools) # 处理用户请求 agent build_return_agent() result agent.run(我收到的蓝色衬衫太大了想换小一号)而AutoGen则擅长处理需要多方协商的复杂场景比如当用户同时询问价格匹配和会员折扣时from autogen import AssistantAgent, UserProxyAgent # 创建不同角色的Agent customer_service AssistantAgent(客服, system_message处理常规咨询) senior_advisor AssistantAgent(高级顾问, system_message解决复杂纠纷) price_engine AssistantAgent(定价引擎, system_message计算最优价格方案) # 配置协作流程 def handle_complex_request(user_query): user_proxy.initiate_chat(customer_service, messageuser_query) if 需要升级 in customer_service.last_message(): user_proxy.initiate_chat(senior_advisor, messagecustomer_service.last_message()) if 价格计算 in senior_advisor.last_message(): user_proxy.initiate_chat(price_engine, messagesenior_advisor.last_message()) return compile_final_response()3. 构建电商知识库RAG实战无论选择哪个框架让Agent准确回答商品相关问题都需要**检索增强生成RAG**技术。以下是使用FAISS向量数据库构建商品知识库的关键步骤数据准备从ERP系统导出商品JSON数据提取产品描述、规格参数、使用指南清洗HTML标签和特殊字符文本分块按语义段落分割非固定长度保留上下文关联标题与内容不分离添加元数据商品ID、类目等向量化处理选用text-embedding-3-large模型处理多语言混合内容归一化向量便于相似度计算from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings def build_product_knowledge_base(): # 加载商品数据 products load_json(products.json) # 文本分块与处理 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200 ) docs text_splitter.create_documents([p[description] for p in products]) # 添加元数据 for doc, product in zip(docs, products): doc.metadata.update({ product_id: product[id], category: product[category] }) # 创建向量库 embeddings OpenAIEmbeddings(modeltext-embedding-3-large) db FAISS.from_documents(docs, embeddings) db.save_local(product_faiss_index)实际查询时我们还需要考虑多级检索策略def retrieve_product_info(query, category_filterNone, n_results3): # 一级检索语义相似度 docs db.similarity_search(query, kn_results*2) # 二级过滤类目匹配 if category_filter: docs [doc for doc in docs if doc.metadata[category] category_filter][:n_results] # 三级排序销售热度加权 return sorted(docs, keylambda x: get_product_score(x.metadata[product_id]))[:n_results]4. 实现多轮对话记忆电商场景下的对话往往需要跨越多个回合比如用户可能先问这件毛衣怎么洗接着问会缩水吗最后问如果缩水能退货吗。实现连贯对话需要注意记忆机制设计要点对话历史压缩避免token爆炸关键事实持久化如用户提及的订单号隐性需求推断从太贵了推断比价需求from langchain_core.messages import AIMessage, HumanMessage from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder # 带记忆的对话链 prompt ChatPromptTemplate.from_messages([ (system, 你是电商客服助手需友好专业地回答问题), MessagesPlaceholder(variable_namechat_history), (human, {input}) ]) def format_chat_history(history): 压缩过长的对话历史 if len(history) 6: return [history[0]] history[-5:] # 保留首条和最近5条 return history chain prompt | llm response chain.invoke({ input: 会缩水吗, chat_history: format_chat_history(previous_messages) })对于更复杂的场景可以使用记忆摘要技术from langchain.chains import ConversationChain from langchain.memory import ConversationSummaryMemory memory ConversationSummaryMemory(llmllm) conversation ConversationChain(llmllm, memorymemory) # 第一轮对话 conversation.run(这件羊毛大衣怎么洗) # 几轮交互后... conversation.run(如果按照这个方法还是缩水了怎么办) # 记忆系统会保持上下文连贯5. 异常处理与性能优化上线前必须考虑的工程化问题常见故障模式API超时导致对话中断错误工具调用引发逻辑混乱敏感信息意外泄露防御性编程示例from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def safe_tool_call(tool_func, *args): try: result tool_func(*args) if contains_sensitive_info(result): return redact_info(result) return result except Exception as e: log_error(e) return f系统暂时无法处理该请求{str(e)}性能优化技巧对小模型进行微调处理简单查询实现工具调用的并行处理缓存高频查询结果# 并行工具调用示例 from concurrent.futures import ThreadPoolExecutor def parallel_tool_execution(tools): with ThreadPoolExecutor(max_workers3) as executor: futures {executor.submit(tool.run): tool for tool in tools} results {} for future in as_completed(futures): tool futures[future] results[tool.name] future.result() return results6. 评估与持续改进一个合格的智能客服Agent需要建立完整的评估体系核心评估维度任务完成率能否解决用户问题对话轮次效率最少交互达成目标用户满意度CSAT评分异常发生率需人工接管次数AB测试配置示例class ABTestingAgent: def __init__(self, variant_a, variant_b, traffic_ratio0.5): self.variants [variant_a, variant_b] self.ratio traffic_ratio def route_request(self, user_query): user_hash hash(user_query.user_id) % 100 variant_idx 0 if user_hash self.ratio*100 else 1 return self.variants[variant_idx].handle(user_query)在实际项目中我们发现最影响用户体验的往往是边缘情况处理能力。例如当用户问上次咨询时张经理说可以特殊处理现在还能吗时Agent需要关联历史会话记录识别张经理的权限范围检查特殊政策是否仍有效生成符合企业话术的回应这种场景下单纯的框架使用远远不够需要深度定制工具和记忆系统。这也是为什么我们建议从标准LangChain实现开始逐步过渡到混合架构——最终我们的生产系统结合了LangChain的工作流引擎和AutoGen的复杂协商能力在保持可维护性的同时处理最棘手的客服场景。