FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

文章目录

  • FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)
    • 一、整体思路
    • 二、存储结构
      • 2.1 MySQL 表结构
        • (1) knowledge_base_dataset
        • (2) knowledge_base_data
        • (3) knowledge_base_index
        • (4) ai_kb_relation
      • 2.2 Elasticsearch Mapping 结构
        • (1) ES索引
        • (2) 字段说明
    • 三、代码实现
      • 3.1 调用 Embedding 服务
      • 3.2 向量检索(ES KNN 查询)
      • 3.3 RRF 排序(融合向量检索和文本检索结果)
    • 四、总结

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

一、整体思路

  • 知识库查询能力:引入 Elasticsearch (ES) 提供向量存储和检索能力。
  • 三层逻辑结构
    • 数据集:使用模块 ID 关联应用。
    • 数据:存储具体的知识内容。
    • 索引:提供高效的查询能力。

二、存储结构

2.1 MySQL 表结构

(1) knowledge_base_dataset

存储数据集基本信息

字段名类型描述
idBIGINT主键
typeINT0:手动数据集
nameVARCHAR数据集名称
es_index_nameVARCHARES 索引名称
extract_qa_promptTEXT抽取 QA 问答对 Prompt
extract_summary_promptTEXT抽取摘要 Prompt
extract_param_promptTEXT抽取参数 Prompt
is_deletedTINYINT逻辑删除标志
(2) knowledge_base_data

存储具体知识数据项

字段名类型描述
idBIGINT主键
dataset_idBIGINT关联 dataset
main_contentTEXT主要内容
auxiliary_dataTEXT辅助数据
is_deletedTINYINT逻辑删除标志
(3) knowledge_base_index

存储索引项

字段名类型描述
idBIGINT主键
data_idBIGINT关联 data 表主键
index_typeINT0-默认,1-用户指定,3-提取问题,4-相关摘要
index_contentTEXT索引内容
(4) ai_kb_relation

存储数据集与应用关联

字段名类型描述
idBIGINT主键
module_idBIGINT关联的模块 ID
dataset_idBIGINT知识库数据集 ID

2.2 Elasticsearch Mapping 结构

(1) ES索引

存储知识数据的向量索引:ai_knowledge

{"mappings": {"properties": {"data_id": {"type": "long","index": true},"index_id": {"type": "long","index": true},"dataset_id": {"type": "long","index": true},"vector_index": {"type": "dense_vector","dims": 1024,"index": true,"similarity": "cosine"},"text_index": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"}}}
}
(2) 字段说明
字段名称类型说明
data_idlong关联 knowledge_base_data 主键 ID
index_idlong关联 knowledge_base_index 主键 ID
dataset_idlong关联 knowledge_base_dataset 主键 ID
vector_indexdense_vector1024 维度稠密向量,支持余弦相似度计算
text_indextext采用 ik_max_word 分词器进行索引

三、代码实现

3.1 调用 Embedding 服务

public List<Float> getVector(String text) {ResponseEntity responseEntity = xxxx;if (responseEntity != null && responseEntity.getCode() == 0) {List<List<Double>> vectorList = (List<List<Double>>) responseEntity.getData();if (vectorList != null && !vectorList.isEmpty()) {return vectorList.get(0).stream().map(Double::floatValue).collect(Collectors.toList());}}return null;
}

3.2 向量检索(ES KNN 查询)

public List<Knowledge> searchByVector(List<Float> vector) throws IOException {log.info("Searching knowledge with vector similarity using KNN");try {return client.search(s -> s.index(INDEX_NAME).knn(k -> k.field("vector_index").queryVector(vector).k(DEFAULT_SIZE).numCandidates(100)),Knowledge.class).hits().hits().stream().map(Hit::source).collect(Collectors.toList());} catch (Exception e) {log.error("Error searching knowledge by vector: {}", e.getMessage(), e);throw e;}
}

3.3 RRF 排序(融合向量检索和文本检索结果)

private Map<String, Double> calculateRRFScores(List<Hit<KnowledgeCommon>> vectorHits,List<Hit<KnowledgeCommon>> textHits) {Map<String, Double> rrfScores = new HashMap<>();int rank = 1;for (Hit<KnowledgeCommon> hit : vectorHits) {String id = hit.id();double score = VECTOR_WEIGHT * (1.0 / (rank + RRF_CONSTANT));rrfScores.put(id, rrfScores.getOrDefault(id, 0.0) + score);rank++;}rank = 1;for (Hit<KnowledgeCommon> hit : textHits) {String id = hit.id();double score = TEXT_WEIGHT * (1.0 / (rank + RRF_CONSTANT));rrfScores.put(id, rrfScores.getOrDefault(id, 0.0) + score);rank++;}return rrfScores;
}

四、总结

  • 采用 MySQL 存储基础数据,ES 存储向量及文本索引
  • ES 结合 KNN 和分词搜索进行知识检索
  • 使用 RRF 算法融合向量和文本搜索结果,提高查询质量

此方案支持灵活的知识管理和高效检索,可扩展至更大规模的知识库应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习(十四)pandas库入门手册

目录 一、安装与导入二、核心数据结构2.1 Series 类型&#xff08;一维数组&#xff09;2.2 DataFrame 类型&#xff08;二维数组&#xff09; 三、数据读取与写入3.1 读取 CSV 和 Excel 文件3.2 写入数据 四、数据清洗与处理4.1 处理缺失值4.2 数据筛选4.3 数据排序 五、数据分…

【Python 数据结构 4.单向链表】

目录 一、单向链表的基本概念 1.单向链表的概念 2.单向链表的元素插入 元素插入的步骤 3.单向链表的元素删除 元素删除的步骤 4.单向链表的元素查找 元素查找的步骤 5.单向链表的元素索引 元素索引的步骤 6.单向链表的元素修改 元素修改的步骤 二、Python中的单向链表 ​编辑 三…

第1章:项目概述与环境搭建

第1章&#xff1a;项目概述与环境搭建 学习目标 了解YunChangAction灵感记录应用的整体架构和功能掌握SwiftUI开发环境的配置方法创建项目基础结构并理解文件组织方式实现应用的启动屏幕和基本主题设置 理论知识讲解 灵感记录应用概述 灵感记录应用是一种专门设计用来帮助…

2025.3.3总结

周一这天&#xff0c;我约了绩效教练&#xff0c;主要想了解专业类绩效的考核方式以及想知道如何拿到一个更好的绩效。其他的岗位并不是很清楚&#xff0c;但是专业类的岗位&#xff0c;目前采取绝对考核&#xff0c;管理层和专家岗采取相对考核&#xff0c;有末尾淘汰。 通过…

FastGPT 源码:基于 LLM 实现 Rerank (含Prompt)

文章目录 基于 LLM 实现 Rerank函数定义预期输出实现说明使用建议完整 Prompt 基于 LLM 实现 Rerank 下边通过设计 Prompt 让 LLM 实现重排序的功能。 函数定义 class LLMReranker:def __init__(self, llm_client):self.llm llm_clientdef rerank(self, query: str, docume…

LeetCode 1745.分割回文串 IV:动态规划(用III或II能直接秒)

【LetMeFly】1745.分割回文串 IV&#xff1a;动态规划&#xff08;用III或II能直接秒&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/palindrome-partitioning-iv/ 给你一个字符串 s &#xff0c;如果可以将它分割成三个 非空 回文子字符串&#xff0c;…

25年3月5日

1.思维导图 2.不太会 #include "head.h" int main(int argc, const char *argv[]) {int fdopen("../xiaoxin.bmp","O_RDONLY");if(fd-1)printf("open error");//大小struct stat st;if(stat("…

全球首创!微软发布医疗AI助手,终结手写病历时代

今天凌晨&#xff0c;微软发布了医疗界首个用于临床工作流程的AI助手Microsoft Dragon Copilot。 Dragon Copilot是基于语音文本的混合架构&#xff0c;能够将医生的语音或临床口述内容实时转换为文本。例如&#xff0c;医生可以通过语音输入患者的病历信息、医嘱或诊断结果&a…

[自动驾驶-传感器融合] 多激光雷达的外参标定

文章目录 引言外参标定原理ICP匹配示例参考文献 引言 多激光雷达系统通常用于自动驾驶或机器人&#xff0c;每个雷达的位置和姿态不同&#xff0c;需要将它们的数据统一到同一个坐标系下。多激光雷达外参标定的核心目标是通过计算不同雷达坐标系之间的刚性变换关系&#xff08…

Blazor-路由模板(下)

路由约束 类型约束 我们这里使用{id:int}限制路由&#xff0c;id为int类型&#xff0c;并且路由参数 id 对应的 Id 属性也必须是 int 类型。我们试试能否正常访问 page "/demoPage/{id:int}" <h3>demoPage</h3> <h2>路由参数Id&#xff1a;Id&l…

多线程-JUC源码

简介 JUC的核心是AQS&#xff0c;大部分锁都是基于AQS扩展出来的&#xff0c;这里先结合可重入锁和AQS&#xff0c;做一个讲解&#xff0c;其它的锁的实现方式也几乎类似 ReentrantLock和AQS AQS的基本结构 AQS&#xff0c;AbstractQueuedSynchronizer&#xff0c;抽象队列…

通过多线程获取RV1126的AAC码流

目录 一RV1126多线程获取音频编码AAC码流的流程 1.1AI模块的初始化并使能 1.2AENC模块的初始化 ​​​​​​​1.3绑定AI模块和AENC模块 ​​​​​​​1.4多线程获取每一帧AAC码流 ​​​​​​​1.5每个AAC码流添加ADTSHeader头部 ​​​​​​​1.6写入具体每一帧AAC的…

JVM常用概念之对象初始化的成本

在JVM常用概念之新对象实例化博客中我讲到了对象的实例化&#xff0c;主要包含分配&#xff08;TLAB&#xff09;、系统初始化、用户初始化&#xff0c;而我在JVM常用概念之线程本地分配缓冲区&#xff08;ThreadLocal Allocation Buffer&#xff0c;TLAB&#xff09;博客中也讲…

java后端开发day27--常用API(二)正则表达式爬虫

&#xff08;以下内容全部来自上述课程&#xff09; 1.正则表达式&#xff08;regex&#xff09; 可以校验字符串是否满足一定的规则&#xff0c;并用来校验数据格式的合法性。 1.作用 校验字符串是否满足规则在一段文本中查找满足要求的内容 2.内容定义 ps&#xff1a;一…

AI---DevOps常备工具(‌AI-Integrated DevOps Essential Tools)

AI---DevOps常备工具 技术领域正在迅速发展&#xff0c;随着我们步入 2025 年&#xff0c;有一点是明确的&#xff1a;人工智能&#xff08;AI&#xff09;不再只是一个流行词&#xff0c;它是每个 DevOps 工程师都需要掌握的工具。随着云环境的复杂性增加、对更快部署的需求以…

Pytorch中的主要函数

目录 一、torch.manual_seed(seed)二、torch.cuda.manual_seed(seed)三、torch.rand(*size, outNone, dtypeNone, layouttorch.strided, deviceNone, requires_gradFalse)四、给大家写一个常用的自动选择电脑cuda 或者cpu 的小技巧五、torch.version.cuda&#xff1b;torch.bac…

Spring Boot中对接Twilio以实现发送验证码和验证短信码

Twilio介绍 Twilio是一家提供云通信服务的公司&#xff0c;旨在帮助开发者和企业通过简单的API实现各种通信功能。以下是Twilio的一些主要特点和服务介绍&#xff1a; 核心功能 短信服务&#xff08;SMS&#xff09;&#xff1a;允许用户通过API发送和接收短信&#xff0c;支…

VSCode详细安装步骤,适用于 Windows/macOS/Linux 系统

以下是 Visual Studio Code (VSCode) 的详细安装步骤&#xff0c;适用于 Windows/macOS/Linux 系统&#xff1a; VSCode 的详细安装步骤 一、Windows 系统安装1. 下载安装包2. 运行安装程序3. 验证安装 二、macOS 系统安装1. 方法一&#xff1a;官网下载安装包2. 方法二&#x…

基于PyTorch的深度学习3——基于autograd的反向传播

反向传播&#xff0c;可以理解为函数关系的反向传播。

设备管理系统功能与.NET+VUE(IVIEW)技术实现

在现代工业和商业环境中&#xff0c;设备管理系统&#xff08;Equipment Management System&#xff0c;简称EMS&#xff09;是确保设备高效运行和维护的关键工具。本文采用多租户设计的设备管理系统&#xff0c;基于.NET后端和VUE前端&#xff08;使用IVIEW UI框架&#xff09…