当前位置: 首页 > article >正文

#CSDN博客-智能客服RAG实战

基于 Milvus Ollama(BGE-M3) DeepSeek 的智能客服 RAG 实战一、项目背景在社保、医保、就业等公共服务领域每天都有大量群众拨打热线咨询相似问题。传统人工客服成本高、效率低而基于关键词匹配的机器人又难以理解用户的真实意图。本项目基于RAGRetrieval-Augmented Generation检索增强生成架构搭建了一套智能客服系统实现用户问题语义理解非关键词匹配从知识库中精准检索相关问答基于 LLM 生成自然语言回答自动推荐相关问题引导用户继续咨询支持语音输入和语音播报二、整体架构用户(语音/文本输入) │ ▼ ┌─────────────┐ │ Flask服务 │ ← HTTPS部署 │ (后端API) │ └──────┬──────┘ │ ▼ ┌──────────────────┐ ┌──────────────────┐ │ Ollama本地服务 │ │ Milvus向量数据库 │ │ (bge-m3 向量化) │────▶│ (知识库语义检索) │ └──────────────────┘ └────────┬─────────┘ │ Top-20 相似问答 ▼ ┌──────────────────┐ │ DeepSeek API │ │ (LLM推理生成回答) │ └────────┬─────────┘ │ ▼ 回答 推荐问题 (SSE流式 / 普通返回)三、技术栈组件技术选型说明Embedding模型Ollama bge-m3本地部署免费支持中英文混合向量数据库Milvus开源高性能支持COSINE相似度大语言模型DeepSeek API (deepseek-chat)推理能力强性价比高后端服务Flask flask_cors轻量级支持HTTPS前端HTML JS jQuery支持语音输入(讯飞) Markdown渲染四、环境准备4.1 安装 Ollama 并拉取模型# 安装Ollama参考官方文档 https://ollama.com# 拉取中文Embedding模型ollama pull bge-m3验证模型是否可用curlhttp://localhost:11434/api/embeddings-d{ model: bge-m3:latest, prompt: 社保缴费年限不够怎么办 }返回结果中包含embedding字段即为成功。4.2 部署 Milvus推荐使用 Docker 部署# 下载docker-compose.ymlwgethttps://github.com/milvus-io/milvus/releases/download/v2.4.0/milvus-standalone-docker-compose.yml-Odocker-compose.yml# 启动dockercompose up-d4.3 安装Python依赖pipinstallflask flask-cors pymilvus requests chardet五、知识库构建5.1 创建Milvus集合frompymilvusimport(MilvusClient,FieldSchema,CollectionSchema,DataType)clientMilvusClient(urihttp://your_milvus_host:19530,tokenyour_token,db_namedefault)fields[FieldSchema(nameuid,dtypeDataType.INT64,is_primaryTrue,auto_idFalse,max_length100),FieldSchema(nameQuestion,dtypeDataType.VARCHAR,max_length5000),FieldSchema(nameAnswer,dtypeDataType.VARCHAR,max_length5000),FieldSchema(nameVector,dtypeDataType.FLOAT_VECTOR,dim1024),]schemaCollectionSchema(fields,社保知识库向量存储)client.create_collection(collection_nameSI_knowledge,schemaschema,dimension1024)注意bge-m3 模型输出的向量维度为1024创建集合时dim必须一致。5.2 创建向量索引defcreate_index(client:MilvusClient,collection_name:str):index_paraclient.prepare_index_params()index_para.add_index(field_nameVector,index_typeIVF_FLAT,metric_typeCOSINE,params{nlist:1024})client.create_index(collection_namecollection_name,index_paramsindex_para)5.3 导入知识库数据将业务问答数据向量化并存入Milvus。核心逻辑先检索是否已存在语义相似的问答去重再插入新数据。defvectorize_text(text):urlhttp://localhost:11434/api/embeddingsheaders{Content-Type:application/json,Accept:application/json}data{model:bge-m3:latest,prompt:text}responserequests.post(url,jsondata,headersheaders)ifresponse.status_code200:returnresponse.json().get(embedding,[])returnNonedefimport_knowledge(client,question,answer,uid):vectorvectorize_text(question)# 去重先检索是否存在语义高度相似的问题search_params{metric_type:COSINE,params:{radius:0.87}}resclient.search(collection_nameSI_knowledge,data[vector],limit10,output_fields[uid,Question],search_paramssearch_params)iflen(res[0])0:print(f已存在相似问题:{res[0][0][entity][Question]})return# 插入新数据data{uid:uid,Question:question,Answer:answer,Vector:vector}client.insert(collection_nameSI_knowledge,datadata)print(f插入成功: uid{uid})六、核心服务实现6.1 Flask服务主框架fromflaskimportFlask,request,render_template,Response,stream_with_contextfrompymilvusimportMilvusClientfromflask_corsimportCORSimportrequests,json,time appFlask(__name__)CORS(app)# Milvus连接配置clientMilvusClient(uriyour_milvus_host:19530,tokenyour_token,db_namedefault)# DeepSeek API配置DEEPSEEK_URLhttps://api.deepseek.com/chat/completionsDEEPSEEK_API_KEYos.environ.get(DEEPSEEK_API_KEY)# 建议使用环境变量headers{Content-Type:application/json,Accept:application/json,Authorization:fBearer{DEEPSEEK_API_KEY}}# 向量检索参数search_params{metric_type:COSINE,params:{radius:0.5}}6.2 本地Embedding向量化defvectorize_text(text):调用本地Ollama的bge-m3模型进行文本向量化urlhttp://localhost:11434/api/embeddingsheaders{Content-Type:application/json,Accept:application/json}data{model:bge-m3:latest,prompt:text}responserequests.post(url,jsondata,headersheaders)ifresponse.status_code200:returnresponse.json().get(embedding,[])returnNone为什么用本地Ollama做Embedding免费调用无API费用数据不出内网安全可控bge-m3 对中文语义理解效果优秀6.3 普通问答接口同步返回app.route(/getAnser,methods[GET])defget_answer():questionrequest.args.get(q)# 1. 问题向量化vectorvectorize_text(question)# 2. Milvus语义检索获取Top-20相关问答resclient.search(collection_nameSI_knowledge,data[vector],limit20,output_fields[uid,Question,Answer],search_paramssearch_params)# 3. 构建DeepSeek的请求data{model:deepseek-chat,messages:[],stream:False,temperature:0.3,max_tokens:8192}# 用户问题带Prompt约束data[messages].append({role:user,content:(question只能使用提供的上下文进行逻辑推理不要提示根据提供的上下文。回答问题后推荐相关的3个问题且不含回答及序号且答案与推荐的问题之间用separate分开且问题的答案在前面)})# 将检索到的知识库答案作为System上下文注入foriteminres[0]:data[messages].append({role:system,content:item[entity][Answer]})# 4. 调用DeepSeek生成回答start_timetime.time()responserequests.post(DEEPSEEK_URL,jsondata,headersheaders)print(f耗时:{time.time()-start_time:.2f}s)ifresponse.status_code200:resultresponse.json()contentresult[choices][0][message][content]# 5. 解析回答和推荐问题answer,recommendparse_answer_and_recommend(content)returnanswerseparaterecommendreturn6.4 流式问答接口SSE实时返回defsafe_decode(byte_data:bytes,encodingutf-8)-str:兼容多种编码格式的字节解码try:encodingrequests.compat.chardet.detect(byte_data)[encoding]returnbyte_data.decode(encoding)exceptUnicodeDecodeError:returnbyte_data.decode(encoding,errorsreplace)app.route(/getAnserStream,methods[GET])defget_answer_stream():questionrequest.args.get(q)# 1. 向量化 检索同上vectorvectorize_text(question)resclient.search(collection_nameSI_knowledge,data[vector],limit20,output_fields[uid,Question,Answer],search_paramssearch_params)# 2. 构建请求streamTruedata{model:deepseek-chat,messages:[],stream:True,temperature:0.3,max_tokens:8192}data[messages].append({role:user,content:(question只能使用提供的上下文进行逻辑推理不要提示根据提供的上下文如果发现是问了多个问题拆分问题。回答问题后从上下文中推荐相关的3个问题且不含回答及序号且答案与推荐的问题之间用separate分开且问题的答案在前面)})foriteminres[0]:data[messages].append({role:system,content:f问:{item[entity][Question]}?答:{item[entity][Answer]}})# 3. 流式调用DeepSeekresponserequests.post(DEEPSEEK_URL,jsondata,headersheaders,streamTrue)ifresponse.status_code200:defgenerate():forlineinresponse.iter_lines():ifline:textsafe_decode(line).replace(data: ,)try:chunkjson.loads(text)contentchunk[choices][0][delta][content]yieldcontentexceptException:passreturnResponse(stream_with_context(generate()),mimetypetext/plain)return6.5 解析回答和推荐问题defparse_answer_and_recommend(raw_content:str):从LLM输出中分离答案和推荐问题# 处理DeepSeek-R1的思考标记char_think\u25b8positionraw_content.find(char_think)startposition8ifposition0else0contentraw_content[start:]# 分离答案和推荐问题sepseparatesep_poscontent.find(sep)ifsep_pos0:answercontent[:sep_pos]recommend_textcontent[sep_poslen(sep):]# 清洗推荐问题文本linesrecommend_text.split(\n)cleaned[]forlineinlines:fornoisein[相关推荐问题,相关问题推荐,推荐相关问题,*,:,]:lineline.replace(noise,)iflen(line)4:cleaned.append(line)recommendseparate.join(cleaned)returnanswer,recommendreturncontent,七、前端集成7.1 流式请求与Markdown渲染functionaskllm(question){varallResult;fetch(/getAnserStream?qencodeURIComponent(question)).then(response{constreaderresponse.body.getReader();constdecodernewTextDecoder();functionreadChunk(){returnreader.read().then(({done,value}){if(done){// 流结束解析推荐问题constsepIndexallResult.indexOf(separate);constanswerallResult.slice(0,sepIndex);// 使用marked.js渲染Markdowndocument.getElementById(result).innerHTMLmarked(allResult.substring(0,sepIndex));// 解析并渲染推荐问题...return;}consttextdecoder.decode(value);allResulttext;document.getElementById(result).innerHTMLtext;readChunk();});}readChunk();});}7.2 语音输入讯飞语音识别前端集成了讯飞实时语音转写iat用户可以通过点击麦克风按钮直接语音提问语音识别结果自动发送给后端进行问答。7.3 语音播报讯飞TTS回答生成完成后自动调用讯飞TTS进行语音播报实现完整的语音交互闭环。八、HTTPS部署if__name____main__:app.run(host0.0.0.0,port443,ssl_context(path/to/server.crt,path/to/server.key))生产环境建议使用 Nginx 反向代理 Let’s Encrypt 证书而非直接在Flask中启用HTTPS。九、关键技术细节9.1 Prompt工程本项目的Prompt设计核心思路用户问题 约束条件 → 要求LLM 1. 只能使用提供的上下文推理防止幻觉 2. 不提示根据提供的上下文更自然 3. 拆分多问题场景 4. 输出答案 推荐问题用特殊分隔符分隔将检索到的知识库答案以system角色注入格式为问:xxx?答:xxx让LLM理解上下文结构。9.2 相似度阈值调优参数值说明radius0.5检索阈值越高越严格limit20检索返回条数metric_typeCOSINE余弦相似度temperature0.3LLM温度值偏低以保持准确知识库去重时使用radius0.87确保高语义相似的问题不会重复入库。9.3 选择bge-m3的原因中英文混合支持bge-m3 多语言效果好维度适中1024维Milvus检索效率高本地部署零成本通过Ollama本地运行无需API调用十、效果展示用户提问示例用户: “职工缴费年限不够怎么办”系统回答:从知识库检索到Top-20相关问题及答案DeepSeek基于上下文生成结构化回答自动推荐3个相关问题如养老保险缴费标准是什么、灵活就业人员如何参保等十一、优化方向Prompt输出结构化当前使用separate分隔符解析推荐问题可改为JSON格式输出更稳定Rerank重排序在Milvus检索后增加Rerank模型如bge-reranker提升Top-K准确率对话历史管理当前为单轮对话可增加session管理实现多轮上下文缓存层高频问题可加Redis缓存减少重复的Embedding和LLM调用知识库更新机制定时从业务系统同步最新问答数据十二、总结本项目通过Ollama本地Embedding Milvus向量检索 DeepSeek推理的RAG架构实现了零Embedding API成本的语义检索基于知识库的准确回答减少幻觉流式输出 语音交互的良好用户体验整套方案技术栈开源、部署简单适合政府、企业等有私有知识库的智能客服场景。相关技术文档Milvus官方文档https://milvus.io/docsOllama官方文档https://ollama.comDeepSeek API文档https://platform.deepseek.com/api-docsbge-m3模型https://huggingface.co/BAAI/bge-m3

相关文章:

#CSDN博客-智能客服RAG实战

基于 Milvus Ollama(BGE-M3) DeepSeek 的智能客服 RAG 实战 一、项目背景 在社保、医保、就业等公共服务领域,每天都有大量群众拨打热线咨询相似问题。传统人工客服成本高、效率低,而基于关键词匹配的机器人又难以理解用户的真实意图。 本项目基于 …...

3步搞定Windows远程桌面控制:UltraVNC开源工具深度解析

3步搞定Windows远程桌面控制:UltraVNC开源工具深度解析 【免费下载链接】UltraVNC 👁️ UltraVNC Server, UltraVNC Viewer, UltraVNC Repeater and UltraVNC SC | Official repository: https://github.com/ultravnc/UltraVNC 项目地址: https://gitc…...

Cursor Pro高效激活工具:突破试用限制,全平台解锁AI编程无限可能

Cursor Pro高效激活工具:突破试用限制,全平台解锁AI编程无限可能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Y…...

MuseTalk技术解析与实践指南:实时高质量AI唇同步视频实现方案

MuseTalk技术解析与实践指南:实时高质量AI唇同步视频实现方案 【免费下载链接】MuseTalk MuseTalk: Real-Time High Quality Lip Synchorization with Latent Space Inpainting 项目地址: https://gitcode.com/gh_mirrors/mu/MuseTalk MuseTalk作为腾讯音乐娱…...

好写作AI毕业论文功能揭秘:为什么用了AI反而不会写了?因为你忽略了最关键的三个字

当别人还在用AI替代思考的时候,聪明人已经把AI变成了学术教练。 ——大家好,我是教论文写作的XX老师。今天不教你“用什么”,而教你怎么“用对”。 先问你一个问题:你用AI写过论文吗? 如果你用过,你可能会…...

TSPR-AI概率化递推引擎与跨端智能生态构建

TSPR-AI概率化递推引擎与跨端智能生态构建文档版本:V2.0 发布日期:2026年4月9日 所属机构:拓世网络技术开发工作室(陕西省渭南市临渭区)摘要本文档旨在阐述拓世网络技术开发工作室自研的全栈式AI内容工程与跨端智能技术…...

Segment方案在VXLAN分布式网关DCI互联中的实践与优化

1. Segment方案与VXLAN分布式网关的黄金组合 第一次接触Segment方案时,我正面临两个数据中心之间二层网络无法互通的棘手问题。传统方案需要在两端数据中心维护完全一致的VXLAN参数,就像要求两个国家使用相同的邮政编码体系,实际操作中几乎不…...

排序算法指南:归并排序

前言:归并排序的核心思想是利用分治法(Divide and Conquer)策略,它将一个大的问题分解成小的、容易解决的子问题,然后将子问题的解合并起来,从而得到原问题的解。一、归并排序的核心思想分(Divi…...

SmolVLA实战教程:USAGE.md文档结构解析与核心功能速查表

SmolVLA实战教程:USAGE.md文档结构解析与核心功能速查表 1. 引言:为什么你需要关注SmolVLA? 如果你正在寻找一个既强大又轻量的机器人控制模型,那么SmolVLA绝对值得你花时间了解。想象一下,一个只有5亿参数的模型&am…...

工业PHP网关灰度发布失效真相:基于OpenResty+Lua的AB测试网关配置(含CI/CD流水线嵌入脚本)

第一章:工业PHP网关灰度发布失效真相溯源 在某大型工业物联网平台中,PHP构建的API网关长期采用基于Header(如 X-Release-Stage: canary)的灰度路由策略,但近期多次出现灰度流量未按预期分流、新版本服务被全量调用的现…...

化工园区智慧巡检平台

化工园区智慧巡检平台概述化工园区智慧巡检平台通过物联网、大数据、人工智能等技术,实现巡检流程数字化、智能化,提升安全性和效率。平台通常涵盖设备监控、隐患识别、数据分析、应急响应等功能,助力园区管理降本增效。核心功能模块实时监控…...

解锁课程论文新姿势:书匠策AI,你的学术魔法棒

在学术的征途上,课程论文如同那初出茅庐的勇士,既怀揣着对知识的渴望,又面临着诸多未知的挑战。选题迷茫、结构混乱、内容匮乏、修改繁琐……这些问题像一道道难关,横亘在许多学子面前。但别怕,今天我要给大家揭秘一个…...

终极指南:如何完整解锁Steam游戏DLC内容

终极指南:如何完整解锁Steam游戏DLC内容 【免费下载链接】SmokeAPI Legit DLC Unlocker for Steamworks 项目地址: https://gitcode.com/gh_mirrors/smo/SmokeAPI SmokeAPI是一款开源工具,专为Steamworks游戏提供DLC所有权模拟功能。如果你拥有合…...

Nanbeige4.1-3B Chainlit企业就绪:GDPR数据擦除、会话加密、审计日志留存策略

Nanbeige4.1-3B Chainlit企业就绪:GDPR数据擦除、会话加密、审计日志留存策略 1. 引言:当开源大模型遇上企业合规 想象一下这个场景:你的团队刚刚部署了一个功能强大的开源大语言模型,比如Nanbeige4.1-3B,用它来辅助…...

别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅唇

从0构建WAV文件:读懂计算机文件的本质 虽然接触计算机有一段时间了,但是我的视野一直局限于一个较小的范围之内,往往只能看到于算法竞赛相关的内容,计算机各种文件在我看来十分复杂,认为构建他们并能达到目的是一件困难…...

5个实战技巧:快速掌握新一代AI组件开发

5个实战技巧:快速掌握新一代AI组件开发 【免费下载链接】Element-Plus-X Enterprise-level AI component library front-end solution 🤖 项目地址: https://gitcode.com/gh_mirrors/el/Element-Plus-X Element-Plus-X是企业级AI组件库前端解决方…...

nanobot参数详解:Qwen3-4B-Instruct vLLM部署中的max_model_len、tensor_parallel_size设置

nanobot参数详解:Qwen3-4B-Instruct vLLM部署中的max_model_len、tensor_parallel_size设置 1. 引言:从轻量级助手到高效部署 如果你正在尝试部署一个轻量级的AI助手,比如最近很火的nanobot,并且选择了Qwen3-4B-Instruct这样的模…...

C语言指针精讲:从内存寻址到实战避坑指南

1. 指针的本质:内存地址的身份证 第一次接触指针时,我盯着代码里的星号和小箭头符号发呆了半小时。直到把内存想象成快递柜,才突然开窍——每个快递柜都有唯一编号,指针就是那个编号。当你声明int* p时,相当于申请了一…...

万象视界灵坛效果展示:浅蓝格点底纹上CLIP文本嵌入的t-SNE降维散点图

万象视界灵坛效果展示:浅蓝格点底纹上CLIP文本嵌入的t-SNE降维散点图 1. 平台概览 万象视界灵坛(Omni-Vision Sanctuary)是一款基于OpenAI CLIP技术的高级多模态智能感知平台。它将复杂的语义对齐过程转化为直观的视觉体验,采用…...

解锁Obsidian笔记无限可能:Pandoc插件全方位转换指南

解锁Obsidian笔记无限可能:Pandoc插件全方位转换指南 【免费下载链接】obsidian-pandoc Pandoc document export plugin for Obsidian (https://obsidian.md) 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-pandoc 你是否曾为笔记格式转换而烦恼&am…...

smcFanControl终极指南:让你的Intel Mac告别过热降频,性能全开

smcFanControl终极指南:让你的Intel Mac告别过热降频,性能全开 【免费下载链接】smcFanControl Control the fans of every Intel Mac to make it run cooler 项目地址: https://gitcode.com/gh_mirrors/smc/smcFanControl 你是否曾经在视频编辑或…...

PHP 8.9 JIT在高并发API网关中的真实表现(对比PHP 8.2/8.3:QPS+312%,内存下降38%)

第一章:PHP 8.9 JIT正式落地:高并发API网关性能跃迁的里程碑PHP 8.9 并非官方版本号——这是虚构设定,但本章基于真实技术演进逻辑构建:以 PHP 8.0 引入的 Tracing JIT 为基石,结合社区对极致 API 网关性能的持续优化诉…...

Leather Dress Collection开源镜像:236MB轻量级LoRA集合支持消费级GPU本地部署

Leather Dress Collection开源镜像:236MB轻量级LoRA集合支持消费级GPU本地部署 1. 项目介绍 Leather Dress Collection是一个专为时尚设计领域打造的轻量级AI工具包,基于Stable Diffusion 1.5框架开发。这个开源项目包含了12个精心调校的LoRA模型&…...

Win11Debloat:系统焕新提速神器的全方位优化方案

Win11Debloat:系统焕新提速神器的全方位优化方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and customi…...

如何永久保存微信聊天记录:WeChatMsg完整解决方案指南

如何永久保存微信聊天记录:WeChatMsg完整解决方案指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...

Flux Sea Studio 高可用部署架构:负载均衡与故障转移设计

Flux Sea Studio 高可用部署架构:负载均衡与故障转移设计 最近在帮几个团队部署AI绘画服务时,发现一个挺普遍的问题:单个模型实例一旦遇到高并发或者服务器出点小毛病,服务就很容易挂掉,用户体验直线下降。特别是像Fl…...

无需模拟器:APK Installer让Windows直接运行安卓应用的全攻略

无需模拟器:APK Installer让Windows直接运行安卓应用的全攻略 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾遇到过这样的困境:手机上…...

3步实现小说自由:用这款工具轻松下载并永久保存番茄小说

3步实现小说自由:用这款工具轻松下载并永久保存番茄小说 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 还在为喜欢的小说无法离线阅读而烦恼?想把精彩故事保存到本…...

你的SSH密钥可能已经过期了阅

引言 在现代软件开发中,性能始终是衡量应用质量的重要指标之一。无论是企业级应用、云服务还是桌面程序,性能优化都能显著提升用户体验、降低基础设施成本并增强系统的可扩展性。对于使用 C# 开发的应用程序而言,性能优化涉及多个层面&#x…...

sgayadgsdvwdc

一、OpenAI 1.OpenAI是什么简单来说,OpenAI 大模型 是由美国人工智能公司 OpenAI 开发的一系列大型语言模型(LLMs) 。你可以把它们想象成拥有巨大“知识储备”和“学习能力”的超级大脑,它们被训练用来理解和生成人类语言&#xf…...