1. 项目背景与挑战
去年三季度,我们团队接到了一个紧急需求:为内部知识库搭建一个智能问答系统。最初尝试直接用大模型生成答案,结果惨不忍睹——40%的回答存在事实性错误,30%的回答明显过时,剩下的30%虽然正确但缺乏具体业务上下文。产品经理直接甩给我一句:"你这方案根本不能用!"
经过两周的密集调研,我们最终确定采用RAG(Retrieval-Augmented Generation)架构。这个方案的核心在于:
- 利用MySQL 8.0的向量检索能力构建知识索引
- 通过语义检索获取相关文档片段
- 将检索结果作为上下文喂给大模型生成最终答案
2. 技术架构设计
2.1 整体方案选型
我们放弃了直接使用Pinecone等专用向量数据库的方案,主要基于以下考虑:
- 已有MySQL集群资源利用率不足50%
- 需要保证知识库与业务数据的强一致性
- 团队对MySQL运维有丰富经验
最终架构包含三个核心组件:
graph TD A[文档预处理] --> B[MySQL向量存储] B --> C[检索服务] C --> D[大模型生成]2.2 MySQL向量化改造
关键步骤:
- 升级到MySQL 8.0.32(最低支持版本)
- 创建带向量字段的表结构:
CREATE TABLE knowledge_chunks ( id VARCHAR(36) PRIMARY KEY, content TEXT, embedding VECTOR(1536) COMMENT '使用text-embedding-3-large模型', metadata JSON, INDEX idx_embedding (embedding) USING IVFFLAT ) ENGINE=InnoDB;重要提示:IVFFLAT索引需要设置合适的nlist参数,我们经过测试确定200是最佳值
3. 核心实现细节
3.1 文档预处理流水线
开发了一个自动化处理工具链:
- PDF/Word解析:使用Apache Tika
- 文本分块:采用滑动窗口算法
- 块大小:512 tokens
- 重叠:64 tokens
- 向量化:调用OpenAI的embedding接口
处理脚本关键部分:
def process_document(file_path): text = extract_text(file_path) chunks = split_text(text) embeddings = get_embeddings(chunks) store_to_mysql(chunks, embeddings)3.2 混合检索策略
单纯向量检索准确率只有68%,我们创新性地加入了关键词权重:
def hybrid_search(query): vector = get_embedding(query) keywords = extract_keywords(query) # 向量相似度占70%,关键词匹配占30% sql = """ SELECT id, content, 0.7 * (1 - VECTOR_DISTANCE(embedding, %s)) + 0.3 * MATCH(content) AGAINST (%s IN NATURAL LANGUAGE MODE) AS score FROM knowledge_chunks ORDER BY score DESC LIMIT 5 """ return execute_sql(sql, [vector, ' '.join(keywords)])4. 性能优化实战
4.1 索引优化
发现初期查询延迟高达1200ms,通过以下措施降到200ms内:
- 调整IVFFLAT参数:nlist从100增加到200
- 添加内存缓存:对热点查询缓存5分钟
- 查询优化:使用预编译语句
4.2 大模型提示工程
经过数十次迭代,最终确定的prompt模板:
你是一个专业的知识库助手,请根据以下上下文回答问题: {context} 问题:{question} 要求: 1. 如果上下文不相关,请回答"该信息不在知识库中" 2. 保持回答专业简洁 3. 引用上下文时要注明出处5. 踩坑记录与解决方案
5.1 中文分词的坑
直接使用MySQL全文检索效果很差,解决方案:
- 添加中文分词插件
- 自定义停用词表
- 对content字段建立ngram索引
5.2 向量维度灾难
最初使用1024维向量导致性能问题:
- 存储空间暴增3倍
- 查询延迟增加50% 最终改用768维向量+量化压缩
6. 成果与指标
上线三个月后的关键数据:
| 指标 | 初始值 | 优化后 |
|---|---|---|
| 回答准确率 | 62% | 89% |
| 平均响应时间 | 1.2s | 380ms |
| 用户满意度 | 3.2/5 | 4.7/5 |
这个项目最终获得了季度技术创新奖,关键经验是:不要盲目追求新技术栈,用好现有基础设施同样能打造优秀的大模型应用。