乐于分享
好东西不私藏

客服Agent实战系列 04-知识库插件

客服Agent实战系列 04-知识库插件
上一篇:客服Agent实战系列 03-意图识别插件

上一篇我们实现了意图识别,Bot知道用户想做什么了。这一篇来解决更核心的问题:用户问"如何修改密码",Bot怎么从FAQ知识库中找到答案?这就是RAG(检索增强生成)——客服Bot的"大脑"。

1什么是RAG?为什么重要?

RAG(Retrieval-Augmented Generation,检索增强生成)是2026年最主流的AI知识问答方案。它的核心思想:先检索,再生成

传统方案
RAG方案
优势
让大模型"记住"所有知识
从知识库检索相关内容,再让大模型生成答案
知识可更新、成本低、准确率高

图:RAG检索流程

RAG的工作流程:

三个步骤:

1. 检索:从知识库中找到与用户问题相关的文档

2. 增强:将检索到的文档作为上下文,提供给大模型

3. 生成:大模型基于上下文生成答案

2FAQ知识库的结构

客服场景的FAQ知识库相对简单,我们用JSON格式存储:

json[
  {
"id""faq_001",
"question""如何修改密码?",
"answer""您可以通过以下步骤修改密码:\n1. 登录账户\n2. 进入「账户设置」\n3. 点击「修改密码」\n4. 输入原密码和新密码\n5. 点击确认保存",
"category""账户相关",
"keywords": ["密码""修改密码""改密码""忘记密码"]
  },
  {
"id""faq_002",
"question""如何申请退款?",
"answer""退款申请流程:\n1. 进入「我的订单」\n2. 找到需要退款的订单\n3. 点击「申请退款」\n4. 填写退款原因\n5. 等待审核(1-3个工作日)",
"category""订单相关",
"keywords": ["退款""退货""申请退款"]
  }
]

FAQ知识库的关键字段:

字段
作用
question
FAQ的标准问题
answer
FAQ的标准答案
keywords
关键词,用于快速检索
category
分类,用于组织管理

3知识库插件的实现方式

2026年,知识库检索有两种主流方式:

方式
优点
缺点
适用场景
关键词检索
速度快、实现简单
准确率低、需要维护关键词库
FAQ数量少(<100)
向量检索
准确率高、语义理解
需要向量数据库、成本稍高
FAQ数量多(>100)

图:知识库检索流程

客服场景我们选择关键词检索 + 向量检索的混合方案:

混合方案的优势:

1. 常见问题(关键词匹配)用关键词检索,速度快

2. 复杂问题(语义理解)用向量检索,准确率高

3. 检索结果融合,取最佳匹配

4实战:实现知识库插件

我们创建知识库插件:

plugins/knowledge_base/plugin.py:

pythonimport json
from pathlib import Path
from typing import List, Dict

classKnowledgeBasePlugin:
"""知识库插件"""

def__init__(self, faq_file: str = "data/faq.json"):
self.faqs = self._load_faqs(faq_file)
self.keyword_index = self._build_keyword_index()

def_load_faqs(self, faq_file: str) -> List[Dict]:
"""加载FAQ知识库"""
        path = Path(faq_file)
if path.exists():
with open(path, 'r', encoding='utf-8'as f:
return json.load(f)
return []

def_build_keyword_index(self) -> Dict[str, List[str]]:
"""构建关键词索引"""
        index = {}
for faq inself.faqs:
for keyword in faq.get("keywords", []):
if keyword notin index:
                    index[keyword] = []
                index[keyword].append(faq["id"])
return index

defsearch(self, query: str, top_k: int = 3) -> List[Dict]:
"""检索FAQ"""
# 第一步:关键词检索
        keyword_results = self._keyword_search(query)

# 第二步:向量检索(如果有向量数据库)
        vector_results = self._vector_search(query)

# 第三步:融合结果
        all_results = keyword_results + vector_results

# 去重并返回top_k
        unique_results = self._deduplicate(all_results)

return unique_results[:top_k]

def_keyword_search(self, query: str) -> List[Dict]:
"""关键词检索"""
        results = []
        query_words = query.split()

for word in query_words:
if word inself.keyword_index:
                faq_ids = self.keyword_index[word]
for faq_id in faq_ids:
                    faq = self._get_faq_by_id(faq_id)
if faq:
                        results.append({
"faq": faq,
"score"1.0,
"source""keyword"
                        })

return results

def_vector_search(self, query: str) -> List[Dict]:
"""向量检索(简化版)"""
# 实际项目中会调用向量数据库API
# 这里简化为返回空列表
return []

def_get_faq_by_id(self, faq_id: str) -> Dict:
"""根据ID获取FAQ"""
for faq inself.faqs:
if faq["id"] == faq_id:
return faq
returnNone

def_deduplicate(self, results: List[Dict]) -> List[Dict]:
"""去重"""
        seen = set()
        unique = []
for result in results:
            faq_id = result["faq"]["id"]
if faq_id notin seen:
                seen.add(faq_id)
                unique.append(result)
return unique

5集成到Bot中

将知识库插件集成到客服Bot:

src/bot.py(更新版):

pythonfrom plugins.knowledge_base.plugin import KnowledgeBasePlugin

classCustomerServiceBot:
def__init__(self, config_path: str = "config/customer_service.yaml"):
self.config = self._load_config(config_path)
self.system_prompt = self._load_prompt()
self.intent_plugin = IntentRecognitionPlugin()
self.kb_plugin = KnowledgeBasePlugin()

def_handle_faq(self, user_input: str) -> str:
# 从知识库检索FAQ
        results = self.kb_plugin.search(user_input, top_k=1)

if results:
            faq = results[0]["faq"]
# 直接返回FAQ答案
return faq["answer"]

# 如果没找到,走大模型
return"抱歉,我暂时无法回答这个问题。建议您转人工客服获取帮助。"

6测试知识库效果

python# 测试知识库检索
from plugins.knowledge_base.plugin import KnowledgeBasePlugin

kb = KnowledgeBasePlugin()

# 测试关键词检索
print(kb.search("如何修改密码"))
# 输出:找到faq_001,返回修改密码的答案

print(kb.search("申请退款"))
# 输出:找到faq_002,返回退款流程

print(kb.search("配送多久"))
# 输出:找到faq_003,返回配送时间说明

# 测试完整Bot
from src.bot import CustomerServiceBot

bot = CustomerServiceBot()
print(bot.chat("如何修改密码"))
# 输出:您可以通过以下步骤修改密码...

7RAG的优化方向

三个优化方向:

1. 向量检索:使用向量数据库(如Pinecone、Weaviate)进行语义检索

2. 重排序:使用CrossEncoder对检索结果进行重排序,提高准确率

3. 答案生成:不只是返回FAQ原文,让大模型基于FAQ生成更自然的答案

优化方法
效果
成本
增加关键词库
提高关键词检索覆盖率
低(人工维护)
向量检索
提高语义理解能力
中(需要向量数据库)
答案生成
答案更自然、更个性化
中(调用大模型)

8总结:知识库是Bot的"大脑"

本篇要点:

1. RAG是主流方案:先检索,再生成,知识可更新

2. FAQ知识库结构简单:question、answer、keywords、category

3. 混合检索最优:关键词快速检索 + 向量语义检索

4. 插件化设计:知识库作为独立插件,方便扩展

5. 持续优化:增加FAQ数量、引入向量检索、优化答案生成

下一篇,我们来写对话管理——如何让Bot记住对话历史,处理多轮对话。


客服Agent实战系列
01 · 项目初始化02 · Bot定义:System Prompt设计
03 · 意图识别插件
04 · 知识库插件 ← 你在这里
05 · 对话管理
... 共14篇

前置系列:Agent开发系列 11:RAG检索