立做了一個AI客服:RAG從理論到落地)
基于 RAG檢索增強(qiáng)生成的智能家電客服助手支持自定義語氣風(fēng)格適配不同品牌調(diào)性讓 AI 學(xué)習(xí)產(chǎn)品知識為用戶提供專業(yè)、準(zhǔn)確的咨詢服務(wù)。項(xiàng)目能做什么先看效果 —— 在終端里直接和AI對話核心能力有五條智能問答回答用戶關(guān)于智能家電的各種問題精準(zhǔn)回復(fù)基于產(chǎn)品知識庫避免 AI 隨意編造風(fēng)格統(tǒng)一始終保持專業(yè)的客服語氣提升用戶體驗(yàn)數(shù)據(jù)安全所有知識庫存儲在本地不上傳云端定制能力通過替換知識庫數(shù)據(jù)可適配不同品牌、不同場景的溝通風(fēng)格為什么會做這個項(xiàng)目說來也巧本來就是突然想到之前看過的一個視頻里面展示的是模擬朋友語氣的AI聊天器好奇心驅(qū)動下就查了查怎么實(shí)現(xiàn)的。沒想到一查還就陷進(jìn)去了想著與其看一百篇理論文章不如自己動手寫一個就簡單搭建了一個模擬器還真成了再聯(lián)想到前幾天和某平臺客服交流的經(jīng)歷一下子恍然大悟于是這個項(xiàng)目就應(yīng)運(yùn)而生了。關(guān)于項(xiàng)目的具體介紹可前往 Github 基于 RAG 的智能家電客服助手 查看 README相關(guān)代碼也已經(jīng)**開源到 Github ** 里面詳細(xì)介紹了項(xiàng)目內(nèi)容本地部署方法等等。下面的內(nèi)容主要是關(guān)于本項(xiàng)目用到的技術(shù)踩坑經(jīng)歷以及后續(xù)計(jì)劃等等希望對大家有幫助各位大佬如果有任何建議或者指正都可以提出來任何反饋都感激不盡一. 項(xiàng)目技術(shù)技術(shù)選型組件技術(shù)為什么選它開發(fā)語言Python 3.9AI生態(tài)最成熟代碼簡潔向量數(shù)據(jù)庫ChromaDB輕量、本地存儲不需要單獨(dú)部署服務(wù)Embedding模型BAAI/bge-m3中文語義理解強(qiáng)性價比高大語言模型DeepSeek-V3中文能力突出響應(yīng)速度極快API服務(wù)硅基流動提供穩(wěn)定的模型 API 服務(wù)關(guān)于RAG vs 微調(diào)的選擇最開始我也想過要不要做微調(diào)Fine-tuning但仔細(xì)分析后發(fā)現(xiàn)對比項(xiàng)RAG微調(diào)知識更新改chat.txt即可需要重新訓(xùn)練模型硬件要求普通電腦足夠需要GPU至少10GB顯存成本API按量付費(fèi)幾塊錢能用很久訓(xùn)練成本高可控性完全控制知識來源知識被寫進(jìn)模型難以調(diào)試對于個人項(xiàng)目來說RAG是更務(wù)實(shí)的選擇。核心流程整個程序的核心流程可以拆成五步用戶輸入 ↓ ① 讀取知識庫chat.txt ↓ ② 向量化存儲ChromaDB ↓ ③ 檢索最相似的3條話術(shù) ↓ ④ 拼接System Prompt Context ↓ ⑤ 大模型生成回復(fù) ↓ 返回結(jié)果關(guān)鍵代碼解析知識入庫先把chat.txt里的客服話術(shù)讀進(jìn)來withopen(chat.txt,r,encodingutf-8-sig)asf:lines[line.strip()forlineinf.readlines()ifline.strip()]然后調(diào)用硅基流動的 Embedding API把每條話術(shù)轉(zhuǎn)成向量存入 ChromaDBdefget_embeddings_batch(texts):urlf{BASE_URL}/embeddingsheaders{Authorization:fBearer{API_KEY}}data{model:EMBEDDING_MODEL,input:texts}responserequests.post(url,jsondata,headersheaders)return[item[embedding]foriteminresponse.json()[data]]#批量向量化一次搞定比逐條快10-50倍embeddingsget_embeddings_batch(lines)# 存入向量數(shù)據(jù)庫collection.add(documentslines,embeddingsembeddings,ids[fid_{i}foriinrange(len(lines))])檢索 生成用戶提問時先檢索最相似的話術(shù)再讓大模型參考這些話術(shù)生成回復(fù)defchat(user_input):# 第一步把用戶問題轉(zhuǎn)成向量檢索最相似的3條vecget_embeddings_batch([user_input])[0]resultscollection.query(query_embeddings[vec],n_results3)context\n.join(results[documents][0])# 第二步構(gòu)造System Prompt把檢索結(jié)果作為參考system_promptf 你是一個專業(yè)的客服助手。參考以下話術(shù)回答用戶 ---話術(shù)參考---{context}---參考結(jié)束--- # 第三步調(diào)用大模型生成回復(fù)responseclient.chat.completions.create(modeldeepseek-ai/DeepSeek-V3,messages[{role:system,content:system_prompt},{role:user,content:user_input}])returnresponse.choices[0].message.content整個核心邏輯就這兩塊入庫和檢索生成加起來總共幾十行代碼二. 踩坑記錄1. Windows 編碼問題BOM 頭現(xiàn)象AI 回復(fù)出現(xiàn)亂碼原因Windows 記事本保存 UTF-8 文件時默認(rèn)添加 BOM 頭\ufeff解決方案# 使用 utf-8-sig 自動跳過 BOM 頭withopen(chat.txt,r,encodingutf-8-sig)asf:linesf.readlines()2. 角色邊界混淆現(xiàn)象AI 把“用戶”的話也當(dāng)成參考內(nèi)容原因chat.txt中混入了“用戶”前綴解決方案知識庫只保留“客服”開頭的標(biāo)準(zhǔn)話術(shù)System Prompt 中明確“你只需模仿客服角色”3. 日常寒暄無法處理現(xiàn)象說“再見”時 AI 回復(fù)“抱歉暫時無法回答”原因chat.txt中沒有告別語觸發(fā)“不知道就說不知道”規(guī)則解決方案在知識庫中補(bǔ)充日常用語或在 System Prompt 中設(shè)置例外規(guī)則4. 向量檢索不準(zhǔn)確現(xiàn)象用戶問的問題AI 檢索到的 context 完全不相關(guān)原因知識庫中的數(shù)據(jù)太短或太分散解決方案合并相關(guān)話術(shù)為更完整的段落增加n_results參數(shù)檢索更多條使用更好的 Embedding 模型三 .成本分析這也是我做項(xiàng)目時很關(guān)心的問題。硅基流動我的實(shí)際使用情況是模型用途價格參考BAAI/bge-m3向量化≈ 0.07元 / 1M tokensDeepSeek-V3對話生成輸入 ≈ 2元 / 1M tokens輸出 ≈ 8元 / 1M tokens單次對話約500 tokens輸入 100 tokens輸出≈ 0.001-0.003元也就是說1塊錢能對話300-1000次個人學(xué)習(xí)和測試成本很小。四 .后續(xù)計(jì)劃這部分的話是我的一些后續(xù)計(jì)劃如果條件允許我會慢慢迭代并上傳在這里也歡迎大家提建議您的建議對項(xiàng)目迭代意義非凡□Web 界面基于 FastAPI Vue 構(gòu)建可視化聊天界面□多知識庫支持切換不同產(chǎn)品線的知識庫□對話記憶支持多輪對話上下文關(guān)聯(lián)□數(shù)據(jù)導(dǎo)入支持 JSON、CSV、PDF 等多種數(shù)據(jù)格式□即時通訊接入支持接入微信、釘釘、飛書等平臺五. 寫在最后做完這個項(xiàng)目我最深的感受是技術(shù)沒有想象中的那么難但坑比想象中的多。RAG的原理看起來很簡單——檢索 生成。但真正做起來數(shù)據(jù)格式、編碼問題、角色邊界、模型語言切換……每一個細(xì)節(jié)都可能讓你排查半天。但正是這些坑讓我真正理解了RAG的工作機(jī)制也讓我學(xué)會了如何一步步調(diào)試、優(yōu)化。幾點(diǎn)心得數(shù)據(jù)決定上限——chat.txt的質(zhì)量決定了AI能回答得多好代碼只是把這個質(zhì)量發(fā)揮出來編碼問題最隱蔽—— 一個看不見的BOM頭能讓你排查一整天工具鏈的細(xì)節(jié)很重要先跑起來再說—— 別想太多從最小可用版本開始然后再逐步優(yōu)化項(xiàng)目已開源至Github 基于 RAG 的智能家電客服助手如果您也喜歡或者給您提供了一絲靈感歡迎 Star 支持也歡迎 Fork 項(xiàng)目進(jìn)行二次開發(fā)或提交 Issue 和 我 一起完善。如果您也在做類似的項(xiàng)目歡迎交流討論。