怎么做网站维护,怎么增加网站的关键词库,wordpress白屏问题,网站空间上传工具首先讲在前面#xff0c;介绍一些背景
RAG#xff08;Retrieval-Augmented Generation#xff0c;检索增强生成#xff09;
是一种结合了信息检索与语言生成模型的技术#xff0c;通过从外部知识库中检索相关信息#xff0c;并将其作为提示输入给大型语言模型#xff…首先讲在前面介绍一些背景
RAGRetrieval-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, modeltext-embedding-ada-002):response client.embeddings.create(inputtext, modelmodel)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]})输出结果
最相似的文档: 土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判通过上述过程可以有效地根据用户提出的问题找到相关的向量和对应的信息。
正文如下开始旅程