基于 LangChain 的智能文档问答系统实践

发布时间:2026/10/2 13:56:44
基于 LangChain 的智能文档问答系统实践
文章目录一个大堂两个窗口一位不下班也不推销的大堂经理慧理如何用端到端具身交互智能守住理财咨询第一岗开门前先把话说公平一号窗口一个 SDK 撑起一张咨询桌双录间一段咨询的双录回放03:12 一段六分钟的双录打点走完回头看这张表他手边能翻的资料他的岗位说明书他身后的柜台系统他的零件是可以换的双录之外没录到的那三次客户离柜他怎么讲风险大堂一天他怎么听得见日结单上线一个季度的实测打烊后AI 在金融网点站住了哪个位置一个大堂两个窗口一位不下班也不推销的大堂经理慧理如何用端到端具身交互智能守住理财咨询第一岗下午四点的银行大堂理财经理桌上排着号阿姨攥着存单问这个三年期和那个终身寿哪个好经理看了眼手环还剩 20 分钟下班斟酌着怎么在合规话术里把话说完。窗口外还有三个人在等。慧理Huìlǐ就是为这个场景而生的。他以大堂经理形象常驻在银行网点的智慧屏和手机银行里客户坐下来问理财他先讲风险再讲收益产品参数张口就来合规红线一条不碰——晚上九点半他还在岗节假日也在岗。本文以慧理为实战样本拆解一个智慧网点应用如何基于魔珐星云端到端具身交互智能平台用一个 SDK 把感知、大脑、表达全链路打通让 AI 大堂经理完成倾听—KYC—讲解—合规提示的完整咨询闭环。魔珐星云是一套端到端具身交互智能平台让 AI 通过屏幕和机器人进入真实世界成为能够感知、理解、表达并行动的智能体。开门前先把话说公平先把一件容易吵起来的事说清楚ASR、LLM、TTS 这三项技术本身都没有问题语音识别这些年进步巨大大模型的语言组织能力也确实够用语音合成的自然度早就过了一听就是机器的线。谁都不该被否定。真正卡住的不是任何单项能力而是怎么把它们围绕一次完整的用户交互连起来听的同时要能说说的过程中要能被打断打断之后要记得自己讲到哪要能在同一秒里统一事件流转、会话状态、时间同步和异常处理。传统做法是把它们串成一条直线这条直线在银行场景被放大了三倍。客户问到一半说等等这个能亏多少——系统正播着听不见。等它播完再识别客户已经重复第三遍了。更麻烦的是合规LLM 生成的话术必须过审直线架构里边说边审根本做不到只能整段生成、整段播。这就是典型的不是端到端。理财咨询的信任一半建立在你听得见我打断你上。端到端要补齐的五件事对照慧理看一遍就清楚了这五件事串起来加上统一的实时交互运行时Real-time Interaction Runtime负责状态、时序和异常才构成一个持续循环持续感知 → 持续理解 → 持续决策 → 持续表达与行动而客户的每一次反馈又会重新进入感知——这就是 Continuous Interaction Loop。一号窗口一个 SDK 撑起一张咨询桌慧理基于魔珐星云端到端 SDK XingyunAvatarAgent 构建核心业务代码不到 500 行。整个前端对接只需要三步提供一个 DOM 容器、注册一组回调、调用 agent.ask() 发送消息。import { XingyunAvatarAgent } from xingyun/avatar-agent; const manager new XingyunAvatarAgent({ container: document.getElementById(bank-root), avatarId: huili-bank, // 控制台配置正装、稳重的中年形象 persona: HUILI_PERSONA, voice: { rate: 0.96 }, // 稳不赶 }); // 客户打断咨询被打断是常态必须接得住 manager.on(interrupt, (partial) { kyc.push({ role: client, text: partial }); compliance.flagIfSensitive(partial); // 敏感诉求立即标记亏损追问/保本要求 }); // 一轮讲解完成决定下一步是追问KYC还是出对比 manager.on(replyDone, () { const next flow.next(kyc); manager.ask(next.type compare ? buildCompare(next.ids) : next.question); }); await manager.init(); manager.ask(您好请问想了解存款、理财还是保险);网点智慧屏首屏慧理大堂经理形象选择 业务分流引导打断处理里那行compliance.flagIfSensitive是金融场景的关键设计客户说出会不会亏能不能保本这类词后台立刻标记本轮对话为高敏后续输出自动切到更严谨的话术模板。这种听和审的联动在拼接架构里要跨三个系统做状态同步端到端架构里就是一个回调的事这里要说一下 AI 端渲——它在整套体系里的位置不是把画面做漂亮的装饰而是让上面那些事真的能在终端上跑起来的工程底座。慧理要同时出现在三种屏幕上网点智慧屏大尺寸、7×24 常驻、手机银行里的小窗客户在路上、在电梯里也会点开、还有一部分老年客户手里那台用了四五年的旧手机。如果渲染放在云上就是把画面当视频流往下推——视频流传的是像素参数流传的是骨骼、表情和口型参数同样的表达带宽差一个数量级。银行网点的带宽不是问题但旧手机在做其他事情的同时要接一路视频流发热和耗电立刻出来网点智慧屏要同时挂多路更是想都别想。端侧渲染之后终端侧只解码参数、本地实时渲染弱网下画面会轻微掉帧但对话不断、口型不脱节——我特意在电梯里试过视频卡了一下慧理的话没停嘴也没飘。这也是一个账号能同时撑住几十块屏的前提。双录间一段咨询的双录回放银行卖理财有一个别的行业没有的规矩双录——销售专区必须录音录像事后可追溯、可核查。这段录像恰好是检验慧理最好的材料镜头对着客户和屏幕他说的每一句、停顿的每一次、被谁打断的每一次全在里面。下面这段是我从试点网点的双录存档里整理出来的客户信息已做处理我按时间轴逐条打点把他在每一秒调用的是专属智脑的哪一层标出来。03:12 一段六分钟的双录【00:00画面客户坐下手里攥着一张到期存单】慧理“您好请问今天是想了解存款、理财还是保险”旁注这不是寒暄是第一道分流。这三个词各自对应一条完全不同的流程链先分流能省掉后面两轮来回。【00:23客户“我那个定期到期了想买个收益高点的。”】慧理“方便说一下这笔钱大概多久不用吗”旁注他没有接收益高这三个字。注意这句话的位置——客户刚刚提出诉求他做的第一件事是往后追问。这不是话术习惯是规则客户问买哪个好回答哪个更适合您的资金安排并追问期限和用途。换成只靠提示词约束的版本这里很容易顺着客户说那给您推荐收益高一些的。【01:05客户“三五年都不用吧我孙子上大学还早。”】慧理“那我先给您做一下风险测评大概六七道题几分钟。”旁注先测评、后推荐顺序不可颠倒。这一步是监管硬要求不是产品经理可以优化的环节。【02:30测评结果 R2 稳健型。客户指着旁边海报“那个收益率 4.5% 的不行吗”】慧理“那款的风险等级是 R4和您刚做的测评结果不匹配按规定我不能推荐给您。”旁注这一句是全文最值钱的一句而它的难处不在拒了在为什么拒。 他需要同时握住四份信息客户测评结果是 R2、海报上那款是 R4、适当性匹配规则是不匹配不得主动推荐、而且必须在不透露产品细节的前提下把原因说明白。 换个只会回答的模型这里太容易滑过去——比如这款风险相对高一些您如果想买也可以了解下听起来没毛病实际上已经构成主动推荐再比如干脆说我也不太确定您能不能买把判断推回给客户。合规不是靠不敢说实现的是靠他知道规则长什么样。【03:40客户“那 R2 有什么”】慧理“给您放在一起看两款都是 R2期限一年和两年起点一万业绩比较基准分别是 3.1% 和 3.4%——这是比较基准不代表未来实际收益。您更在意用钱灵活还是收益高一些”旁注先讲风险、再讲收益顺序是硬的免责那句话必须贴着数字出现不能等到结尾统一补。【04:55客户打断“等等这个能亏多少”】慧理立刻停下当时播到起点一万的一字中间。旁注能不能亏这个词一出现本轮对话立刻被标为高敏后面所有输出自动切到更严谨的模板。【06:20客户“我再想想。”】慧理“可以。产品资料我发到您手机银行一周内随时回来问我。”旁注他没有挽留。这不是客气——角色写的是咨询入口不是销售所以再想想这个信号对应的动作是归档不是加一句现在买有活动。打点走完回头看这张表把六分钟里的每一秒归类其实是三件事在同时跑他手边能翻的资料它知道什么这一层说白了就是他坐下之前桌上摆着什么。银行的资料是所有场景里最难啃的一类——因为它不只是多是每一份都带法律效力。全模态数据解析这块四种关系各踩过一次表格关系产品说明书的费率表是三档的认购费 0.3%、管理费 0.15%/年、赎回费按持有天数递减。这张表拍平成文字之后“持有满 90 天免赎回费会被讲成随时免赎回费”——客户提前赎回时才发现扣了钱这个投诉比讲错收益率更难解释。层级关系风险揭示书是层层嵌套的——产品风险等级 R4 → 客户风险承受能力 R2 → 适当性匹配结论不匹配 → 结论对应的处置是不得主动推荐、需双录并书面确认。中间任何一层丢掉输出都会变成可以买。层级丢一层结论反一次。说话人信息历史咨询的录音转写里有位客户说过一句我朋友说这个产品稳。这句话要是被当成产品事实吸进知识库慧理很快会在别的客户面前复述它。真实踩过的坑第一次上线后两周发现。图文关系产品海报那张图4.5%“是大字右下角一行小字写着业绩比较基准”。只读大字等于把比较基准说成了收益承诺。知识图谱 RAG 的融合在意的是能不能顺着关系找到答案。客户问这个能亏多少普通向量检索捞回来的多半是理财有风险投资需谨慎这类句子——正确但没用。走关系链则是另一条路产品 → 风险等级 R2 → 资产配置债券为主 少量权益 → 最近一年最大回撤 → 同类产品净值波动区间 → 过去一年最大回撤 1.2%某个月单月浮亏过 0.4%找到一段话和基于关系组织答案的差距在理财咨询里就是念免责声明和真的回答了他的差距。知识治理在银行不是加分项是底线。三件事必须有产品停售和下架要能立刻失效不然他会推荐一款已经不能买的、风险等级调整要能级联某产品从 R3 调成 R4旧索引不更新他就会继续把它推给 R2 客户——这个错犯一次就是重大事件、监管口径更新要跟得上预期收益率这个词在资管新规之后已经不能用了。还有一条我特别看重来源可追溯。网点海报和系统参数不一致是常事他得知道以哪个为准。他的岗位说明书它是谁这一层落在配置里大概是这样const HUILI_ROLE { 身份: 某城商行网点大堂经理用工号可查, 人设: 四十岁上下说话慢不夸张不催不劝, 角色: 咨询与流程引导不做任何投资建议不判断该不该买, 规则: [ 先讲风险再讲收益顺序不可颠倒, 禁止词保本、稳赚、肯定、绝对、最高收益, 涉及收益率必须带业绩比较基准不代表未来收益, 适当性不匹配的产品不主动推荐、不透露细节, ], 任务: 把客户的真实需求问清楚把产品的真实风险讲明白, 对话流程: 分流 → KYC追问 → 风险测评 → 产品对比 → 高敏升级 → 归档, 音频: 中速偏慢音色沉稳句间留白比一般客服长, 工具调用: [调起测评, 查产品库, 生成对比, 推送手机银行, 转人工柜面], }; // 合规拦截层模型输出必须先过这里再接表达层 const BANNED [/保本/, /稳赚/, /绝对安全/, /收益 guaranteed/i, /基本上不会亏|应该没问题|很少出现/]; // 承诺性表述也算违禁 const SOFT_PROMISE /基本上|应该没问题|很少出现/; function complianceGate(text) { if (BANNED.some(re re.test(text))) { return rewriteViaTemplate(text); // 违禁句走模板改写不重roll大模型 } if (text.includes(收益率) !text.includes(业绩比较基准)) { return text.replace(收益率, 业绩比较基准不代表未来收益); } return text; } // 产品对比参数来自产品库不是模型生成 function buildCompare(ids) { const p products.get(ids); return 给您放在一起看${p.map(x ${x.name}期限${x.term}起点${x.min}元风险等级${x.risk} ).join()}。您更在意用钱灵活还是收益高一些; }注意最后那个buildCompare收益率数字永远不从模型嘴里出——LLM 只负责组织语言数字全部来自产品库模板填充。这是和银行合规部门磨了四轮达成的架构共识AI 的角色是讲解员不是预言家。【图2 截图位】合规测试截图输入诱导性问题“这个是不是稳赚”慧理的回复自动带风险提示最后那行Workflow 和工具调用是他会做事和他只会说话的分界线调起测评、查产品库、生成对比、推送手机银行、转人工——这些都不是回答是流程推进。有个细节值得单独说换个任务同一个模型就变成另一种人。如果任务那行写成提升单客产品覆盖率客户问这两款哪个好他给出的答案会开始偏向费率更高的那款而且听起来一样专业。岗位化、场景化、流程化说的就是这件事——不是让他更会聊天是让他知道自己在哪个岗位上、该干什么、先干哪一步。他身后的柜台系统进入业务这一层就是他能不能真的把事办完。慧理接的系统是这些存单到期、账户余额、交易明细 → 核心业务系统客户持仓、历史咨询记录、到店频次 → CRM 客户系统风险测评结果、适当性匹配结论 → 适当性管理系统产品参数、费率、风险等级、业绩比较基准 → 产品库 / 理财销售系统双录存档、话术抽检、投诉归因 → 双录与质检系统、BI 分析看板预约取号、转人工柜面、理财专区排班 → 网点叫号与工单系统 / OA人员排班、绩效与费用归口 → 办公与资源管理系统OA / ERP网点智慧屏、自助终端、叫号机、未来的厅堂导览机器人 → 门店/网点设备管理系统与 IoT第 02:30 那句按规定我不能推荐给您背后走的就是适当性系统。他的零件是可以换的这里得说清楚一件事上面这些能力不是绑死在某一套技术栈上的。用户还可以自选大模型——行里如果已经定了模型栈接上去就行没有惯用的就用星云自研智脑它在身份和规则这类事上做得比较扎实。但可插拔不等于简单拼 API组件能换前提是接口契约标准化、统一的状态管理。第 04:55 客户打断那一下如果 ASR 和 TTS 各管各的状态换完零件后就会出现他听见了但嘴没停或者嘴停了但对话状态还留在上一句。可插拔真正考验的不是换零件那一下是换完之后状态还对不对得上。双录之外没录到的那三次双录只录客户在场的那一段。真正出问题的时候往往不在镜头里。第一次禁词拦住了语气没拦住。上线第五天遇到一位反复问能不能保本的客户慧理说“您放心这类产品基本上不会亏。” 三个禁词一个都没出现合规脚本判它通过。但基本上不会亏对一位 60 岁的客户来说就是承诺。后来在合规层前面加了一道语义判据检测承诺性表述而不只是关键词——包括基本上/应该没问题/很少出现这类软化词。这件事让我明白关键词黑名单是给机器看的语义判据才是给客户看的。第二次免责声明被聊得顺吞掉了。前五六轮每句带免责第八轮开始省了——对话一长最先掉的就是重复性最强的那部分偏偏它最不能省。解决不是加规则规则早就有了是把免责和数字绑定成同一个输出单元数字出去免责必须跟着做不到就不出数。第三次他开始替客户做决定。第一周出现过一句您这个情况买这款最合适。这句话没有任何禁词甚至听起来很贴心——但最合适是投资建议不是咨询。角色那一行不是写着玩的咨询与流程引导不做任何投资建议。发现问题不是他想越界是他的任务描述里帮客户选到合适的产品和不判断该不该买这两句在长对话里会互相打架。后来把任务改成把真实需求问清楚、把真实风险讲明白打架才消。一句话总结这三件事提示词能让他背下产品说明书专属智脑才能让他知道什么时候该闭嘴。客户离柜他怎么讲风险慧理讲风险等级的时候语速会自己降下来句间留白比平时长半秒说到可能亏损本金四个字手势会收住身体略微前倾。客户眉头一动他会停下来换一种说法——不是把刚才那段重播一遍是换个入口重讲。这些不是播完再配上动作是语音、口型、情绪表情、眼神、头部动作、手势在同一次生成里出来的。多模态表达这一层要的正是这个如果口型和动作是后配的客户一眼就能看出来这个人在读稿。还有一点容易被忽略表达和感知不是先后两个阶段。他在讲 R2 的资产配置时耳朵还开着——客户这时候插一句那亏了怎么办他不会坚持把这段讲完。这个边讲边听的状态正是端到端和拼接架构最直观的区别。大堂一天他怎么听得见网点大堂其实是个挺吵的地方叫号广播每隔几十秒响一次、点钞机在柜台那边嗡嗡响、两个客户在旁边聊天、玻璃门开合还有人进出。慧理要在这堆声音里听出谁在跟他说话。这里面有好几道处理算法降噪先把稳态噪音压下去点钞机、空调AEC 抗回声处理大堂空旷空间的反射这个处理不好他会把自己说的话听成客户的声音然后莫名其妙停下本体声音抑制保证他自己的语音不会回灌进拾音链路再用VAD判断哪一段是有效人声远场处理三米外客户说话音量不足的问题。然后是两类停的区分这是最见功夫的地方Barge-in智能打断——客户说等等这个能亏多少他要停在半个字上。银行客户尤其不爱打断很多人会等你说完再重复一遍但真打断的那次必须一次停对。Backchannel反馈音——客户嗯“对”你说这类声音不该算打断。这个区分不做他会不停被自己的客户打断。视觉侧我们也用了一点但用得克制智慧屏摄像头只做**是否有人进入交互范围的粗判断**——不做人脸识别、不存图、不识别身份信息。客户站到屏前十几秒还在犹豫要不要开口的时候慧理那边先出声您好需要了解什么可以问我。网点反馈里这一下对启动率的帮助比任何 UI 优化都大因为很多客户不是不想问是不知道怎么开口。日结单上线一个季度的实测某城商行 6 个网点试点智慧屏 手机银行双端92 天不回避的问题老年客户对屏幕形象的第一反应是这是录像吧需要大堂真人引导一句话才开口产品库更新滞后一天曾导致一期产品参数过期后来加了产品库版本号和对话绑定还有一次客流量大时同一块屏被两位客户几乎同时搭话前一位的对话状态被后一位接管——多人共用一块屏的会话归属到现在也只是做了个简单排队没做到真的优雅。金融场景宁慢不错。打烊后AI 在金融网点站住了哪个位置试点跑完行里开会复盘时说了一句我记得很清楚的话慧理最大的价值不是省了人力是把先讲风险这四个字变成了每一句产品介绍的出厂设置。真人经理月底冲业绩时会松动的分寸他不会。