rag-embeddings基础流程

什么是检索增强的生成模型

LLM 固有的局限性

  1. LLM 的知识不是实时的
  2. LLM 可能不知道你私有的领域/业务知识

检索增强生成

RAG(Retrieval Augmented Generation)顾名思义,通过检索的方法来增强生成模型的能力。

image-20240505194438721


类比:你可以把这个过程想象成开卷考试。让 LLM 先翻书,再回答问题。

RAG 系统的基本搭建流程

搭建过程:

  1. 文档加载,并按一定条件切割成片段

  2. 将切割的文本片段灌入检索引擎

  3. 封装检索接口

  4. 构建调用流程:Query -> 检索 -> Prompt -> LLM -> 回复

RAG Pipeline 初探

user_query = "how many parameters does llama 2 have?"# 1. 检索
search_results = search(user_query, 2)# 2. 构建 Prompt
prompt = build_prompt(prompt_template, context=search_results, query=user_query)
print("===Prompt===")
print(prompt)# 3. 调用 LLM
response = get_completion(prompt)print("===回复===")
print(response)
===Prompt===你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。已知信息:1. Llama 2, an updated version of Llama 1, trained on a new mix of publicly available data. We also increased the size of the pretraining corpus by 40%, doubled the context length of the model, and adopted grouped-query attention (Ainslie et al., 2023). We are releasing variants of Llama 2 with 7B, 13B, and 70B parameters. We have also trained 34B variants, which we report on in this paper but are not releasing.§In this work, we develop and release Llama 2, a collection of pretrained and fine-tuned large language models (LLMs) ranging in scale from 7 billion to 70 billion parameters. Our fine-tuned LLMs, called Llama 2-Chat, are optimized for dialogue use cases. Our models outperform open-source chat models on most benchmarks we tested, and based onour human evaluations for helpfulness and safety, may be a suitable substitute for closed source models. We provide a detailed description of our approach to fine-tuning and safety improvements of Llama 2-Chat in order to enable the community to build on our work and contribute to the responsible development of LLMs.用户问:
how many parameters does llama 2 have?如果已知信息不包含用户问题的答案,或者已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。
请不要输出已知信息中不包含的信息或答案。
请用中文回答用户问题。===回复===
Llama 2有7B, 13B和70B参数的变体。
关键字检索的局限性

同一个语义,用词不同,可能导致检索不到有效的结果。属于一种硬匹配

# user_query="Does llama 2 have a chat version?"
user_query = "Does llama 2 have a conversational variant?"search_results = search(user_query, 2)for res in search_results:print(res+"\n")

# user_query="Does llama 2 have a chat version?"
user_query = "Does llama 2 have a conversational variant?"search_results = search(user_query, 2)for res in search_results:print(res+"\n")1. Llama 2, an updated version of Llama 1, trained on a new mix of publicly available data. We also increased the size of the pretraining corpus by 40%, doubled the context length of the model, and adopted grouped-query attention (Ainslie et al., 2023). We are releasing variants of Llama 2 with 7B, 13B, and 70B parameters. We have also trained 34B variants, which we report on in this paper but are not releasing.§variants of this model with 7B, 13B, and 70B parameters as well.

向量检索

文本向量(Text Embeddings)

  1. 将文本转成一组浮点数:每个下标 𝑖,对应一个维度
  2. 整个数组对应一个 𝑛 维空间的一个点,即文本向量又叫 Embeddings
  3. 向量之间可以计算距离,距离远近对应语义相似度大小

image-20240507212656861

向量间的相似度计算

image-20240507213036728

最常见的用余弦距离

# query = "国际争端"# 且能支持跨语言
query = "global conflicts"documents = ["联合国就苏丹达尔富尔地区大规模暴力事件发出警告","土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判","日本岐阜市陆上自卫队射击场内发生枪击事件 3人受伤","国家游泳中心(水立方):恢复游泳、嬉水乐园等水上项目运营","我国首次在空间站开展舱外辐射生物学暴露实验",
]query_vec = get_embeddings([query])[0]
doc_vecs = get_embeddings(documents)print("Query与自己的余弦距离: {:.2f}".format(cos_sim(query_vec, query_vec)))
print("Query与Documents的余弦距离:")
for vec in doc_vecs:print(cos_sim(query_vec, vec))print()print("Query与自己的欧氏距离: {:.2f}".format(l2(query_vec, query_vec)))
print("Query与Documents的欧氏距离:")
for vec in doc_vecs:print(l2(query_vec, vec))
Query与自己的余弦距离: 1.00
Query与Documents的余弦距离:
0.7622376995981268
0.7564484035029613
0.7426558372998222
0.7077987135264396
0.7254230492369406Query与自己的欧氏距离: 0.00
Query与Documents的欧氏距离:
0.6895829747071623
0.6979278474290739
0.7174178392255148
0.7644623330084925
0.7410492267209755

向量数据库

向量数据库,是专门为向量检索设计的中间件

澄清几个关键概念:

  • 向量数据库的意义是快速的检索;
  • 向量数据库本身不生成向量,向量是由 Embedding 模型产生的;
  • 向量数据库与传统的关系型数据库是互补的,不是替代关系,在实际应用中根据实际需求经常同时使用。
  1. 向量数据库的意义是快速的检索
    向量数据库是设计用来高效存储和检索向量数据的系统。这些向量通常是高维数据的数学表示,可以代表图像、文本或任何其他类型的复杂数据。向量数据库通过使用高效的索引结构(如KD树、球树、倒排索引等)来优化近似最近邻(ANN)查询,即快速找出与给定向量最相似的向量。这种快速检索功能使得向量数据库非常适用于推荐系统、图像识别、自然语言处理等应用,其中需要快速匹配和检索大量高维数据。

  2. 向量数据库本身不生成向量,向量是由 Embedding 模型产生的
    向量数据库专注于存储和检索向量,而不负责生成这些向量。向量的生成通常由专门的模型完成,这些模型称为嵌入模型(Embedding Models)。例如,在文本处理中,模型如BERT或Word2Vec可以将文本转换为数值向量,这些向量捕获了文本的语义特征。在图像处理中,如ResNet等深度学习模型可用于生成图像的特征向量。生成的向量随后被存储在向量数据库中,用于后续的检索和分析任务。

  3. 向量数据库与传统的关系型数据库是互补的,不是替代关系
    向量数据库和传统的关系型数据库(如MySQL、PostgreSQL等)各有其优势和适用场景。关系型数据库优秀于处理结构化数据(如表格数据),支持复杂的查询语言(如SQL),并提供事务性支持、一致性和持久性保证。相反,向量数据库则专门用于处理和检索高维向量数据。在实际应用中,根据需求经常同时使用这两种数据库。例如,在一个推荐系统中,可能会使用向量数据库来处理和检索用户和商品的嵌入向量,以找到相似的商品或用户;同时使用关系型数据库来管理用户的账户信息、交易记录等结构化数据。

综上,向量数据库提供了一种专门针对高维数据检索的优化解决方案,而其与传统数据库的结合使用可以在保证数据管理的多样性和效率方面发挥更大的潜力。

向量数据库服务
Server 端chroma run --path /db_path
Client 端import chromadb
chroma_client = chromadb.HttpClient(host='localhost', port=8000)
主流向量数据库功能对比

image-20240507215216985

  • FAISS: Meta 开源的向量检索引擎 https://github.com/facebookresearch/faiss
  • Pinecone: 商用向量数据库,只有云服务 https://www.pinecone.io/
  • Milvus: 开源向量数据库,同时有云服务 https://milvus.io/
  • Weaviate: 开源向量数据库,同时有云服务 https://weaviate.io/
  • Qdrant: 开源向量数据库,同时有云服务 https://qdrant.tech/
  • PGVector: Postgres 的开源向量检索引擎 https://github.com/pgvector/pgvector
  • RediSearch: Redis 的开源向量检索引擎 https://github.com/RediSearch/RediSearch
  • ElasticSearch 也支持向量检索 https://www.elastic.co/enterprise-search/vector-search

基于向量检索的 RAG

class RAG_Bot:def __init__(self, vector_db, llm_api, n_results=2):self.vector_db = vector_dbself.llm_api = llm_apiself.n_results = n_resultsdef chat(self, user_query):# 1. 检索search_results = self.vector_db.search(user_query, self.n_results)# 2. 构建 Promptprompt = build_prompt(prompt_template, context=search_results['documents'][0], query=user_query)# 3. 调用 LLMresponse = self.llm_api(prompt)return response
# 创建一个RAG机器人
bot = RAG_Bot(vector_db,llm_api=get_completion
)user_query = "llama 2有多少参数?"response = bot.chat(user_query)print(response)
llama 2有7B, 13B, 和70B参数。

如果想要换个国产模型

import json
import requests
import os# 通过鉴权接口获取 access tokendef get_access_token():"""使用 AK,SK 生成鉴权签名(Access Token):return: access_token,或是None(如果错误)"""url = "https://aip.baidubce.com/oauth/2.0/token"params = {"grant_type": "client_credentials","client_id": os.getenv('ERNIE_CLIENT_ID'),"client_secret": os.getenv('ERNIE_CLIENT_SECRET')}return str(requests.post(url, params=params).json().get("access_token"))# 调用文心千帆 调用 BGE Embedding 接口def get_embeddings_bge(prompts):url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/embeddings/bge_large_en?access_token=" + get_access_token()payload = json.dumps({"input": prompts})headers = {'Content-Type': 'application/json'}response = requests.request("POST", url, headers=headers, data=payload).json()data = response["data"]return [x["embedding"] for x in data]# 调用文心4.0对话接口
def get_completion_ernie(prompt):url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + get_access_token()payload = json.dumps({"messages": [{"role": "user","content": prompt}]})headers = {'Content-Type': 'application/json'}response = requests.request("POST", url, headers=headers, data=payload).json()return response["result"]
# 创建一个向量数据库对象
new_vector_db = MyVectorDBConnector("demo_ernie",embedding_fn=get_embeddings_bge
)
# 向向量数据库中添加文档
new_vector_db.add_documents(paragraphs)# 创建一个RAG机器人
new_bot = RAG_Bot(new_vector_db,llm_api=get_completion_ernie
)
user_query = "how many parameters does llama 2 have?"response = new_bot.chat(user_query)print(response)
Llama 2拥有7B、13B和70B三种不同参数量的版本。同时,根据已知信息,虽然还训练了34B的版本,但这个版本并没有发布。所以,Llama 2具体拥有的参数量取决于您使用的是哪一个版本。

OpenAI 新发布的两个 Embedding 模型

2024 年 1 月 25 日,OpenAI 新发布了两个 Embedding 模型

  • text-embedding-3-large
  • text-embedding-3-small

其最大特点是,支持自定义的缩短向量维度,从而在几乎不影响最终效果的情况下降低向量检索与相似度计算的复杂度。

通俗的说:越大越准、越小越快。 官方公布的评测结果:

image-20240507221603118

model = "text-embedding-3-large"
dimensions = 128# query = "国际争端"# 且能支持跨语言
query = "global conflicts"documents = ["联合国就苏丹达尔富尔地区大规模暴力事件发出警告","土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判","日本岐阜市陆上自卫队射击场内发生枪击事件 3人受伤","国家游泳中心(水立方):恢复游泳、嬉水乐园等水上项目运营","我国首次在空间站开展舱外辐射生物学暴露实验",
]query_vec = get_embeddings([query], model=model, dimensions=dimensions)[0]
doc_vecs = get_embeddings(documents, model=model, dimensions=dimensions)print("向量维度: {}".format(len(query_vec)))print()print("Query与Documents的余弦距离:")
for vec in doc_vecs:print(cos_sim(query_vec, vec))print()print("Query与Documents的欧氏距离:")
for vec in doc_vecs:print(l2(query_vec, vec))
向量维度: 128Query与Documents的余弦距离:
0.33398035655745417
0.3530581001937585
0.3139780154086699
0.2137349345799671
0.12878899474455177Query与Documents的欧氏距离:
1.1541400966944355
1.1374901586221358
1.171342807713185
1.2540056518268037
1.3200083334660306

扩展阅读:这种可变长度的 Embedding 技术背后的原理叫做 Matryoshka Representation Learning

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

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

相关文章

CTK库编译-01

地址 官网地址:Commontk github地址:https://github.com/commontk/CTK 编译环境 Qt套件: IDE:VS2022 使用vs2022 文件->打开->cmake 修改根目录下的CMakeLists.txt 默认只编译core模块,所以需要把部分模块…

一文读懂Python的`__init__`,`__init__`方法的终极指南

大家好,今天给大家介绍一个Python中一个特殊的函数__init__。 在Python中,__init__方法是一个特殊的函数,它在创建类的新实例时自动调用。它的作用类似于其他编程语言中的构造函数,用于初始化对象的状态。这篇文章将带你深入了解…

资料总结分享:SAM,bam,bed文件格式

目录 sam文件 bam文件 bed 文件 sam文件 SAM(Sequence Alignment/Map)文件是存储测序数据比对结果的一种常见格式。SAM文件通常用于存储DNA或RNA测序数据在参考基因组上的比对结果。 SAM文件由多行文本组成,每一行代表一个比对结果。SAM文…

QX-mini51学习---(2)点亮LED

目录 1什么是ed 2led工作参数 3本节相关原理图分析 4本节相关c 5实践 1什么是ed 半导体发光二极管,将电能转化为光能,耗电低,寿命长,抗震动 长正短负,贴片是绿点处是负极 2led工作参数 3本节相关原理图分析 当…

计算图:深度学习中的链式求导与反向传播引擎

在深度学习的世界中,计算图扮演着至关重要的角色。它不仅是数学计算的图形化表示,更是链式求导与反向传播算法的核心。本文将深入探讨计算图的基本概念、与链式求导的紧密关系及其在反向传播中的应用,旨在为读者提供一个全面而深入的理解。 计…

嵌入式5-7

练习:优化登录框,输入完用户名和密码后,点击登录,判断账户是否为 Admin 密码 为123456,如果判断成功,则输出登录成功,并关闭整个登录界面,如果登录失败,则提示登录失败&a…

JavaScript异步编程——03-Ajax传输json和XML

Ajax 传输 JSON JSON 的语法 JSON(JavaScript Object Notation):是 ECMAScript 的子集。作用是进行数据的交换。语法更为简洁,网络传输、机器解析都更为迅速。 语法规则: 数据在键值对中 数据由逗号分隔 花括号保存对象 方括号保存数组…

远程桌面连接不上,远程桌面连接不上的专业解决策略

在信息技术领域,远程桌面连接是一种非常重要的工具,它允许用户从任何地点、任何时间访问和操作远程计算机。然而,当远程桌面连接出现问题时,可能会严重影响工作效率。以下是一些可能导致远程桌面连接不上的原因以及相应的解决方案…

Verilog刷题笔记47

题目: From a 1000 Hz clock, derive a 1 Hz signal, called OneHertz, that could be used to drive an Enable signal for a set of hour/minute/second counters to create a digital wall clock. Since we want the clock to count once per second, the OneHer…

普洱茶泡多少茶叶才算淡茶?

普洱茶淡茶一般放几克茶叶,品深茶官网根据多年专业研究与实践结果,制定了淡茶冲泡标准。在冲泡普洱茶淡茶时,茶叶的投放量是关键因素之一。淡茶冲泡标准旨在保持茶汤的清爽口感,同时充分展现普洱茶的独特风味。 根据《品深淡茶冲…

AMEYA360详解:蔡司利用纳米探针技术探索半导体微观电学性能

半导体器件尺寸不断缩小和复杂度增加,纳米探针(Nanoprobing)技术成为解决微观电学问题和优化器件性能的重要工具,成为半导体失效分析流程中越来越重要的一环。 随着功率半导体的快速发展,其厂商也开始密切关注纳米探针技术在PN结特性分析和掺…

js宏任务微任务输出解析

第一种情况 setTimeout(function () {console.log(setTimeout 1) //11 宏任务new Promise(function (resolve) {console.log(promise 1) //12 同步函数resolve()}).then(function () {console.log(promise then) //13 微任务})})async function async1() {console.log(async1 s…

贪吃蛇大作战(C语言--实战项目)

朋友们!好久不见。经过一段时间的沉淀,我这篇文章来和大家分享贪吃蛇大作战这个游戏是怎么实现的。 (一).贪吃蛇背景了解及效果展示 首先相信贪吃蛇游戏绝对称的上是我们00后的童年,不仅是贪吃蛇还有俄罗斯⽅块&…

【数据库表的约束】

文章目录 一、NULL vs (空字符串)二、not null 和default三、列描述字段comment四、zerofill五、primary key 主键总结 一、NULL vs ‘’(空字符串) NULL和空字符串’’ NULL代表什么都没有。 空字符串’代表有,但串…

纯干货分享|源代码泄露的有效方法

企业的源代码怎么加密? 源代码防泄密的重点和方法到底是怎样的? 源代码开发环境复杂,涉及的开发软件、文件类型庞杂多变,究竟有什么源代码加密软件能够适应众多开发软件而不影响原有的工作效率? 相信这是很多IT管理…

如何用TONGYILingma进行AI辅助编程?

通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云的云服务使用场景调优&#xff0c…

面试笔记——工厂模式(简单工厂、工厂方法模式、抽象工厂模式)

场景需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore&#xff09…

软件设计师-应用技术-UML建模题3

基础知识及技巧: 1. 用例图: 1.1 考点: 题干里面有关项目的详细描述,完整用例图中的某些参与者和某些用来扣掉,根据题干内容和已有用例图补充。根据题干,分析用例图之间的关系。 1.2 基础知识&#xff…

Linux进程通信-信号

信号概念 信号是 Linux 进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号 可以导致一个正在运行的进程被另一个正在运行的异…

通过 Java 操作 redis -- String 基本命令

关于 redis String 类型的相关命令推荐看 Redis - String 字符串 要想通过 Java 操作 redis,首先要连接上 redis 服务器,推荐看通过 Java 操作 redis -- 连接 redis 本博客只介绍了一小部分常用的命令,其他的命令根据上面推荐的博客也能很简单…