基于 BGE 模型与 Flask 的智能问答系统开发实践
基于 BGE 模型与 Flask 的智能问答系统开发实践
一、前言
在人工智能快速发展的今天,智能问答系统成为了提升信息检索效率和用户体验的重要工具。本文将详细介绍如何利用 BGE(Base General Embedding)模型、Faiss 向量检索库以及 Flask 框架,搭建一个具备文本检索和问答功能的 Web 服务。通过分步解析代码实现与部署流程,帮助读者理解智能问答系统的核心技术逻辑。
二、技术栈选择
1. 核心模型:BGE
- BGE-base-zh-v1.5:中文通用语义向量模型,支持文本语义编码,可将问题转换为高维向量,用于语义相似度计算。
- BGE-reranker-base:重排模型,对粗排结果进行精细化排序,提升检索准确性。
2. 向量检索:Faiss
Facebook 开源的高效向量检索库,支持 L2 距离度量和快速近似最近邻搜索,适合大规模向量数据的实时检索。
3. 服务框架:Flask
轻量级 Python Web 框架,便于快速搭建 API 接口和前端页面,适合原型开发与小型服务部署。
三、系统开发步骤
1. 环境搭建与依赖安装
bash
# 安装依赖库
pip install pandas faiss-cpu flask FlagEmbedding
2. 数据准备与预处理
-
数据格式:创建
qa.csv
文件,包含question
(问题)和answer
(答案)两列,示例数据如下:question answer 北京景点推荐 故宫、颐和园、八达岭长城... 年轻人聚集的步行街 三里屯、南锣鼓巷、王府井... ... ... -
数据加载:读取部分数据构建语料库和答案列表(示例取前 10 条):
python
运行
import pandas as pd df = pd.read_csv('data/qa.csv') corpus = list(df['question'][:10]) # 问题语料库 answers = list(df['answer'][:10]) # 答案列表
3. 语义向量编码与索引构建
(1)加载 BGE 模型并编码语料库
python
运行
from FlagEmbedding import FlagModel
model = FlagModel('bge-base-zh-v1.5') # 初始化基础模型
corpus_embeddings = model.encode_corpus(corpus) # 编码问题向量(不添加查询指令)
(2)使用 Faiss 创建向量索引
python
运行
import faiss
dim = corpus_embeddings.shape[-1] # 获取向量维度
index = faiss.IndexFlatL2(dim) # 使用L2距离度量
index.add(corpus_embeddings) # 将向量存入索引
4. 文本检索逻辑实现
(1)粗排:Faiss 快速检索相似问题
python
运行
def rerank_search(query, index, corpus, model):# 编码查询问题(添加查询指令优化向量表示)query_embeddings = model.encode_queries([query])# 粗排:检索前5个相似问题(scores为距离,indexes为索引)scores, indexes = index.search(query_embeddings, k=5)candidate_ids = indexes[0] # 提取候选问题索引candidate_texts = [corpus[i] for i in candidate_ids] # 获取候选问题文本
(2)精排:BGE-reranker 重排候选结果
python
运行
from FlagEmbedding import FlagReranker
reranker = FlagReranker('bge-reranker-base') # 初始化重排模型
# 计算查询与候选问题的相关性分数
rerank_scores = reranker.compute_score([(query, text) for text in candidate_texts])
# 按分数降序排序,获取最优答案索引
best_id = candidate_ids[rerank_scores.argmax()]
return answers[best_id]
5. Flask 服务封装与接口开发
(1)初始化 Flask 应用并加载模型
python
运行
from flask import Flask, request, render_template
app = Flask(__name__)# 全局加载数据和模型(避免重复初始化)
corpus, answers, model, index = load_data_and_model() # 自定义加载函数
(2)定义 API 接口与前端页面
-
POST 接口:处理查询请求并返回 JSON 结果
python
运行
@app.route('/api/search', methods=['POST']) def api_search():query = request.form.get('query')if not query:return jsonify({"error": "查询内容为空"})answer = rerank_search(query, index, corpus, model)return jsonify({"query": query, "answer": answer})
-
前端页面:提供用户输入框和结果展示(
templates/index.html
)html
预览
<!DOCTYPE html> <html> <head><title>智能问答系统</title> </head> <body><h1>智能问答系统</h1><form method="post" action="/search"><input type="text" name="query" placeholder="请输入问题..." required><button type="submit">搜索答案</button></form>{% if answer %}<h3>查询结果:</h3><p>{{ answer }}</p>{% endif %} </body> </html>
(3)路由绑定与服务启动
python
运行
@app.route('/search', methods=['GET', 'POST'])
def search():if request.method == 'POST':query = request.form['query']answer = rerank_search(query, index, corpus, model)return render_template('index.html', answer=answer)return render_template('index.html')if __name__ == '__main__':app.run(host='0.0.0.0', port=5000, debug=True)
四、系统部署与测试
1. 目录结构
plaintext
project-root/
├── data/
│ └── qa.csv # 问答数据集
├── templates/
│ └── index.html # 前端页面
├── qa.py # 主程序文件
└── requirements.txt # 依赖清单
2. 启动服务
bash
python qa.py
# 访问 http://localhost:5000 测试系统
3. 测试示例
- 输入查询:“北京适合年轻人的夜生活地点”
- 预期输出:“三里屯酒吧街、什刹海酒吧街、星吧路酒吧街...”
五、优化方向与扩展建议
- 数据规模扩展:增加语料库数据量,提升检索覆盖范围。
- 模型优化:尝试 BGE-large 版本或微调模型适应特定领域。
- 性能优化:
- 使用 Faiss 的 IVF 索引(如
IndexIVFFlat
)加速大规模数据检索; - 部署模型到 GPU 环境,提升编码速度。
- 使用 Faiss 的 IVF 索引(如
- 功能扩展:
- 添加多轮对话支持;
- 集成图片、文档等多模态输入;
- 开发管理后台用于数据维护。
六、总结
本文通过实战案例展示了从语义编码、向量检索到 Web 服务部署的完整流程。基于 BGE 和 Faiss 的问答系统能够有效处理中文语义检索任务,而 Flask 框架则提供了便捷的服务化能力。该方案可应用于企业客服、知识库检索、智能助手等场景,为实际业务提供智能化支持。未来可结合更多 NLP 技术(如文本生成、意图识别)进一步提升系统的交互能力和实用性。