基于 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. 测试示例

  • 输入查询:“北京适合年轻人的夜生活地点”
  • 预期输出:“三里屯酒吧街、什刹海酒吧街、星吧路酒吧街...”

五、优化方向与扩展建议

  1. 数据规模扩展:增加语料库数据量,提升检索覆盖范围。
  2. 模型优化:尝试 BGE-large 版本或微调模型适应特定领域。
  3. 性能优化
    • 使用 Faiss 的 IVF 索引(如IndexIVFFlat)加速大规模数据检索;
    • 部署模型到 GPU 环境,提升编码速度。
  4. 功能扩展
    • 添加多轮对话支持;
    • 集成图片、文档等多模态输入;
    • 开发管理后台用于数据维护。

六、总结

本文通过实战案例展示了从语义编码、向量检索到 Web 服务部署的完整流程。基于 BGE 和 Faiss 的问答系统能够有效处理中文语义检索任务,而 Flask 框架则提供了便捷的服务化能力。该方案可应用于企业客服、知识库检索、智能助手等场景,为实际业务提供智能化支持。未来可结合更多 NLP 技术(如文本生成、意图识别)进一步提升系统的交互能力和实用性。

更多推荐