大爷想问劳动纠纷却不会打字?具身交互智能法律援助顾问开口就能聊
接了个法律援助的活儿,差点被数字人延迟逼疯
年初接了一个区法律援助中心的项目,需求听起来很简单:在法律援助大厅放一台设备,来访群众可以咨询常见的法律问题——劳动纠纷、房屋租赁、婚姻家事、工伤赔偿。
我当时的想法是:这有什么难的?接个大模型,做个Agent,搞个数字人方案,齐活。
结果从选型到上线,整整踩了一个月的坑。写这篇复盘,主要是给自己记个教训,也给想做类似项目的朋友一些参考。
坑一:纯文本Agent在法律场景根本不够用
第一版我做得很快。用LangChain搭了一个Agent,接了DeepSeek做推理,知识库灌了《劳动法》《民法典》和一些地方性法规,RAG检索。功能上没问题,问答准确率能到85%以上。
但交付的时候,法律援助中心的工作人员看了一眼就说:来访的人很多年纪大了,眼神不好,打字费劲。能不能让它直接说话?
这确实是我忽略的。法律援助的服务对象,很大一部分是低收入群体和老年人。让他们在一个文本框里输入"我被公司辞退了,公司没给赔偿怎么办",这个交互门槛太高了。
AI需要一张嘴,一个形象,一个能面对面交流的存在。
坑二:传统数字人方案的延迟让人崩溃
于是我开始找数字人方案。先是试了一个开源方案,效果嘛——我说完一句话,等了两秒多数字人才开口。两秒多什么概念?正常对话的间隙大概在200-500ms,超过1秒对方就会觉得"这个人在想很久",超过2秒就会觉得"是不是卡了"。
来访群众对着屏幕说了句话,然后盯着一个呆滞的脸等了两秒,这个体验放在法律援助大厅,只会让人觉得"这个机器不靠谱"。
更致命的是不支持打断。有个测试场景是:数字人在念一段关于劳动仲裁流程的说明,来访者听到一半突然想到一个问题想插嘴,但数字人完全不理会,继续念完了整段。来访者直接放弃了,转头走了。
在法律场景里,打断是刚需。当事人讲到一半情绪上来了,想补充细节,想纠正你说的不对的地方,你必须能随时停下来听他说。
坑三:硬件成本不是开玩笑的
法律援助中心给的预算有限,不可能买几万块的专业终端。我一开始找的渲染方案需要GPU服务器,光一台服务器的价格就超预算了。
后来才知道,有些方案走的是云端渲染路线——每一帧画面都在服务器上算好再推流下来,当然贵。真正能落地的方案,必须走端侧渲染,让设备本身的算力来处理。
最终方案:DeepSeek + 星云SDK + 大屏一体机
折腾了一圈,最终的方案是这样的:
大模型用DeepSeek,法律领域的推理能力不错,而且API价格友好,适合政务类项目的预算。Agent层用LangChain做RAG,知识库是法律援助中心提供的法规汇编和案例库。
交互层换了魔珐星云的SDK。说实话,换过去之后延迟直接降到500ms左右,体感上就是"话音刚落数字人就接上了"。而且它走的是自研参数流+端侧解算的技术路线——简单说就是云端只传控制参数过来,渲染在本地设备上完成,所以不需要GPU服务器,一台普通的大屏一体机就能跑。
// 星云SDK初始化 - 法律援助终端
const sdk = new XmovAvatar({
containerId: "#legal-assistant",
appId: APP_ID,
appSecret: APP_SECRET,
gatewayServer: "https://nebula-agent.xingyun3d.com/user/v1/ttsa/session",
onMessage: (msg) => {
if (msg.type === "voice_state_change") {
const state = msg.state || msg;
if (state === "idle" || state === "end") {
// 播报完毕或被打断后idle,检查队列
processPendingQueue();
}
}
},
proxyWidget: {
"subtitle_on": (data) => {
// 自定义字幕样式,适配大屏阅读
const sub = document.getElementById("legal-subtitle");
sub.innerText = data.text;
sub.style.display = "block";
return false;
},
"subtitle_off": () => {
document.getElementById("legal-subtitle").style.display = "none";
return false;
}
}
});
await sdk.init({
onDownloadProgress: (p) => {
if (p < 100) showProgress(p);
}
});
打断逻辑在法律场景特别重要,我做了个排队机制:
let pendingQueue = [];
// 来访者随时可以打断
function onUserInterrupt(question) {
sdk.interactiveidle(); // 先打断当前播报
pendingQueue.push(question);
// 等voice_state_change回调到idle状态后,再播报新内容
}
function processPendingQueue() {
if (pendingQueue.length > 0) {
const nextQuestion = pendingQueue.shift();
const answer = await getLegalAnswer(nextQuestion);
// 按句拆分,流式播报
const sentences = splitSentences(answer);
sentences.forEach((s, i) => {
sdk.speak(s, i === 0, i === sentences.length - 1);
});
}
}
上线后的数据
跑了两个月,一些数据供参考:
日均交互量从最初的30多次涨到了120多次。来访者的平均交互时长从第一周的2分钟提升到了第六周的5分钟——说明大家逐渐信任了这个"AI法律顾问"。
打断率大概在25%左右,说明四分之一的对话中来访者会插嘴补充信息或纠正内容。如果数字人不能处理打断,这些交互的体验会大打折扣。
有一个细节让我比较欣慰:法律援助中心的工作人员说,现在来访者排队的时间短了,因为一些基础的法律咨询数字人就能解答,不需要等人工窗口。工作人员也能把精力集中在更复杂的案件上。
复盘总结
回头看这个项目,核心教训就三条:
第一,线下场景的AI交互,不能只有"大脑"没有"身体"。大模型再强,如果只能输出文字到屏幕上,对很多用户群体来说就等于不存在。具身交互智能不是锦上添花,是基础设施。
第二,延迟是生命线。500ms和2秒的差距,在用户体验上就是"能用"和"没人用"的区别。
第三,硬件成本决定了你能不能真正落地。方案再好,如果一台设备要几万块,政务场景根本铺不开。
如果你也在做类似的线下AI交互项目,建议先去星云官网领个SDK试试,跑一下延迟和打断效果,心里有个底再选型。
有问题可以在评论区聊。
暂时无法在飞书文档外展示此内容
官方地址:https://xingyun3d.com/?utm_campaign=daily&utm_source=juzhen
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)