《语义捕捉全解析:从“我爱自然语言处理”到嵌入向量的全过程》
首先讲在前面,介绍一些背景
RAG(Retrieval-Augmented Generation,检索增强生成)
是一种结合了信息检索与语言生成模型的技术,通过从外部知识库中检索相关信息,并将其作为提示输入给大型语言模型(LLMs),以增强模型处理知识密集型任务的能力。以下是RAG的具体操作过程解析:
1.数据准备阶段
• 数据提取:使用相应的数据加载器从各种数据源(如PDF、Word、CSV、HTML等)中提取文本数据。例如,可以使用TextLoader
加载txt文本。
• 文本分割:将提取的文本分割成适当大小的块,以确保每个块的内容具有一定的语义完整性。常用的分割方法包括字符级分割、递归方式分割等。
• 向量化(embedding):使用嵌入模型(如HuggingFaceBgeEmbeddings
)将分割后的文本块转换为向量表示。• 数据入库:将向量化后的文本块存储到向量数据库(如Chroma
、weaviate
、FAISS
等)中,以便后续的高效检索。
2.检索阶段
• 用户提问:用户提出问题,系统需要从知识库中检索与该问题相关的信息。
• 向量化查询:使用相同的嵌入模型将用户的问题转换为向量表示。
• 相似度计算与检索:计算问题向量与知识库中文档块向量之间的相似度,选择相似度最高的前K个文档块作为当前问题的增强上下文信息。3.生成阶段
• 构造Prompt:将用户的问题和检索到的相关文档合并为一个新的提示(Prompt),可以使用ChatPromptTemplate
等工具来构造。• LLM生成答案:将构造好的提示输入到大型语言模型(如ChatZhipuAI
),模型会基于提供的信息生成最终的回答。
4.高级RAG
• 数据预处理:在数据索引阶段进行更精细的数据清洗、设计文档结构和添加元数据等,以提升文本的一致性、准确性和检索效率。
• 检索前处理:在检索前可以进行一些额外的处理,如查询扩展、语义解析等,以提高检索的准确性。
• 检索后处理:在检索后可以对结果进行排序、去重、融合等操作,以优化检索结果的质量。
• 生成优化:将检索与微调、强化学习等技术融合,进一步提升生成结果的质量和相关性。
5.模块化RAG
• 功能模块化:将RAG系统分解为多个功能模块,如查询搜索引擎、融合多个回答等,每个模块负责特定的任务。
• 模块编排:根据具体的应用场景和需求,对各个模块进行灵活的设计和编排,形成多种RAG模式。通过上述过程,RAG技术能够有效地结合外部知识库和大型语言模型的优势,生成更准确、更符合用户需求的回答。
向量化后的向量长度
• 固定长度:嵌入模型通常会将文本转换为固定长度的向量。例如,常见的嵌入模型如text-embedding-ada-002
会生成固定长度的向量(如1024维或768维),无论输入文本的长度如何。
• 与文章无关:因此,不同文章的向量化后的向量长度是相同的,都是由嵌入模型的输出维度决定的。
向量数据库的存储
• 存储向量:向量化后的文本向量会被存储在向量数据库中。向量数据库专门用于存储和检索高维向量数据,如FAISS、Milvus等。
• 索引结构:向量数据库通常会建立索引结构(如KD树、球树、LSH等),以便快速检索相似向量。
检索和相似度计算
• 用户提问向量化:当用户提出问题时,使用相同的嵌入模型将问题文本转换为向量表示。
• 相似度计算:计算用户问题向量与向量数据库中存储的向量之间的相似度。常用的相似度计算方法包括:
• 余弦相似度:衡量两个向量之间的夹角余弦值,值越大表示越相似。
• 欧氏距离:衡量两个向量之间的直线距离,值越小表示越相似。
• 检索相关向量:根据相似度计算结果,选择相似度最高的前K个向量对应的文本块作为检索结果。
• 返回对应信息:通过检索到的文本块,找到与用户问题相关的信息,并将其作为上下文提供给语言模型进行生成。
示例代码
以下是一个简单的示例代码,展示如何使用嵌入模型和向量数据库进行检索:
from openai import OpenAI
import numpy as np
from numpy.linalg import norm# 初始化OpenAI客户端
client = OpenAI()# 获取嵌入向量
def get_embedding(text, model="text-embedding-ada-002"):response = client.embeddings.create(input=text, model=model)return response.data[0].embedding# 计算余弦相似度
def cosine_similarity(a, b):return np.dot(a, b) / (norm(a) * norm(b))# 示例文档
documents = ["联合国就苏丹达尔富尔地区大规模暴力事件发出警告","土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判","日本岐阜市陆上自卫队射击场内发生枪击事件 3人受伤","国家游泳中心(水立方):恢复游泳、嬉水乐园等水上项目运营","我国首次在空间站开展舱外辐射生物学暴露实验",
]# 获取文档的嵌入向量
doc_embeddings = [get_embedding(doc) for doc in documents]# 用户提问
query = "国际争端"
query_embedding = get_embedding(query)# 计算相似度
similarities = [cosine_similarity(query_embedding, doc_embedding) for doc_embedding in doc_embeddings]# 输出最相似的文档
most_similar_index = np.argmax(similarities)
print(f"最相似的文档: {documents[most_similar_index]}")
输出结果
最相似的文档: 土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判
通过上述过程,可以有效地根据用户提出的问题找到相关的向量和对应的信息。
正文如下开始旅程
相关文章:

《语义捕捉全解析:从“我爱自然语言处理”到嵌入向量的全过程》
首先讲在前面,介绍一些背景 RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了信息检索与语言生成模型的技术,通过从外部知识库中检索相关信息,并将其作为提示输入给大型语言模型ÿ…...

HIVE如何注册UDF函数
如果注册UDF函数的时候报了上面的错误,说明hdfs上传的路径不正确, 一定要用下面的命令 hadoop fs -put /tmp/hive/111.jar /user/hive/warehouse 一定要上传到上面路径,这样在创建函数时,引用下面的地址就可以创建成功...

VsCode创建VUE项目
1. 首先安装Node.js和npm 通过网盘分享的文件:vsCode和Node(本人电脑Win11安装) 链接: https://pan.baidu.com/s/151gBWTFZh9qIDS9XWMJVUA 提取码: 1234 它们是运行和构建Vue.js应用程序所必需的。 1.1 Node安装,点击下一步即可 …...

x64、aarch64、arm与RISC-V64:详解四种处理器架构
x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…...

如何使用iframe来渲染ThingsBoard仪表盘
1、概述 当我们在使用ThingsBoard的时候,有时候需要再自己的前端项目中展示大屏,thingsboard的仪表盘是可以来做大屏的,虽然界面达不到非常的美观,但是对比之前的版本,现在的版本仪表盘做了很多的优化了。可以实现将thingsboard的仪表板嵌入到自己的vue界面中作为大屏显示…...

退格法记单词(类似甘特图)
退格法记单词,根据记忆次数或熟练程度退格,以示区分,该方法用于短时高频大量记单词: explosion爆炸,激增 mosquito蚊子granary粮仓,谷仓 offhand漫不经心的 transient短暂的slob懒惰而邋遢的…...

计算 MySQL 表行的成本是多少?
当计算表中的所有行时,将使用什么索引?好吧,MySQL文档文档对此提供了一个直接的答案,引用: InnoDB 通过遍历最小的可用二级索引来处理 SELECT COUNT(*) 语句除非索引或优化器提示指示优化器使用…...

Pygame介绍与游戏开发
提供pygame功能介绍的文档:Pygame Front Page — pygame v2.6.0 documentation 基础语法和实现逻辑 与CLI不同,pygame提供了图形化使用界面GUI(graphical user interface)基于图像的界面可以创建一个有图像和颜色的窗口 要让py…...

webpack配置方式
1. 基本配置文件 (webpack.config.js)(导出一个对象) 最常见的方式是通过 webpack.config.js 文件来配置 Webpack,导出一个对象。你可以在这个文件中导出一个配置对象,指定入口、输出、加载器、插件等。 // webpack.config.js m…...

10. k8s二进制集群之Kube Scheduler部署
在开始之前需要准备什么?创建kube-scheduler证书请求文件【即证书的生成⓵】根据上面证书配置文件生成kube-scheduler证书【即证书的生成⓶】创建与关联kube-scheduler配置文件(为后面生成系统服务做准备)创建kube-scheduler服务配置文件【准备系统服务⓵】创建kube-schedul…...

java实现8583报文解析技术详解
文章目录 概要整体架构流程技术名词解释技术细节小结概要 ISO 8583协议是金融交易系统中广泛使用的通信协议,用于规范报文的格式和数据交换。解析8583报文是实现金融交易系统的关键技术之一。本文将详细介绍8583报文解析的核心实现,重点关注解析算法和关键代码逻辑。 8583报…...

k8s服务发现有哪些方式?
在 Kubernetes 中,服务发现是指如何让应用程序在集群内互相找到并通信。Kubernetes 提供了多种服务发现的方式,适应不同的使用场景。以下是 Kubernetes 中常见的服务发现方式: 1. 环境变量(Environment Variables) 概…...

【SqlServer】SQL Server Management Studio (SSMS) 下载、安装、配置使用及卸载——保姆级教程
超详细的 SQL Server Management Studio (SSMS) 下载、安装、连接数据库配置及卸载教程 SQL Server Management Studio (SSMS) 是微软提供的图形化管理工具,主要用于连接、管理和开发 SQL Server 数据库。以下是详细的 SSMS 下载、安装、连接数据库以及卸载的完整教…...

[ESP32:Vscode+PlatformIO]添加第三方库 开源库 与Arduino导入第三方库的区别
前言 PlatformIO与Arduino在添加第三方库方面的原理存在显著差异 在PlatformIO中,第三方库的使用是基于项目(工程)的。具体而言,只有当你为一个特定的项目添加了某个第三方库后,该项目才能使用该库。这些第三方库的文…...

音频文件格式——AAC、OGG和FLAC
3.AAC文件格式 3.1 封装格式解析 高级音频编码 (Advanced Audio Coding) 是一种用于有损数字音频压缩的音频编码标准。它被设计为 MP3 格式的继承者,在相同比特率下通常可以获得比 MP3 更高的音质。AAC有两种封装格式: ADIF&am…...

BUU26 [极客大挑战 2019]HardSQL1
输入一些SQL关键词,发现空格,,union,and,by都被过滤了 被过滤,就用like替代 发现登录成功,可以注入 报错注入 注意 1.这里过滤了空格,就用()将内容包裹起来 比如说:…...

多光谱成像技术在华为Mate70系列的应用
华为Mate70系列搭载了光谱技术的产物——红枫原色摄像头,这是一款150万像素的多光谱摄像头。 相较于普通摄像头,它具有以下优势: 色彩还原度高:色彩还原准确度提升约 120%,能捕捉更多光谱信息,使拍摄照片色…...

借助 Cursor 快速实现小程序前端开发
借助 Cursor 快速实现小程序前端开发 在当今快节奏的互联网时代,小程序因其便捷性、高效性以及无需下载安装的特点,成为众多企业和开发者关注的焦点。然而,小程序的开发往往需要耗费大量的时间和精力,尤其是在前端开发阶段。幸运…...

【deepseek】ollama chatbox webui 本地部署deepseek 踩坑记录
部署 1、前往Ollama官网下载跨平台工具 官网直达:https://ollama.com/download 2、挑选适合自己设备的模型版本,获取运行指令 访问模型库:https://ollama.com/library/deepseek-r1 ▌配置建议: • 入门级:1.5B版本&…...

在离线的服务器上部署Python的安装库
在离线服务器上部署 Python 安装库(如 SQLAlchemy、pandas、pyodbc 等),可以使用以下方法: 方法 1:在联网机器上下载依赖,拷贝到离线服务器 适用于:服务器完全无法访问互联网。 步骤 1. 在联网…...

计算机网络笔记再战——理解几个经典的协议2
理解互联网与TCP/IP 下面,我们将会开始理解互联网这个东西,进一步的,我们会理解何为TCP/IP 我们的互联网就是一个巨大的网状结构,需要注意的是——每一个网状的节点之间都是使用一个叫做NOC,Network Operation Center…...

设计高效的测试用例:从需求到验证
在现代软件开发过程中,测试用例的设计一直是质量保证(QA)环节的核心。有效的测试用例不仅能够帮助发现潜在缺陷,提升软件质量,还能降低后期修复成本,提高开发效率。尽管如此,如何从需求出发&…...

git reset 命令
git reset 的作用 git reset 是一个非常强大的命令,用于将当前分支的 HEAD(即当前指向的提交)重置到指定的提交。它还可以根据参数的不同,对工作区(Working Directory)和暂存区(Staging Area&a…...

docker被“遗忘”的那些参数该如何拯救
一、docker容器启动时没有指定端口,如何在不删除容器的情况下配置端口呢 在 Docker 中,如果容器启动时没有指定端口映射,可以通过以下步骤在不删除容器的情况下配置端口: 方法 1: 使用 docker commit 和 docker run 提交容器为新…...

BFS算法——广度优先搜索,探索未知的旅程(下)
文章目录 前言一. N叉树的层序遍历1.1 题目链接:https://leetcode.cn/problems/n-ary-tree-level-order-traversal/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 二. 二叉树的锯齿形层序遍历2.1 题目链接:htt…...

Python分享20个Excel自动化脚本
在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式。通过Python,我们可以实现对Excel文件的各种自动化操作,提高工作效率。 本文将分享20个实用的Excel自动化脚本,以帮助新手小白更轻松地掌握这些技能。 1. Excel单…...

pytest+request+yaml+allure 接口自动化测试全解析[手动写的跟AI的对比]
我手动写的:Python3:pytest+request+yaml+allure接口自动化测试_request+pytest+yaml-CSDN博客 AI写的:pytest+request+yaml+allure 接口自动化测试全解析 在当今的软件开发流程中,接口自动化测试扮演着至关重要的角色。它不仅能够提高测试效率,确保接口的稳定性和正确性…...

深入解析 FFmpeg 的 AAC 编解码过程
深入解析 FFmpeg 的 AAC 编解码过程 —— 技术详解与代码实现 AAC(Advanced Audio Coding) 是一种高效的有损音频压缩格式,因其高压缩效率和良好的音质而被广泛应用于流媒体、广播和音频存储等领域。FFmpeg 是一个强大的多媒体处理工具,支持 AAC 的编码和解码。本文将详细…...

嵌入式硬件篇---OpenMV串口通信json字符串
文章目录 前言第一部分:Json字符串通信协议优点缺点 Json优点缺点编码与解码 第二部分:UART串口通信UART常用函数注意 总结 前言 以上就是今天要讲的内容,本文简单介绍了Json字符串、UART串口通信。 第一部分:Json字符串 通信协议 在传统的单片机应用中ÿ…...

Python基于Django的课堂投票系统的设计与实现【附源码】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...