在企业级AI应用开发中,如何将专业知识高效地整合到大模型中一直是个关键挑战。传统微调方法存在知识更新滞后、训练成本高等痛点,而基于向量知识库的方案正成为更灵活的替代选择。本文将手把手带你用ChatGLM3-6B+LangChain+Faiss搭建一个可实时更新的企业知识问答系统。
这个方案的核心优势在于:当技术文档、产品手册等企业知识发生变更时,只需更新向量数据库内容即可立即生效,无需重新训练大模型。实测表明,这种架构在保证回答准确性的同时,能将知识更新周期从原来的数周缩短到分钟级。
系统采用经典的RAG(Retrieval-Augmented Generation)架构,具体流程分为两个阶段:
知识入库阶段:
问答服务阶段:
关键设计点:文本分块大小建议控制在300-500字,过小会导致语义不完整,过大则影响检索精准度。我们采用递归式分块策略,优先按段落分割,不足最小尺寸时合并相邻段落。
选择ChatGLM3-6B作为基座模型,主要考虑:
采用bge-large-zh-v1.5模型,其在MTEB中文榜单排名前列,具有:
Faiss的优势在于:
推荐使用Python3.8+和CUDA 11.7环境,以下是关键依赖:
bash复制# 创建conda环境
conda create -n knowledge_base python=3.8
conda activate knowledge_base
# 安装基础依赖
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
# GPU版Faiss(根据CUDA版本选择)
pip install faiss-gpu==1.7.2 cudatoolkit=11.7
常见问题排查:
protobuf==3.20.0faiss-cpu暂代建议使用modelscope加速下载:
bash复制git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
cd chatglm3-6b
git lfs pull
同样使用modelscope源:
bash复制git clone https://www.modelscope.cn/AI-ModelScope/bge-large-zh-v1.5.git
cd bge-large-zh-v1.5
git lfs pull
模型目录结构应保持完整:
code复制chatglm3-6b/
├── config.json
├── modeling_chatglm.py
└── pytorch_model-00001-of-00007.bin ...
关键配置文件model_config.py需要修改以下参数:
python复制# 模型路径配置
MODEL_ROOT_PATH = "/path/to/models"
# LLM配置
llm_model_dict = {
"chatglm3-6b": {
"model_name": "chatglm3-6b",
"model_path": f"{MODEL_ROOT_PATH}/chatglm3-6b",
"device": "cuda" # 使用GPU加速
}
}
# Embedding配置
embed_model_dict = {
"bge-large-zh": {
"model_name": "bge-large-zh-v1.5",
"model_path": f"{MODEL_ROOT_PATH}/bge-large-zh-v1.5"
}
}
重要提示:Windows用户需将路径中的反斜杠
\改为正斜杠/,否则会导致加载失败
准备企业知识文档(支持pdf/docx/txt等格式),存放于knowledge_base目录:
code复制knowledge_base/
├── 产品手册/
│ ├── 用户指南.pdf
│ └── 技术白皮书.docx
└── 常见问题/
└── QA汇总.txt
执行初始化命令:
bash复制python init_database.py --recreate-vs
成功标志是看到类似输出:
code复制[INFO] 成功加载文档:产品手册/用户指南.pdf
[INFO] 向量库构建进度:100%|██████████| 15/15 [00:02<00:00]
bash复制python startup.py -a
成功启动后会出现以下接口:
知识库管理:
对话测试:
示例Python请求代码:
python复制import requests
url = "http://127.0.0.1:7861/chat/knowledge_base_chat"
params = {
"query": "产品支持哪些支付方式?",
"knowledge_base_name": "产品手册",
"top_k": 3 # 返回最相关的3个片段
}
response = requests.post(url, json=params)
print(response.json())
返回数据结构:
json复制{
"answer": "我们的产品目前支持支付宝、微信支付和银联转账...",
"docs": [
{
"content": "支付系统说明...",
"score": 0.87
}
]
}
混合检索策略:
python复制# 在configs/kb_config.py中设置
VECTOR_SEARCH_TOP_K = 5 # 向量检索数量
TEXT_SEARCH_TOP_K = 2 # 关键词检索数量
SEARCH_SCORE_THRESHOLD = 0.3 # 相似度阈值
查询扩展:
提示词工程:
text复制你是一个专业的产品支持助手,请根据以下上下文回答问题:
{context}
问题:{question}
要求:
- 回答不超过100字
- 包含具体参数时需精确到小数点后两位
- 不确定的内容明确标注"可能"
结果后处理:
Faiss索引选择:
python复制# 在server_config.py中配置
FAISS_INDEX = "IVF4096,PQ32" # 百万级数据推荐
缓存策略:
安全措施:
监控指标:
python复制# 需要监控的关键指标
METRICS = [
"retrieval_latency",
"answer_accuracy",
"cache_hit_rate",
"gpu_utilization"
]
持续更新方案:
实际部署中我们发现,当知识库超过10万片段时,采用分库分表策略可以提高查询效率。例如按产品线划分不同子库,根据用户问题自动路由到对应知识库查询。