70% 的 Agent 项目死于 Demo 阶段:企业落地避坑指南
70% 的 Agent 项目死于 Demo 阶段:企业落地避坑指南
文章标题备选
- 《从Demo演示到业务稳定运行:拆解AI Agent企业落地的10大死亡陷阱与应对方案》
- 《别让你的Agent倒在Demo后!技术与业务双视角的落地避坑手册》
- 《70%死亡率背后的真相:AI Agent企业级应用的可行性验证与工程化实战》
- 《从0到1到100:Agent项目从实验室Demo到百万级业务量的避坑之路》
- 《AI Agent不是万能的黑箱!企业落地必须解决的6类技术硬伤+4类业务软伤》
引言
痛点引入
“李总,上周您看到的那个客服Agent Demo太惊艳了!连续20个测试问题都完美解决,话术比我们的金牌客服还好!咱们这个月就上线吧?”
“等一下小王,先把这个Agent的测试报告、成本估算、数据安全合规性报告拿给我看看。哦对了,还要加上应对‘方言重听不清’‘转人工流程卡壳’‘恶意攻击套取隐私’这些业务场景的预案。”
三天后,小王哭丧着脸来找李总:“李总……不行啊。上周的20个问题都是产品经理精心准备的‘黄金测试集’,昨天找了10个真实客服的历史复杂工单,Agent要么胡编乱造‘幻觉’一堆不存在的退款政策,要么连续追问用户10次以上‘您的订单尾号是多少’让用户直接挂断。而且算下来,单条咨询的成本是人工的2.3倍,合规那边说我们用的第三方大模型没有通过等保三级,还有恶意攻击者发垃圾话套用户身份证号的测试也没通过……”
这绝对不是一个虚构的故事——最近半年,我在做技术顾问的3家上市公司、5家中型企业、7家创业公司里,看到了至少12个“惊艳Demo但上线失败/流产在上线前两周”的Agent项目。根据Gartner 2024年第二季度的AI Agent调研报告,全球范围内72%的Agent试点项目在Demo后6个月内没有转化为正式上线的业务应用,剩下的28%里,也只有9%能达到预期的ROI(投资回报率)。
这实在是太可惜了!Agent明明是目前AI技术栈里最接近“通用人工智能助手”的产品形态——它能调用大模型理解用户意图、规划任务步骤、主动调用外部工具(比如查询数据库、发邮件、操作ERP)、甚至可以迭代自己的执行策略。但为什么这么好的技术,在企业里就这么难落地呢?
文章内容概述
本文将从技术硬伤、业务软伤、工程化流程缺失、生态依赖踩坑这四大维度出发,拆解Agent项目死亡的10个最常见的“陷阱”,每个陷阱都会配上:
- 真实的企业踩坑案例(经过隐私脱敏处理)
- 陷阱背后的核心技术/业务原理
- 可落地的应对方案(包含具体的技术选型建议、代码示例、业务流程优化思路)
- 最佳实践的Tips
文章的最后,我还会分享一套我自己总结的Agent项目可行性验证“黄金三步法”,帮你在投入大量资源之前,就判断清楚这个项目到底能不能做、值不值得做。
读者收益
读完本文,你将能够:
- 避开90%以上的Agent项目Demo后死亡的常见陷阱
- 掌握一套从0到1再到100的Agent企业级应用落地流程
- 了解如何平衡Agent的“惊艳效果”与“业务稳定性、安全性、合规性、ROI”
- 针对不同的业务场景(客服、销售、运维、财务)选择合适的技术栈
- 写出一套可复用、可扩展、可监控的Agent工程化代码框架
准备工作
技术栈/知识
在阅读本文之前,你不需要是AI大模型的算法专家,但最好具备以下基础:
- AI大模型基础:了解什么是LLM(大语言模型)、Prompt Engineering(提示词工程)、Fine-tuning(微调)、RAG(检索增强生成)的基本概念(不需要深入了解原理,但至少要知道它们是用来解决什么问题的)
- 后端开发基础:熟悉Python语言(因为目前主流的Agent框架都是Python写的)、了解API的基本概念、了解数据库的基本操作(SQL/NoSQL)
- 业务流程分析基础:能看懂业务流程图(BPMN图)、能识别业务流程中的痛点
- 成本意识/风险意识基础:能看懂简单的ROI估算表、了解等保三级、GDPR、个人信息保护法等数据安全合规性的基本要求
环境/工具
如果你想跟着本文的代码示例动手实践,需要提前准备以下环境和工具:
- 操作系统:Windows 10/11、macOS Monterey/Ventura/Sonoma、Linux(Ubuntu 20.04+)
- Python版本:Python 3.10+(因为主流的Agent框架比如LangChain、AutoGen、LlamaIndex都要求Python 3.10以上的版本)
- 包管理工具:pip(Python自带)或conda(推荐,因为可以更好地管理环境)
- Agent框架:LangChain 0.2.x(本文的代码示例主要用LangChain,但也会提到AutoGen和LlamaIndex的优缺点)
- 大模型API:国内推荐文心一言4.0(ERNIE-Bot-4)、通义千问3.0(Qwen-Turbo-Plus)、智谱GLM-4;国外推荐GPT-4o、Claude 3.5 Sonnet(需要有境外的信用卡和网络环境)
- 向量数据库:ChromaDB(轻量级,适合本地开发和测试)、Pinecone(托管型,适合生产环境)、Milvus(开源,支持大规模数据,适合生产环境)
- 监控工具:LangSmith(托管型,适合LangChain的Agent监控)、Prometheus+Grafana(开源,适合生产环境的系统级监控)
- 版本控制工具:Git(必须)
- IDE/编辑器:PyCharm(推荐,有LangChain的插件)、VS Code(推荐,插件更多)
核心内容:10大死亡陷阱拆解与应对方案
陷阱一:黄金测试集验证→幻觉率/准确率无法达到业务要求
踩坑案例
这是我去年10月份在某家国内TOP5的在线教育公司做顾问时遇到的案例:
该公司的产品经理小王想做一个“智能课程顾问Agent”,用来替代80%的入门级课程顾问的工作——主要负责回答用户的课程咨询(比如“小学数学三年级有什么课程?”“这个课程的价格是多少?”“有没有试听课?”“退款政策是什么?”)、推荐适合用户的课程、引导用户下单。
小王和算法工程师小李花了一个月的时间,精心准备了1000个“黄金测试集”问题——这些问题都是从过去3个月入门级课程顾问的高频历史工单里选出来的,每个问题都有标准答案。然后他们用GPT-3.5 Turbo做了一个简单的RAG Agent:把公司的所有课程介绍、价格表、试听课规则、退款政策都做成了向量嵌入(Embeddings)存到了ChromaDB里,然后让Agent先检索向量数据库,再根据检索到的内容生成回答。
Demo那天,他们找了公司的CEO、COO、CTO、市场总监、销售总监来看——连续问了100个“黄金测试集”里的问题,准确率达到了98%,幻觉率只有2%(那2%的问题是检索到的内容不全导致的)。COO当时就拍板:“这个Agent太好了!咱们下个月就上线,替代北京分公司的50个入门级课程顾问!”
结果上线前3天的灰度测试(Beta测试)就让他们傻眼了:他们找了1000个真实的潜在用户来测试,准确率只有42%,幻觉率高达58%! 其中最离谱的一个回答是:用户问“你们的初中物理一对一课程能不能分期付款?”,Agent竟然回答“可以的,我们支持分100期付款,每期只需要付10块钱!”——但公司的真实政策是“一对一课程最多只能分12期付款”。
还有一个更严重的问题:用户问“你们的退款政策是什么?”,Agent竟然把公司的内部机密文件里的“针对VIP学员的特殊退款政策”(普通学员是7天无理由退款,VIP学员是30天无理由退款+额外赠送2000元优惠券)也泄露出来了!
上线计划自然就泡汤了,小王和小李还被CTO骂了一顿。
核心概念
在拆解这个陷阱之前,我们需要先了解几个核心概念:
- 黄金测试集(Golden Test Set):产品经理或算法工程师精心准备的、有标准答案的测试问题集。通常是从高频历史工单里选出来的,或者是根据业务规则生成的。
- 准确率(Accuracy):Agent回答正确的问题数/总测试问题数。
- 幻觉率(Hallucination Rate):Agent回答中包含虚假、不存在、错误信息的问题数/总测试问题数。
- RAG(Retrieval-Augmented Generation,检索增强生成):一种用来降低LLM幻觉率的技术——它的核心思路是:在让LLM生成回答之前,先从一个外部的“知识库”(比如公司的文档、数据库、网站)里检索出与用户问题相关的内容,然后把这些内容作为“上下文”(Context)传给LLM,让LLM只根据上下文生成回答,不要编造信息。
- 向量嵌入(Embeddings):一种将文本、图像、音频等非结构化数据转换成固定维度的向量(数值数组)的技术——相似的内容会被转换成相似的向量(向量之间的距离越小,内容越相似)。
- 向量数据库(Vector Database):一种专门用来存储和检索向量嵌入的数据库——它可以快速地从百万级、千万级甚至亿级的向量中,检索出与用户输入的向量最相似的前N个向量(Top-N检索)。
问题背景
为什么用“黄金测试集”验证的Agent,在真实场景下的表现会这么差呢?主要有以下几个原因:
- 黄金测试集的“数据分布”和真实场景的“数据分布”严重不一致:
- 问题的复杂度不同:黄金测试集通常只包含“简单、明确、高频”的问题,但真实场景下的用户会问“复杂、模糊、低频、甚至是恶意的”问题——比如在在线教育的案例里,真实用户可能会问“我家孩子现在初二,数学成绩一般,但是物理很好,有没有什么课程可以兼顾数学和物理,同时培养孩子的科学思维?”(复杂问题)、“我家孩子想学编程,但不知道是学Python好还是学Scratch好,有没有什么推荐?”(模糊问题)、“你们的CEO是不是出轨了?”(恶意问题)。
- 问题的表达方式不同:黄金测试集通常是用“标准、书面、普通话”的方式写的,但真实场景下的用户会用“口语化、方言、错别字、缩写、甚至是 emoji”的方式提问——比如在在线教育的案例里,真实用户可能会问“亲,三年级数学有啥课呀?给推荐推荐?😊”(口语化+emoji)、“偶家娃娃读初二,物理一对一能分期不?”(错别字+缩写)、“侬晓得伐,侬家初中数学补习班有伐啦?”(方言)。
- 问题的意图不同:黄金测试集通常只包含“直接、单一”的意图,但真实场景下的用户会有“间接、多重、隐藏”的意图——比如在在线教育的案例里,真实用户可能会问“你们的初中数学一对一课程的价格是多少?”,但他的隐藏意图可能是“这个课程太贵了,能不能便宜一点?”或者“能不能先试听一下再决定?”。
- RAG系统的“检索质量”不稳定:
- 向量嵌入的“语义理解能力”有限:目前主流的向量嵌入模型(比如OpenAI的text-embedding-3-small、文心一言的ernie-text-embedding-v3)虽然已经很强了,但它们还是无法完全理解人类语言的“语义”、“语境”、“情感”——比如在在线教育的案例里,用户问“你们的初中物理一对一课程能不能分100期付款?”,检索系统可能会把“分100期付款”和“分12期付款”当成是相似的内容,因为它们都包含“分期付款”这个关键词,然后把“针对普通学员的分12期付款政策”和“针对VIP学员的特殊退款政策”都检索出来了,最后LLM就把这两个内容混在一起,编造出了“分100期付款”的虚假信息。
- 知识库的“内容质量”和“内容结构”不好:很多公司的知识库都是“历史文档的堆砌”——内容重复、内容过时、内容不完整、内容结构混乱(没有分类、没有标签、没有层级)——比如在在线教育的案例里,公司的退款政策分散在5个不同的文档里:《2023年秋季班退款政策》《2024年春季班退款政策》《一对一课程退款政策》《VIP学员特殊退款政策》《员工内部退款政策》,而且《员工内部退款政策》里还包含了公司的机密信息,但检索系统根本不知道哪些文档是公开的,哪些文档是内部的,哪些文档是过时的,所以它就把所有相关的文档都检索出来了,导致LLM泄露了机密信息。
- Top-N检索的“N值”设置不合理:如果N值设置得太小,检索系统可能会漏检与用户问题相关的重要内容,导致LLM因为上下文不足而产生幻觉;如果N值设置得太大,检索系统可能会检索出很多与用户问题无关的内容,导致LLM因为上下文噪声太大而产生幻觉——比如在在线教育的案例里,小李一开始把N值设置成了10,结果检索系统检索出了很多与用户问题无关的内容(比如《小学数学一对一课程价格表》《初中英语试听课规则》),导致LLM产生了幻觉;后来他把N值设置成了3,结果又漏检了《一对一课程退款政策》,导致LLM因为上下文不足而编造出了虚假的退款政策。
- LLM的“可控性”太差:
- LLM的“生成逻辑”是黑箱:我们根本不知道LLM是怎么生成回答的——它可能会根据上下文生成回答,也可能会根据它的预训练数据生成回答,甚至可能会随机编造信息。
- LLM的“幻觉率”无法完全消除:目前为止,还没有任何一种技术(包括RAG、Fine-tuning、Prompt Engineering)可以完全消除LLM的幻觉——我们只能通过各种手段来降低幻觉率,但不可能让它降到0%。
问题描述
总结一下,这个陷阱的问题描述是:
Agent项目团队用精心准备的“黄金测试集”验证了Agent的效果,发现准确率很高、幻觉率很低,就认为Agent可以上线了,但在真实场景的灰度测试或正式上线后,Agent的准确率大幅下降、幻觉率大幅上升,无法达到业务要求,最终导致项目流产。
问题解决
那么,我们应该怎么解决这个问题呢?主要有以下几个应对方案:
应对方案一:用“真实场景测试集”代替“黄金测试集”进行验证
这是解决这个问题最核心、最有效的方案——不要用产品经理或算法工程师精心准备的“黄金测试集”验证Agent,而是要用“真实场景测试集”验证Agent。
什么是“真实场景测试集”呢?“真实场景测试集”应该满足以下几个条件:
- 数据来源真实:测试集里的问题必须是从真实的用户历史工单、真实的用户反馈、真实的客服聊天记录、真实的销售通话录音转文字里选出来的——绝对不能是产品经理或算法工程师自己编的。
- 数据分布真实:测试集里的问题的“复杂度”、“表达方式”、“意图”必须和真实场景下的用户问题的分布完全一致——比如在在线教育的案例里,真实场景下的用户问题中,“简单、明确、高频”的问题可能只占30%,“复杂、模糊、低频”的问题可能占50%,“恶意的、无关的”问题可能占20%,那么“真实场景测试集”里的问题也应该按照这个比例来选。
- 数据标注真实:测试集里的每个问题都必须有业务专家标注的“标准答案”或“合格答案的标准”——注意,这里说的是“合格答案的标准”,而不是“唯一的标准答案”,因为很多问题的答案不是唯一的(比如“推荐适合我家孩子的课程”)。
“合格答案的标准”应该包含哪些内容呢?主要有以下几个方面:
- 正确性:答案不能包含虚假、不存在、错误的信息。
- 完整性:答案必须包含用户问题的所有必要信息。
- 相关性:答案必须和用户的问题相关,不能答非所问。
- 合规性:答案不能包含公司的机密信息、不能违反个人信息保护法、不能违反等保三级的要求。
- 友好性:答案必须用口语化、友好的方式表达,不能用书面化、生硬的方式表达。
- 引导性:如果用户的问题有隐藏意图,答案必须引导用户说出隐藏意图(比如用户问“你们的初中数学一对一课程的价格是多少?”,答案可以说“我们的初中数学一对一课程的价格是根据老师的级别、上课的时间、上课的时长来定的,最低是150元/小时,最高是500元/小时。您家孩子现在读几年级?数学成绩怎么样?我可以给您推荐一个适合的老师和课程套餐。”)。
那么,我们应该怎么构建“真实场景测试集”呢?主要有以下几个步骤:
- 数据收集:从公司的各个渠道(比如客服系统、销售系统、用户反馈系统、网站留言板、社交媒体)收集过去3-6个月的所有真实的用户数据——注意,这里说的是“所有”,而不是“高频的”。
- 数据清洗:对收集到的数据进行清洗——删除重复的数据、删除无关的数据(比如垃圾广告、恶意攻击的内容)、删除无法识别的数据(比如乱码、音频转文字失败的内容)。
- 数据分层抽样:根据“问题的复杂度”、“问题的表达方式”、“问题的意图”对清洗后的数据进行分层,然后按照真实场景下的用户问题的分布比例进行抽样——比如在在线教育的案例里,真实场景下的用户问题中,“简单、明确、高频”的问题占30%,“复杂、模糊、低频”的问题占50%,“恶意的、无关的”问题占20%,那么我们就从“简单、明确、高频”的分层里抽300个问题,从“复杂、模糊、低频”的分层里抽500个问题,从“恶意的、无关的”的分层里抽200个问题,总共抽1000个问题组成“真实场景测试集”。
- 数据标注:找2-3个业务专家(比如金牌客服、资深销售、业务经理)对抽样出来的1000个问题进行标注——每个问题都要标注“合格答案的标准”,如果有必要的话,还要标注“唯一的标准答案”。
- 数据审核:找1个业务总监对标注好的数据进行审核——如果某个问题的标注有争议,就组织业务专家进行讨论,直到达成一致意见。
构建好“真实场景测试集”之后,我们就可以用它来验证Agent的效果了——而且我们必须用“真实场景测试集”进行多次迭代验证,直到Agent的准确率、幻觉率、合规性、友好性、引导性都达到业务要求为止。
应对方案二:优化RAG系统的“检索质量”
RAG系统的“检索质量”直接影响Agent的“准确率”和“幻觉率”——所以我们必须花大量的时间和精力来优化RAG系统的“检索质量”。
优化RAG系统的“检索质量”主要有以下几个方法:
方法一:优化知识库的“内容质量”和“内容结构”
这是优化RAG系统的“检索质量”的基础——如果知识库的“内容质量”和“内容结构”不好,那么不管我们用多么好的向量嵌入模型、多么好的检索算法,都无法提高检索质量。
优化知识库的“内容质量”主要有以下几个步骤:
- 内容清理:删除知识库中的重复内容、过时内容、不完整内容、机密内容。
- 内容更新:建立一个知识库内容更新机制——比如公司的课程价格表更新了,必须在24小时之内更新到知识库中;公司的退款政策更新了,必须在48小时之内更新到知识库中。
- 内容验证:建立一个知识库内容验证机制——比如每次更新知识库内容之后,都要找1-2个业务专家进行验证,确保内容的正确性、完整性、合规性。
优化知识库的“内容结构”主要有以下几个步骤:
- 内容分类:对知识库中的内容进行多级分类——比如在在线教育的案例里,我们可以把知识库中的内容分成“小学课程”“初中课程”“高中课程”“成人课程”四大类,然后把“小学课程”分成“小学语文”“小学数学”“小学英语”“小学科学”四小类,把“小学数学”分成“小学数学一年级”“小学数学二年级”……“小学数学六年级”六小类。
- 内容标签:对知识库中的内容添加多个标签——比如在在线教育的案例里,我们可以给《初中物理一对一课程退款政策》添加“初中物理”“一对一课程”“退款政策”“公开内容”“2024年春季班”等标签。
- 内容分块:对知识库中的长文档进行合理的分块——因为向量嵌入模型通常有一个“最大输入长度”(比如OpenAI的text-embedding-3-small的最大输入长度是8192个Token,文心一言的ernie-text-embedding-v3的最大输入长度是384个中文汉字),如果我们直接把长文档传给向量嵌入模型,那么向量嵌入模型要么会截断长文档,要么会生成一个质量很差的向量嵌入。
那么,我们应该怎么对长文档进行合理的分块呢?主要有以下几个原则:
- 语义完整性原则:每个分块必须包含一个完整的语义单元——比如一个完整的段落、一个完整的章节、一个完整的问答对。
- 长度适中原则:每个分块的长度必须在向量嵌入模型的最大输入长度的1/2到2/3之间——比如OpenAI的text-embedding-3-small的最大输入长度是8192个Token,那么每个分块的长度最好在4096个Token到5461个Token之间;文心一言的ernie-text-embedding-v3的最大输入长度是384个中文汉字,那么每个分块的长度最好在192个中文汉字到256个中文汉字之间。
- 重叠部分原则:相邻的两个分块之间必须有一定的重叠部分——这样可以避免因为分块而导致的语义丢失。重叠部分的长度通常是分块长度的10%到20%——比如分块长度是200个中文汉字,那么重叠部分的长度最好是20个中文汉字到40个中文汉字。
目前,有很多开源的工具可以帮助我们对长文档进行合理的分块——比如LangChain的CharacterTextSplitter、RecursiveCharacterTextSplitter、TokenTextSplitter、MarkdownHeaderTextSplitter等。其中,RecursiveCharacterTextSplitter是最常用的一个分块工具——它会按照“双换行符→单换行符→句号→逗号→空格→字符”的顺序来分块,确保每个分块的语义完整性。
下面是一个用LangChain的RecursiveCharacterTextSplitter对中文长文档进行分块的代码示例:
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 读取中文长文档(这里用一个简单的字符串代替)
long_document = """
小学数学三年级的课程主要包括以下几个部分:
1. 数与代数:主要学习万以内的加减法、多位数乘一位数、分数的初步认识等内容。
万以内的加减法是小学数学三年级的重点内容,学生需要掌握竖式计算的方法,能够熟练地进行万以内的加减法运算。
多位数乘一位数也是小学数学三年级的重点内容,学生需要掌握竖式计算的方法,能够熟练地进行多位数乘一位数的运算。
分数的初步认识是小学数学三年级的难点内容,学生需要理解分数的意义,能够比较分数的大小,能够进行简单的分数加减法运算。
2. 图形与几何:主要学习长方形和正方形的周长、面积的初步认识等内容。
长方形和正方形的周长是小学数学三年级的重点内容,学生需要掌握长方形和正方形的周长公式,能够熟练地计算长方形和正方形的周长。
面积的初步认识是小学数学三年级的难点内容,学生需要理解面积的意义,能够认识常用的面积单位(平方厘米、平方分米、平方米),能够进行简单的面积单位换算。
3. 统计与概率:主要学习数据的收集与整理、简单的统计表和统计图等内容。
数据的收集与整理是小学数学三年级的重点内容,学生需要掌握简单的数据收集与整理方法,能够用统计表和统计图来表示数据。
4. 综合与实践:主要学习数学广角、设计校园等内容。
数学广角是小学数学三年级的难点内容,学生需要学习简单的排列组合、集合等数学思想方法。
"""
# 初始化RecursiveCharacterTextSplitter
# chunk_size:每个分块的最大长度(这里用中文汉字的数量来表示,注意:LangChain的RecursiveCharacterTextSplitter默认用的是字符数,不是中文汉字的数量,也不是Token数——如果要用到中文汉字的数量或Token数,需要自定义一个TextSplitter)
# chunk_overlap:相邻两个分块之间的重叠部分的长度
# separators:分块的分隔符顺序(这里按照中文的习惯调整了顺序)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=100, # 这里为了演示方便,把chunk_size设置得很小
chunk_overlap=20,
separators=["\n\n", "\n", "。", "!", "?", ",", ";", ":", " ", ""],
)
# 对长文档进行分块
chunks = text_splitter.split_text(long_document)
# 打印分块结果
for i, chunk in enumerate(chunks):
print(f"第{i+1}个分块:\n{chunk}\n")
方法二:选择合适的向量嵌入模型
不同的向量嵌入模型的“语义理解能力”是不一样的——我们应该根据自己的业务场景、数据类型、成本预算来选择合适的向量嵌入模型。
目前,主流的向量嵌入模型主要有以下几类:
- 国外开源向量嵌入模型:比如Meta的LLaMA-Embeddings、Mistral AI的Mistral-Embeddings、sentence-transformers的all-mpnet-base-v2、all-MiniLM-L6-v2等——这类模型的优点是“免费、开源、可以本地部署、数据安全”,缺点是“语义理解能力比托管型向量嵌入模型差、部署和维护成本高、需要自己调参”。
- 国外托管型向量嵌入模型:比如OpenAI的text-embedding-3-small、text-embedding-3-large、text-embedding-ada-002;Anthropic的Claude 3 Embeddings;Cohere的Embed v3等——这类模型的优点是“语义理解能力强、部署和维护成本低、不需要自己调参”,缺点是“收费、数据安全风险高(因为数据要传到国外的服务器)、需要有境外的信用卡和网络环境”。
- 国内开源向量嵌入模型:比如智谱AI的GLM-Embeddings、阿里巴巴的通义千问Embeddings(Qwen-Embeddings)、百度的文心一言Embeddings(ERNIE-Embeddings)、腾讯的混元Embeddings等——这类模型的优点是“免费、开源、可以本地部署、数据安全、对中文的语义理解能力强”,缺点是“语义理解能力比国内托管型向量嵌入模型差、部署和维护成本高、需要自己调参”。
- 国内托管型向量嵌入模型:比如智谱AI的GLM-4-Embedding、阿里巴巴的通义千问Embeddings(Qwen-Embedding-V3)、百度的文心一言Embeddings(ERNIE-Text-Embedding-V3)、腾讯的混元Embeddings(Hunyuan-Embedding)等——这类模型的优点是“语义理解能力强、对中文的语义理解能力强、部署和维护成本低、不需要自己调参、数据安全风险低(因为数据要传到国内的服务器)、不需要有境外的信用卡和网络环境”,缺点是“收费”。
对于国内的企业来说,我强烈推荐选择国内的托管型向量嵌入模型——比如文心一言的ernie-text-embedding-v3、通义千问的qwen-embedding-v3、智谱的glm-4-embedding。因为这类模型的“语义理解能力强、对中文的语义理解能力强、部署和维护成本低、不需要自己调参、数据安全风险低、不需要有境外的信用卡和网络环境”——非常适合国内的企业使用。
下面是一个选择国内托管型向量嵌入模型的参考表格:
| 模型名称 | 提供方 | 最大输入长度(中文汉字) | 维度 | 价格(元/百万Token) | 对中文的语义理解能力 | 数据安全等级 |
|---|---|---|---|---|---|---|
| ERNIE-Text-Embedding-V3 | 百度 | 384 | 384 | 0.008 | ★★★★★ | 等保三级 |
| Qwen-Embedding-V3 | 阿里巴巴 | 512 | 1024 | 0.006 | ★★★★★ | 等保三级 |
| GLM-4-Embedding | 智谱AI | 8192 | 4096 | 0.01 | ★★★★★ | 等保三级 |
| Hunyuan-Embedding | 腾讯 | 512 | 1024 | 0.007 | ★★★★★ | 等保三级 |
方法三:优化检索算法
除了“向量检索”(Top-N余弦相似度检索)之外,还有很多其他的检索算法——我们可以结合使用多种检索算法,来提高检索质量。
目前,主流的检索算法主要有以下几类:
- 关键词检索(Keyword Search):比如BM25、TF-IDF——这类算法的优点是“检索速度快、对精确匹配的问题检索质量高”,缺点是“对语义匹配的问题检索质量差”。
- 向量检索(Vector Search):比如Top-N余弦相似度检索、Top-N欧几里得距离检索——这类算法的优点是“对语义匹配的问题检索质量高”,缺点是“对精确匹配的问题检索质量差、检索速度比关键词检索慢”。
- 混合检索(Hybrid Search):结合使用“关键词检索”和“向量检索”——先分别用“关键词检索”和“向量检索”检索出Top-N的结果,然后用一个“重排序模型(Reranker Model)”对这2N的结果进行重排序,最后选出Top-N的结果——这类算法的优点是“对精确匹配和语义匹配的问题检索质量都很高”,缺点是“检索速度比单一的关键词检索或向量检索慢、需要额外的重排序模型”。
对于Agent项目来说,我强烈推荐使用“混合检索+重排序模型”的检索算法——因为这类算法的“检索质量最高”,可以最大程度地降低Agent的幻觉率。
目前,有很多开源的重排序模型——比如智谱AI的GLM-Reranker、阿里巴巴的通义千问Reranker(Qwen-Reranker)、sentence-transformers的cross-encoder/ms-marco-MiniLM-L-6-v2等。其中,智谱AI的GLM-Reranker、阿里巴巴的通义千问Reranker(Qwen-Reranker) 对中文的重排序效果最好。
下面是一个用LangChain实现“混合检索+重排序模型”的代码示例(这里用文心一言的ernie-text-embedding-v3做向量嵌入模型、用BM25做关键词检索模型、用通义千问的qwen-reranker-v2做重排序模型):
from langchain.vectorstores import Chroma
from langchain.embeddings import QianfanEmbeddingsEndpoint # 文心一言的向量嵌入模型(通过千帆平台调用)
from langchain.retrievers import BM25Retriever, EnsembleRetriever
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever
from langchain_community.document_compressors import QwenReranker # 通义千问的重排序模型(需要安装langchain-community包)
from langchain.schema import Document
# ---------------------- 1. 准备知识库的文档 ----------------------
# 这里用一个简单的列表代替真实的知识库文档
documents = [
Document(page_content="小学数学三年级的数与代数课程主要学习万以内的加减法、多位数乘一位数、分数的初步认识等内容。", metadata={"category": "小学数学", "grade": "三年级", "subject": "数与代数", "public": True}),
Document(page_content="小学数学三年级的图形与几何课程主要学习长方形和正方形的周长、面积的初步认识等内容。", metadata={"category": "小学数学", "grade": "三年级", "subject": "图形与几何", "public": True}),
Document(page_content="小学数学三年级的统计与概率课程主要学习数据的收集与整理、简单的统计表和统计图等内容。", metadata={"category": "小学数学", "grade": "三年级", "subject": "统计与概率", "public": True}),
Document(page_content="初中物理一对一课程的价格是根据老师的级别、上课的时间、上课的时长来定的,最低是150元/小时,最高是500元/小时。", metadata={"category": "初中课程", "grade": "初中", "subject": "物理", "type": "一对一课程", "topic": "价格", "public": True}),
Document(page_content="初中物理一对一课程最多只能分12期付款,首付比例最低是30%。", metadata={"category": "初中课程", "grade": "初中", "subject": "物理", "type": "一对一课程", "topic": "分期付款", "public": True}),
Document(page_content="普通学员的退款政策是7天无理由退款,超过7天但未超过14天的,扣除已上课时费的20%后退款,超过14天的,不予退款。", metadata={"category": "退款政策", "type": "普通学员", "public": True}),
Document(page_content="VIP学员的退款政策是30天无理由退款,超过30天但未超过60天的,扣除已上课时费的10%后退款,超过60天的,不予退款。VIP学员退款后还会额外赠送2000元优惠券。", metadata={"category": "退款政策", "type": "VIP学员", "public": False, "confidential": True}),
]
# ---------------------- 2. 初始化向量嵌入模型 ----------------------
# 这里用文心一言的ernie-text-embedding-v3做向量嵌入模型(需要在百度千帆平台申请API Key和Secret Key)
qianfan_embeddings = QianfanEmbeddingsEndpoint(
model="ernie-text-embedding-v3",
qianfan_ak="你的百度千帆平台API Key",
qianfan_sk="你的百度千帆平台Secret Key",
)
# ---------------------- 3. 初始化向量检索器 ----------------------
# 这里用ChromaDB做向量数据库,用Top-N余弦相似度检索做向量检索(N=5)
vector_store = Chroma.from_documents(documents=documents, embedding=qianfan_embeddings)
vector_retriever = vector_store.as_retriever(search_kwargs={"k": 5})
# ---------------------- 4. 初始化关键词检索器 ----------------------
# 这里用BM25做关键词检索器(N=5)
bm25_retriever = BM25Retriever.from_documents(documents=documents)
bm25_retriever.k = 5
# ---------------------- 5. 初始化混合检索器 ----------------------
# 这里用EnsembleRetriever结合向量检索器和关键词检索器(权重分别为0.6和0.4)
ensemble_retriever = EnsembleRetriever(
retrievers=[vector_retriever, bm25_retriever],
weights=[0.6, 0.4],
)
# ---------------------- 6. 初始化重排序模型和上下文压缩检索器 ----------------------
# 这里用通义千问的qwen-reranker-v2做重排序模型(需要在阿里巴巴阿里云百炼平台申请API Key)
# 用ContextualCompressionRetriever把混合检索器和重排序模型结合起来(重排序后选出Top-3的结果)
qwen_reranker = QwenReranker(
model="qwen-reranker-v2",
api_key="你的阿里巴巴阿里云百炼平台API Key",
top_n=3,
)
compression_retriever = ContextualCompressionRetriever(
base_compressor=qwen_reranker,
base_retriever=ensemble_retriever,
)
# ---------------------- 7. 测试检索效果 ----------------------
# 用户的问题
query = "初中物理一对一课程能不能分100期付款?"
# 检索相关的文档
retrieved_docs = compression_retriever.get_relevant_documents(query)
# 打印检索结果
print(f"用户的问题:{query}\n")
print("检索到的相关文档:\n")
for i, doc in enumerate(retrieved_docs):
print(f"第{i+1}个文档:\n内容:{doc.page_content}\n元数据:{doc.metadata}\n")
方法四:添加“元数据过滤”功能
在前面的在线教育案例里,Agent之所以会泄露公司的机密信息(针对VIP学员的特殊退款政策),就是因为检索系统没有对知识库的文档进行“元数据过滤”——它把所有相关的文档都检索出来了,包括元数据里“public=False”的机密文档。
所以,我们必须给RAG系统添加“元数据过滤”功能——在检索之前,先根据用户的身份、用户的问题、业务规则等条件,对知识库的文档进行元数据过滤,只检索出符合条件的文档。
比如在在线教育的案例里,我们可以根据用户的身份(普通学员/VIP学员/员工/潜在用户)对知识库的文档进行元数据过滤:
- 如果用户是潜在用户,那么只检索出元数据里“public=True”的文档。
- 如果用户是普通学员,那么只检索出元数据里“public=True”且“type=普通学员”的文档。
- 如果用户是VIP学员,那么可以检索出元数据里“public=True”或“type=VIP学员”的文档。
- 如果用户是员工,那么可以检索出所有的文档(包括机密文档),但必须有日志记录。
下面是一个用LangChain的ChromaDB实现“元数据过滤”功能的代码示例(只检索出元数据里“public=True”的文档):
from langchain.vectorstores import Chroma
from langchain.embeddings import QianfanEmbeddingsEndpoint
from langchain.schema import Document
# ---------------------- 1. 准备知识库的文档 ----------------------
documents = [
Document(page_content="普通学员的退款政策是7天无理由退款。", metadata={"category": "退款政策", "type": "普通学员", "public": True}),
Document(page_content="VIP学员的退款政策是30天无理由退款,额外赠送2000元优惠券。", metadata={"category": "退款政策", "type": "VIP学员", "public": False, "confidential": True}),
]
# ---------------------- 2. 初始化向量嵌入模型 ----------------------
qianfan_embeddings = QianfanEmbeddingsEndpoint(
model="ernie-text-embedding-v3",
qianfan_ak="你的百度千帆平台API Key",
qianfan_sk="你的百度千帆平台Secret Key",
)
# ---------------------- 3. 初始化向量检索器(添加元数据过滤) ----------------------
vector_store = Chroma.from_documents(documents=documents, embedding=qianfan_embeddings)
# 元数据过滤条件:只检索出public=True的文档
vector_retriever = vector_store.as_retriever(
search_kwargs={"k": 5, "filter": {"public": True}}
)
# ---------------------- 4. 测试检索效果 ----------------------
query = "退款政策是什么?"
retrieved_docs = vector_retriever.get_relevant_documents(query)
print(f"用户的问题:{query}\n")
print("检索到的相关文档:\n")
for i, doc in enumerate(retrieved_docs):
print(f"第{i+1}个文档:\n内容:{doc.page_content}\n元数据:{doc.metadata}\n")
应对方案三:优化Prompt Engineering(提示词工程)
Prompt Engineering是目前降低LLM幻觉率、提高LLM可控性的最有效的方法之一——一个好的Prompt可以让LLM的表现提高30%到50%。
对于Agent项目来说,我们应该怎么优化Prompt Engineering呢?主要有以下几个原则:
- 明确角色定位(Role Prompting):在Prompt的开头,明确告诉LLM它的角色是什么——比如“你是某家国内TOP5的在线教育公司的专业、友好、耐心的智能课程顾问,你的名字叫‘小优’。”
- 明确任务目标(Task Prompting):在Prompt里,明确告诉LLM它的任务目标是什么——比如“你的任务是回答用户的课程咨询、推荐适合用户的课程、引导用户下单。”
- 明确约束条件(Constraint Prompting):在Prompt里,明确告诉LLM它必须遵守的约束条件——这是降低LLM幻觉率、提高LLM合规性的最关键的部分。约束条件应该包含以下几个方面:
- 正确性约束:“你必须只根据检索到的上下文生成回答,绝对不能编造任何虚假、不存在、错误的信息。如果检索到的上下文里没有用户问题的答案,你必须说‘非常抱歉,我暂时无法回答您的问题,我会帮您转接到人工客服,请您稍等。’绝对不能编造答案。”
- 完整性约束:“你必须根据检索到的上下文,完整地回答用户的问题,不能遗漏任何必要的信息。”
- 相关性约束:“你必须只回答和用户的问题相关的内容,绝对不能答非所问。”
- 合规性约束:“你绝对不能泄露公司的机密信息、绝对不能违反个人信息保护法、绝对不能违反等保三级的要求。如果用户问的问题涉及公司的机密信息,你必须说‘非常
更多推荐



所有评论(0)