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.rhkb.cn/news/27938.html

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

相关文章

软考中级-数据库-3.2 数据结构-数组和矩阵

数组 一维数组是长度固定的线性表&#xff0c;数组中的每个数据元素类型相同。n维数组是定长线性表在维数上的扩张&#xff0c;即线性表中的元素又是一个线性表。 例如一维数组a[5][a1,a2,a3,a4,a5] 二维数组a[2][3]是一个2行2列的数组 第一行[a11,a12,a13] 第二行[a21,a22,a23…

android亮灭屏流程分析

前言 亮灭涉及的东西非常多&#xff0c;因此单独写一个文档&#xff0c;进行详细说明&#xff0c;亮灭屏包括的东西不只是亮灭屏&#xff0c;还包括亮度调节、屏幕状态变化等东西。本文仅作学习使用&#xff0c;不涉及商业&#xff0c;侵权请联系删除。 framework层的学习链接…

V4L2框架基础

一、V4L2视频设备驱动基础 1.V4L2是专门为Linux设备设计的整合视频框架&#xff08;其主要核心在Linux内核&#xff0c;相当于Linux操作系统上层的视频源捕获驱动框架&#xff09;。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2驱动框架能够支持多种类型&#x…

C# 多线程

概述 进程和线程 进程&#xff1a;指在系统中运行的一个应用程序。 线程&#xff1a;进程中的一个执行任务。一个进程至少有一个线程&#xff0c;一个进程可以有多个线程&#xff0c;多个线程可共享数据。 多线程 多线程&#xff1a;在一个程序中同时运行多个线程&#xff0…

突破光学成像局限:全视野光学血管造影技术新进展

全视野光学血管造影&#xff08;FFOA&#xff09;作为一种实时、无创的成像技术&#xff0c;能够提取生物血液微循环信息&#xff0c;为深入探究生物组织的功能和病理变化提供关键数据。然而&#xff0c;传统FFOA成像方法受到光学镜头景深&#xff08;DOF&#xff09;的限制&am…

Deepgram推出Nova-3 Medical,AI语音转录助力医疗行业

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

centOS 环境 安装redis方法

一、准备centOS环境 参考文章&#xff1a;Hyper-V 安装CentOS7_代码草率了的博客-CSDN博客 二、redis官网 地址&#xff1a;Download | Redis 演示版本为?redis-5.0.14.tar.gz 三、redis源码编译 登录后创建soft目录 进入目录使用wget下载所需资源包 命令&#xff1a;w…

[51 单片机] --串口编程

1&#xff0c;通讯方式基本概念 1&#xff0c;按照 --> 数据传送方式串行通讯&#xff1a;使用一条数据线&#xff0c;将数据一位一位地依次传输&#xff0c;每一位数据占据一个固定的时间长度&#xff0c;串行通信的特点&#xff1a;传输线少&#xff0c;长距离传送时成本…

Golang的微服务服务发现机制

## 1. Golang微服务服务发现机制 微服务架构已经成为当今软件开发的主流趋势&#xff0c;它能将复杂的单体应用拆分成小而独立的服务单元&#xff0c;实现更快的开发、部署和扩展。在微服务架构中&#xff0c;服务发现是非常重要的一环&#xff0c;它能够实现服务之间的自动发现…

Python 创建地形图

原始地 DEM。 火山口湖 (OR) 区域的起始 DEM。数据来自 NASA DEM 本身非常美丽&#xff0c;但我们先进行分层。 将自定义色彩图应用于 DEM 对于我在 ArcGIS Pro 版本中所做的初始高程样式着色&#xff0c;我使用了“高程 #7”。在 matplotlib 中可用的标准颜色图中&#xff…

《Operating System Concepts》阅读笔记:p180-p187

《Operating System Concepts》学习第 20 天&#xff0c;p180-p187 总结&#xff0c;总计 8 页。 一、技术总结 1.forke-join A strategy for thread creation in which the main parent thread creates (forks) one or more child threads and then waits for the children…

文心4.5,大模型下半场的野心之作

2025年开年&#xff0c;全球大模型竞赛进入白热化阶段。2月28日&#xff0c;百度宣布其文心大模型4.5将于3月16日正式上线&#xff0c;强调其原生多模态与深度思考能力&#xff0c;并计划于6月30日开源。这一动作不仅标志着百度技术路线的重大转向&#xff0c;更被视为中国大模…

transformer架构解析{前馈全连接层,规范化层,子层(残差)连接结构}(含代码)-4

目录 前言 前馈全连接层 学习目标 什么是前馈全连接层 前馈全连接层的作用 前馈全连接层代码实现 规范化层 学习目标 规范化层的作用 规范化层的代码实现 子层&#xff08;残差&#xff09;连接结构 学习目标 什么是子层&#xff08;残差&#xff09;连接结构 子层连…

Django视图与URLs路由详解

在Django Web框架中&#xff0c;视图&#xff08;Views&#xff09;和URLs路由&#xff08;URL routing&#xff09;是Web应用开发的核心概念。它们共同负责将用户的请求映射到相应的Python函数&#xff0c;并返回适当的响应。本篇博客将深入探讨Django的视图和URLs路由系统&am…

串口通讯基础

第1章 串口的发送和接收过程 1.1 串口接收过程 当上位机给串口发送(0x55)数据时&#xff0c;MCU的RX引脚接受到&#xff08;0x55&#xff09;数据&#xff0c;数据(0x55)首先进入移位寄存器。数据全部进入移位寄存器后&#xff0c;一次将&#xff08;0x55&#xff09;全部搬运…

kakfa-3:ISR机制、HWLEO、生产者、消费者、核心参数负载均衡

1. kafka内核原理 1.1 ISR机制 光是依靠多副本机制能保证Kafka的高可用性&#xff0c;但是能保证数据不丢失吗&#xff1f;不行&#xff0c;因为如果leader宕机&#xff0c;但是leader的数据还没同步到follower上去&#xff0c;此时即使选举了follower作为新的leader&#xff…

基于Linux系统的物联网智能终端

背景 产品研发和项目研发有什么区别&#xff1f;一个令人发指的问题&#xff0c;刚开始工作时项目开发居多&#xff0c;认为项目开发和产品开发区别不大&#xff0c;待后来随着自身能力的提升&#xff0c;逐步感到要开发一个好产品还是比较难的&#xff0c;我认为项目开发的目的…

STM32——DMA详解

目录 一&#xff1a;DMA简介 二&#xff1a;DMA基本结构 三&#xff1a;DMA实现过程 1.框图 2.DMA进行转运的条件 四&#xff1a;函数 一&#xff1a;DMA简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设存储器或者存储器和存储器之间的高速数据传输&…

告别卡顿,拥抱流畅!MemReduct——内存清理工具

先给安装包下载地址&#xff1a;MemReduct.exe下载&#xff0c;无脑下一步安装即可。 MemReduct 是一款出色的内存清理工具&#xff0c;以下是对它的详细介绍&#xff1a; 功能特点 高效内存清理&#xff1a;采用先进算法及系统底层 API&#xff0c;能智能清理系统缓存、应用…

告别GitHub连不上!一分钟快速访问方案

一、当GitHub抽风时&#xff0c;你是否也这样崩溃过&#xff1f; &#x1f621; npm install卡在node-sass半小时不动&#x1f62d; git clone到90%突然fatal: early EOF&#x1f92c; 改了半天hosts文件&#xff0c;第二天又失效了... 根本原因&#xff1a;传统代理需要复杂…