【LangChain实战—智能客服问答系统构建】

张开发
2026/4/11 9:55:34 15 分钟阅读

分享文章

【LangChain实战—智能客服问答系统构建】
1. LangChain与智能客服的完美结合第一次接触LangChain是在去年帮一家电商平台搭建智能客服系统时。当时客户抱怨传统客服机器人总是答非所问要么就是冷冰冰的固定话术。而当我用LangChain搭建的demo在3秒内给出了精准的产品退换货政策解答时整个会议室都安静了——这就是大语言模型与专业框架结合的魅力。LangChain本质上是个乐高积木箱把大模型应用开发中那些重复造轮子的工作都标准化了。比如你要做个客服系统最头疼的几件事怎么接入企业知识库怎么让AI记住对话历史怎么处理用户的各种奇葩提问LangChain早就准备好了现成模块我们只需要像拼积木一样组装就行。在电商场景中我实测过LangChain的几个杀手锏功能多轮对话记忆用户问上周买的衣服能退吗接着问运费谁承担系统能自动关联前后文混合检索同时搜索结构化数据产品数据库和非结构化文档客服话术手册动态路由简单问题直接查知识库复杂问题自动转人工并附上对话记录2. 从零搭建智能客服问答系统2.1 环境配置与数据准备建议用conda新建个Python3.9环境太新的Python版本可能会遇到依赖冲突。有GPU的话一定要装faiss-gpu检索速度能快10倍不止。这是我常用的依赖清单pip install langchain0.1.0 pip install faiss-cpu # 或faiss-gpu pip install sentence-transformers pip install pandas openpyxl数据准备有个坑要特别注意千万别直接把公司Excel文档扔给系统。我见过最惨的案例是有人把带合并单元格的报价单直接导入导致检索结果全是乱码。正确的预处理流程应该是用pandas读取时指定dtypestr防止数字被误处理合并多列内容时加入列名作为前缀对超长文本进行智能分段后面会讲import pandas as pd from langchain.schema import Document data pd.read_excel(product_qa.xlsx, dtypestr) documents [] for _, row in data.iterrows(): content f【{row[问题类型]}】{row[标准问题]}\n答案{row[官方解答]} documents.append(Document(page_contentcontent))2.2 文本向量化实战选embedding模型就像选咖啡豆没有绝对的最好只有最适合。对于中文客服场景我强烈推荐试试text2vec-base-chinese这个开源模型它在专业术语理解上比通用模型强不少from langchain.embeddings import HuggingFaceEmbeddings embeddings HuggingFaceEmbeddings( model_nameGanymedeNil/text2vec-base-chinese, model_kwargs{device: cuda} # 用GPU加速 )处理长文档时千万别直接用split(\n)那样会破坏语义连贯性。我常用的组合拳是先用RecursiveCharacterTextSplitter按段落切分对技术文档再用MarkdownHeaderTextSplitter保留标题结构最后用SentenceTransformersTokenTextSplitter控制token数量from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter( chunk_size300, chunk_overlap50, length_functionlen, is_separator_regexFalse ) split_docs text_splitter.split_documents(documents)3. 构建智能检索核心3.1 向量数据库优化技巧Faiss虽然速度快但默认的L2距离不一定适合客服场景。我发现用余弦相似度调整ivf参数效果更好from langchain.vectorstores import FAISS db FAISS.from_documents( split_docs, embeddings, distance_strategyCOSINE, # 改用余弦相似度 faiss_indexfaiss.IndexIVFFlat( faiss.IndexFlatIP(768), 768, 100 ) )相似度阈值是个需要反复调试的参数。根据我的经验商品咨询类0.65-0.75售后政策类0.8以上敏感话题如退款必须0.85retriever db.as_retriever( search_typesimilarity_score_threshold, search_kwargs{ score_threshold: 0.75, k: 5 # 最多返回5条结果 } )3.2 混合检索策略纯向量检索有时会漏掉关键词完全匹配的情况。我开发了一套混合检索方案先用BM25做关键词初筛对候选结果再做向量精排加入业务规则过滤如优先展示最新政策from rank_bm25 import BM25Okapi # 构建BM25检索器 corpus [doc.page_content for doc in split_docs] bm25 BM25Okapi([doc.split() for doc in corpus]) def hybrid_search(query): # 关键词检索 bm25_scores bm25.get_scores(query.split()) candidates [ (score, split_docs[i]) for i, score in enumerate(bm25_scores) if score 0 ] # 向量精排 vector_results db.similarity_search_with_score(query, k10) # 合并结果 all_results candidates vector_results all_results.sort(keylambda x: x[0], reverseTrue) return [doc for _, doc in all_results[:5]]4. 大模型对话链设计4.1 提示词工程实战写prompt就像教新人客服话术既要有原则又不能限制太死。这是我的万能模板from langchain_core.prompts import ChatPromptTemplate template 你是一名专业的{domain}客服请根据以下规则回答问题 1. 严格依据提供的参考内容回复 2. 不知道就说需要进一步确认 3. 保持亲切但专业的语气 4. 涉及金额/日期必须精确 参考内容 {context} 用户问题{input} prompt ChatPromptTemplate.from_template(template)针对不同业务线可以动态替换domain参数比如电商、银行、航空等。有个细节要注意在金融场景必须加上您的回答仅供参考具体以合同为准的免责声明。4.2 完整对话链实现这里我用GLM-4做演示实际部署时建议高并发场景用API模式内网环境用本地部署的ChatGLM3对时效性要求高的搭配function callingfrom langchain.chains import create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_community.chat_models import ChatZhipuAI llm ChatZhipuAI(modelglm-4, temperature0.3) document_chain create_stuff_documents_chain(llm, prompt) retrieval_chain create_retrieval_chain(retriever, document_chain) response retrieval_chain.invoke({ input: 商品签收后7天还能退货吗, domain: 电商 })温度参数temperature建议设置常规咨询0.3-0.5稳定优先营销场景0.7-1.0更有创意投诉处理0.2绝对严谨5. 生产环境部署要点5.1 性能优化方案在日均10万咨询量的电商平台我们通过以下优化将响应时间从5s降到800msFAISS索引优化使用HNSW32替代IVFFlat缓存策略对高频问题缓存回答模板异步处理检索和大模型推理并行执行分级响应简单问题直接返回知识库片段# 异步处理示例 import asyncio from langchain.chains import RetrievalQA async def async_query(query): chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever ) return await chain.arun(query) # 并发处理多个查询 queries [运费多少, 保修期多久] results asyncio.gather(*[async_query(q) for q in queries])5.2 监控与迭代上线只是开始我们建立了完整的监控体系人工审核队列对低置信度回答自动标记bad case分析每周抽样200条失败案例AB测试新老模型答案对比知识库健康度定期检测过期内容最实用的监控指标是直接解决率首轮回答满意率转人工率平均对话轮次敏感词触发次数在金融项目中发现一个规律当直接解决率低于65%时通常意味着知识库需要更新了。而电商场景的转人工率如果突然升高很可能是大促期间出现了新促销规则。

更多文章