当前位置: 首页 > web >正文

基于 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(答案)两列,示例数据如下:

    questionanswer
    北京景点推荐故宫、颐和园、八达岭长城...
    年轻人聚集的步行街三里屯、南锣鼓巷、王府井...
    ......
  • 数据加载:读取部分数据构建语料库和答案列表(示例取前 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 技术(如文本生成、意图识别)进一步提升系统的交互能力和实用性。

http://www.xdnf.cn/news/12461.html

相关文章:

  • Unity 中的颜色空间
  • 通道注意力
  • 逻辑回归与Softmax
  • 动量及在机器人控制中的应用
  • 打破数据孤岛:如何通过集成让AI真正“读懂”企业
  • 创客匠人:如何通过创始人IP打造实现知识变现与IP变现的长效增长?
  • 如何用 HTML 展示计算机代码
  • 什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
  • Ubuntu 系统通过防火墙管控 Docker 容器
  • 思尔芯携手Andes晶心科技,加速先进RISC-V 芯片开发
  • 使用 Python 构建并调用 ComfyUI 图像生成 API:完整实战指南
  • Oracle自定义函数
  • 代理服务器-LVS的3种模式与调度算法
  • 7. 线性表的定义及特点
  • PyQt常用控件的使用:QFileDialog、QMessageBox、QTreeWidget、QRadioButton等
  • 护网行动面试试题(2)
  • go语言学习 第7章:数组
  • HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖
  • 【MySQL基础】数据库的备份与还原
  • 第三章支线一 ·原能之核:语法起源
  • Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
  • 【Python训练营打卡】day45 @浙大疏锦行
  • k8s下离线搭建elasticsearch
  • 力扣100-移动0
  • Jmeter如何进行多服务器远程测试?
  • Podman 和 Docker
  • 关于如何使用VScode编译下载keil工程的步骤演示
  • BugKu Web渗透之网站被hei(仅仅是ctf题目名称)
  • Three.js中AR实现详解并详细介绍基于图像标记模式AR生成的详细步骤
  • CSS中justify-content: space-between首尾贴边中间等距(两端元素紧贴左右边缘,中间元素等距均匀分布)