在将 AI 接入企业微信外部群进行客服或技术支持时,仅依赖通用大语言模型(LLM)常面临两大痛点:对企业内部私有业务知识缺乏认知 ,以及模型可能产生不确定性的"幻觉"。
为了使外部群的 AI 回复精准且可靠,基于 RAG(检索增强生成,Retrieval-Augmented Generation)架构建立私有知识库是最成熟的落地方案。
本文将拆解如何将 向量数据库(Vector DB)+ Embedding 检索 + LLM 与企业微信 API 深度整合,实现外部群的精准问答。
一、 RAG 知识库交互流程设计
RAG 架构的核心逻辑是:在调用大模型生成答案前,先用用户的提问到向量数据库中进行"相似度检索",把检索到的企业真实知识作为背景信息送给大模型。
text
┌─────────────────┐ 1. 提问 ┌─────────────────┐ 2. 向量化 ┌─────────────────┐
│ 外部群用户提问 │ ────────────────> │ API 二次开发网关 │ ────────────────> │ Embedding Model │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
│ 4. 组装 Context │ 3. 语义匹配
▼ ▼
┌─────────────────┐ 5. 生成回答 ┌─────────────────┐ 检索 Chunk ┌─────────────────┐
│ 外部群主动推送 │ <──────────────── │ LLM (大语言模型)│ <──────────────── │ 向量数据库 │
│ (API 回复) │ └─────────────────┘ │(Chroma/Milvus) │
└─────────────────┘ └─────────────────┘
- 向量化处理(Embedding):提取用户提问文本,转换为多维高维向量。
- 知识检索(Vector Search):到向量数据库中匹配语义最接近的前 K 个知识片段(Chunks)。
- Prompt 组装:将"参考资料 + 用户问题"合并构建成强约束的 Prompt。
- 模型生成与投递:大模型基于参考资料生成答案,通过 API 投递至外部群。
二、 核心 Python 代码实现
以下示例演示如何使用 ChromaDB(向量库)与 OpenAI Embedding 实现从检索到通过 API 回复外部群的完整过程:
python
import chromadb
import requests
from openai import OpenAI
# 1. 初始化客户端与数据库
llm_client = OpenAI(api_key="your_llm_api_key", base_url="https://api.your-llm-provider.com/v1")
chroma_client = chromadb.Client()
collection = chroma_client.get_or_create_collection(name="enterprise_faq")
# 准备接口配置
API_GATEWAY_URL = "https://api.your-domain.com/v1/group/send_message"
API_TOKEN = "your_secret_access_token"
def init_knowledge_base():
"""初始化装载企业知识库(实际生产中可定期从文档导入)"""
documents = [
"企业退换货政策:商品购买后 7 天内无理由退换,需保证原包装完好。",
"技术支持工作时间:工作日 09:00 - 18:00,非工作日仅处理紧急故障告警。",
"发票开具规则:支持开具增值税电子普通发票与专票,可在控制台提交申请,3个工作日内开具。"
]
ids = ["doc1", "doc2", "doc3"]
# 存入向量数据库
collection.add(
documents=documents,
ids=ids
)
def query_rag_knowledge(user_query: str) -> str:
"""根据用户提问检索最相关的知识片段"""
results = collection.query(
query_texts=[user_query],
n_results=2 # 获取最相似的 2 条记录
)
docs = results.get('documents', [[]])[0]
if not docs:
return ""
return "\n".join(docs)
def process_rag_and_reply(chat_id: str, sender_id: str, user_query: str):
"""RAG 处理逻辑主入口"""
# 1. 向量数据库检索背景知识
context_knowledge = query_rag_knowledge(user_query)
# 2. 构建严谨的 System Prompt,防幻觉
system_prompt = (
"你是一名严谨的企业客服助手。请严格根据给出的【参考资料】回答用户问题。"
"如果【参考资料】中没有涉及用户的问题,请明确告知用户:'该问题暂未包含在知识库中,稍后将为您转接人工客服'。"
"切勿随意编造内容。\n\n"
f"【参考资料】:\n{context_knowledge}"
)
# 3. 调用 LLM
try:
response = llm_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_query}
],
temperature=0.1 # 调低随机度,提高准确率
)
ai_reply = response.choices[0].message.content
except Exception as e:
ai_reply = "抱歉,知识库检索服务异常,请稍后再试。"
# 4. 调用 API 回复外部群
send_message_to_external_group(chat_id, sender_id, ai_reply)
def send_message_to_external_group(chat_id: str, sender_id: str, text: str):
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_TOKEN}"
}
payload = {
"chat_id": chat_id,
"msg_type": "text",
"text": {
"content": text,
"mentioned_list": [sender_id]
}
}
requests.post(API_GATEWAY_URL, json=payload, headers=headers, timeout=5)
if __name__ == "__main__":
init_knowledge_base()
# 模拟接收到外部群提问
process_rag_and_reply(
chat_id="external_chat_889911",
sender_id="user_123",
user_query="请问你们发票怎么开?"
)
若需查阅其他富文本或带格式消息的数据格式,可参阅 企业微信 API 技术文档 中的具体规范。
三、 生产环境优化策略
- 混合检索(Hybrid Search) :
单独使用向量检索时,对专有名词、产品型号(如X100-Pro)的匹配度可能不佳。建议采用 向量语义检索 + BM25 关键词检索 结合的混合检索方式,再进行 Re-rank 重新排序。 - 文档分块(Text Chunking)切分规范 :
知识库文档入库前需要合理切分,单个 Chunk 建议控制在 200 - 500 字,并保持语义完整,带有 10% 的重叠上下文(Overlap),以防关键语义跨段落断开。 - 智能拒答与人工接管 :
设置语义相似度阈值(Similarity Score)。若向量检索出的知识相似度低于设定标准(如 0.6),则直接跳过大模型调用,直接通过 API 触发群内通知提醒人工客服介入。