基于 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 技术(如文本生成、意图识别)进一步提升系统的交互能力和实用性。
相关文章:
基于 BGE 模型与 Flask 的智能问答系统开发实践
基于 BGE 模型与 Flask 的智能问答系统开发实践 一、前言 在人工智能快速发展的今天,智能问答系统成为了提升信息检索效率和用户体验的重要工具。本文将详细介绍如何利用 BGE(Base General Embedding)模型、Faiss 向量检索库以及 Flask 框架…...

机器学习:决策树和剪枝
本文目录: 一、决策树基本知识(一)概念(二)决策树建立过程 二、决策树生成(一)ID3决策树:基于信息增益构建的决策树。(二)C4.5决策树(三ÿ…...

vscode自定义主题语法及流程
vscode c/c 主题 DIY 启用自己的主题(最后步骤) 重启生效 手把手教你制作 在C:\Users\jlh.vscode\extensions下自己创建一个文件夹 里面有两个文件一个文件夹 package.json: {"name":"theme-jlh","displayName":"%displayName%&qu…...

vue中加载Cesium地图(天地图、高德地图)
目录 1、将下载的Cesium包移动至public下 2、首先需要将Cesium.js和widgets.css文件引入到 3、 新建Cesium.js文件,方便在全局使用 4、新建cesium.vue文件,展示三维地图 1、将下载的Cesium包移动至public下 npm install cesium后 2、…...

SpringBoot整合RocketMQ与客户端注意事项
SpringBoot整合RocketMQ 引入依赖(5.3.0比较稳定) <dependencies><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.3.1</version&…...
Github 2025-06-04 C开源项目日报 Top7
根据Github Trendings的统计,今日(2025-06-04统计)共有7个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目7C++项目1Assembly项目1jq:轻量灵活的命令行JSON处理器 创建周期:4207 天开发语言:C协议类型:OtherStar数量:27698 个Fork数量:1538 …...
大二下期末
一.Numpy(Numerical Python) Numpy库是Python用于科学计算的基础包,也是大量Python数学和科学计算包的基础。不少数据处理和分析包都是在Numpy的基础上开发的,如后面介绍的Pandas包。 Numpy的核心基础是ndarray(N-di…...
LeetCode 热题 100 74. 搜索二维矩阵
LeetCode 热题 100 | 74. 搜索二维矩阵 大家好,今天我们来解决一道经典的算法题——搜索二维矩阵。这道题在 LeetCode 上被标记为中等难度,要求我们在一个满足特定条件的二维矩阵中查找一个目标值。如果目标值在矩阵中,返回 true;…...
解决 VSCode 中无法识别 Node.js 的问题
当 VSCode 无法识别 Node.js 时,通常会出现以下症状: 代码提示缺失require 等 Node.js API 被标记为错误调试功能无法正常工作终端无法运行 Node.js 命令 常见原因及解决方案 1. Node.js 未安装或未正确配置 解决方法: 确保已安…...

Mysql的卸载与安装
确保卸载干净mysql 不然在进行mysal安装时候会出现不一的页面和问题 1、卸载 在应用页面将查询到的mysql相关应用卸载 2、到c盘下将残留的软件包进行数据删除 3、删除programData下的mysql数据 4、检查系统中的mysql是否存在 cmd中执行 sc deleted mysql80 5、删除注册表中的…...
ES101系列09 | 运维、监控与性能优化
本篇文章主要讲解 ElasticSearch 中 DevOps 与性能优化的内容,包括集群部署最佳实践、容量规划、读写性能优化和缓存、熔断器等。 集群部署最佳实践 在生产环境中建议设置单一角色的节点。 Dedicated master eligible nodes:负责集群状态的管理。使用…...
Java常用的判空方法
文章目录 Java常用的判空方法JDK 自带的判空方法1. 使用 或 ! 运算符2. 使用 equals 方法3. Objects.isNull / Objects.nonNull4. Objects.equals4. JDK8 中的 Optional 第三方工具包1. Apache Commons Lang32. Google Guava3. Lombok 注解4. Vavr(函数式风格&…...

Excel处理控件Aspose.Cells教程:使用 C# 在 Excel 中创建组合图表
可视化项目时间线对于有效规划和跟踪至关重要。在本篇教程中,您将学习如何使用 C# 在 Excel 中创建组合图。只需几行代码,即可自动生成动态、美观的组合图。无论您是在构建项目管理工具还是处理内部报告,本指南都将向您展示如何将任务数据转换…...

【多线程初阶】阻塞队列 生产者消费者模型
文章目录 一、阻塞队列二、生产者消费者模型(一)概念(二)生产者消费者的两个重要优势(阻塞队列的运用)1) 解耦合(不一定是两个线程之间,也可以是两个服务器之间)2) 削峰填谷 (三)生产者消费者模型付出的代价 三、标准库中的阻塞队列(一)观察模型的运行效果(二)观察阻塞效果1) 队…...

《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》
目录 一、踏上Python之旅二、Python输入与输出三、变量与基本数据类型四、运算符五、流程控制 一、踏上Python之旅 1.想要输出 I Love Python,应该使用()函数。 A.printf() B.print() C.println() D.Print() 在Python中想要在屏幕中输出内容,应该使用print()函数…...

机器人夹爪的选型与ROS通讯——机器人抓取系统基础系列(六)
文章目录 前言一、夹爪的选型1.1 任务需求分析1.2 软体夹爪的选型 二、夹爪的ROS通讯2.1 夹爪的通信方式介绍2.2 串口助手测试2.3 ROS通讯节点实现 总结Reference: 前言 本文将介绍夹爪的选型方法和通讯方式。以鞋子这类操作对象为例,将详细阐述了对应的夹爪选型过…...

第二十八章 RTC——实时时钟
第二十八章 RTC——实时时钟 目录 第二十八章 RTC——实时时钟 1 RTC实时时钟简介 2 RTC外设框图剖析 3 UNIX时间戳 4 与RTC控制相关的库函数 4.1 等待时钟同步和操作完成 4.2 使能备份域涉及RTC配置 4.3 设置RTC时钟分频 4.4 设置、获取RTC计数器及闹钟 5 实时时…...

使用 DuckLake 和 DuckDB 构建 S3 数据湖实战指南
本文介绍了由 DuckDB 和 DuckLake 组成的轻量级数据湖方案,旨在解决传统数据湖(如HadoopHive)元数据管理复杂、查询性能低及厂商锁定等问题。该方案为中小规模数据湖场景提供了简单、高性能且无厂商锁定的替代选择。 1. 什么是 DuckLake 和 D…...

大语言模型提示词(LLM Prompt)工程系统性学习指南:从理论基础到实战应用的完整体系
文章目录 前言:为什么提示词工程成为AI时代的核心技能一、提示词的本质探源:认知科学与逻辑学的理论基础1.1 认知科学视角下的提示词本质信息处理理论的深层机制图式理论的实际应用认知负荷理论的优化策略 1.2 逻辑学框架下的提示词架构形式逻辑的三段论…...

如何基于Mihomo Party http端口配置git与bash命令行代理
如何基于Mihomo Party http端口配置git与bash命令行代理 1. 确定Mihomo Party http端口配置 点击内核设置后即可查看 默认7892端口,开启允许局域网连接 2. 配置git代理 配置本机代理可以使用 127.0.0.1 配置局域网内其它机代理需要使用本机的非回环地址 IP&am…...
CMake 为 Debug 版本的库或可执行文件添加 d 后缀
在使用 CMake 构建项目时,我们经常需要区分 Debug 和 Release 构建版本。一个常见的做法是为 Debug 版本的库或可执行文件添加后缀(如 d),例如 libmylibd.so 或 myappd.exe。 本文将介绍几种在 CMake 中实现为 Debug 版本自动添加 d 后缀的方法。 方法一:使用 CMAKE_DEBU…...
Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit
Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit 在Linux权限系统中,除了基本的读、写(w)、执行(x)权限外,还有三个特殊权限位:SetUID、SetGID和Sticky Bit。这些权限位提供了更精细的权限控制机制,尤其在需要临时提升权限或管理共享资源时非常有用。 一、SetUID (s位…...

埃文科技智能数据引擎产品入选《中国网络安全细分领域产品名录》
嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,埃文科技智能数据引擎产品成功入选数据分级分类产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解这一蓬勃发展的产业格局,嘶吼安全产业…...
使用VTK还是OpenGL集成到qt程序里哪个好?
在Qt程序中集成VTK与OpenGL:选择哪个更好? 在Qt程序中实现三维可视化时,开发者常常面临一个选择:是使用VTK(Visualization Toolkit)还是OpenGL(Open Graphics Library)。这两种技术…...
Java-IO流之打印流详解
Java-IO流之打印流详解 一、打印流概述1.1 什么是打印流1.2 打印流的特点1.3 打印流的应用场景 二、PrintStream详解2.1 基本概念2.2 构造函数2.3 核心方法2.4 使用示例 三、PrintWriter详解3.1 基本概念3.2 构造函数3.3 核心方法3.4 使用示例 四、PrintStream与PrintWriter的比…...
高效图像处理:使用 Pillow 进行格式转换与优化
高效图像处理:使用 Pillow 进行格式转换与优化 1. 背景引入 在图像处理应用中,格式转换、裁剪、压缩等操作是常见需求。Python 的 Pillow 库基于 PIL(Python Imaging Library),提供 轻量、强大 的图像处理能力,广泛用于 Web 开发、数据分析、机器学习 等领域。 本文将…...
Github 2025-06-06 Java开源项目日报Top10
根据Github Trendings的统计,今日(2025-06-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10TypeScript项目1Java实现的算法集合:使用Gitpod.io进行编辑和贡献 创建周期:2883 天开发语言:Java协议类型:MIT LicenseStar数量…...
使用 Ansible 在 Windows 服务器上安装 SSL 证书
在本教程中,我将向您展示如何使用 Ansible 在 Windows 服务器上安装 SSL 证书。使用 Ansible 自动化 SSL 证书安装过程可以提高 IT 运营的效率、一致性和协作性。我将介绍以下步骤: 将 SSL 证书文件复制到服务器将 PFX 证书导入指定的存储区获取导入的证…...
厂区能源监控系统:网关赋能下的高效能源管理与环保监测
在现代工业生产领域,能源的有效利用与环境保护是企业实现可持续发展的两大关键要素。厂区能源监控系统借助先进的信息技术与自动化控制手段,对厂区内能源消耗及污水处理等核心环节展开实时监控与精细化管理。其中,御控网关作为系统关键枢纽&a…...
CentOS 7 如何安装llvm-project-10.0.0?
CentOS 7 如何安装llvm-project-10.0.0? 需要先升级gcc至7.5版本,详见CentOS 7如何编译安装升级gcc版本?一文 # 备份之前的yum .repo文件至 /tmp/repo_bak 目录 mkdir -p /tmp/repo_bak && cd /etc/yum.repo.d && /bin/mv ./*.repo …...