大型语言模型 (LLM) 向用户和组织展示了巨大的潜力;它们的强大功能和生成能力使它们最近广受欢迎并被广泛接受。LLM 面临的一些缺点是无法以上下文感知的方式生成或响应用户给出的提示,听起来非常通用和开放,或者有时响应的信息已经过时。如果正确实施,检索增强生成 (RAG) 已被用于解决这一挑战。
RAG(检索增强生成)最近已成为利用公开可用的 LLM 的最流行方式之一。RAG 提高了 LLM 生成的响应质量,这就是为什么许多组织在其软件系统中实施 LLM 时采用 RAG 的原因。
对能够构建高度优化的 RAG 系统以满足组织需求的专业人员的需求日益增长。根据 Grandview 的研究,去年(2023 年)RAG 市场规模估计为 10.427 亿美元;有预测称,从 2024 年到 2030 年,该领域的复合年增长率将达到 44.7%,这是由于自然语言处理 (NLP) 领域的快速发展以及对智能 AI 系统的需求。
RAG 实施的另一面是 RAG 优化;这是通过使信息检索更准确来提高 RAG 系统性能的过程,从而提高整体性能。在本教程的后面部分,您将学习几种实现此目的的技术。
阅读本文的先决条件
要完全理解这篇技术文章,您应该熟悉 LLM 及其工作原理。您还应该熟悉 Python 编程,因为本文的代码、片段和实现都是用 Python 编写的。
了解 RAG 及其组件
RAG 只是通过引用训练数据之外的外部权威知识库来优化 LLM 生成的输出信息。此权威知识库是包含特定于特定组织或领域的数据的附加信息。
LLM 通常接受大量数据的训练,这使它们能够执行语言翻译和生成问题答案等任务。
RAG 利用 LLM 的生成功能来生成自定义、机构和特定领域的响应。因此,RAG 为公开可用的 LLM 添加了额外的功能。这节省了从头开始构建自定义 LLM 以实现预期目的(例如,为企业构建聊天机器人)所需的大量时间和财务影响。
让我带您了解 RAG 系统的高级工作流程:
-
用户从前端界面发出提示
-
然后,RAG 模型确保根据收到的提示从权威知识库中检索到正确的信息
-
现在,从权威知识库检索到的信息用于由 LLM 生成响应,并发送回客户端
这样,您就会看到提示不会直接进入 LLM,就像没有 RAG 实现那样。尽管如此,仍会从权威知识库中检索与提示语义同步的信息。现在,LLM 的生成功能用于生成用户可以看到、理解和欣赏的响应。
RAG 加上 LLM 等于魔法。
RAG 的应用
由于其对自然语言处理领域的价值和影响,RAG 已在不同行业和用例中得到广泛采用和适用。甚至非技术人员也开始将 RAG 系统集成到他们的业务中,以提高生产力。
RAG 的一些应用范围从内容创建和摘要到对话代理和聊天机器人。功能性 RAG 系统通常由三个组件组成,它们是:
-
检索组件
-
增强组件
-
生成组件
检索组件
此组件处理从外部权威知识库检索相关信息。它确保检索到的信息或段落与给出的提示最密切相关。可以使用多种机制,包括基于关键字的搜索、语义相似性搜索和基于神经网络的检索方法。
可以根据适合项目的方案实施其中任何一种。
以下代码片段显示了如何在 RAG 系统中从外部知识库进行检索。
import faiss # This handles similarity search
import numpy as np
from transformers import AutoTokenizer, AutoModel
import torch
# A pre-trained embedding model (e.g., BERT) is loaded
model_name = "sentence-transformers/all-MiniLM-L6-v2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# Function to encode text into embeddings
def text_to_embedding(text):
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True)
with torch.no_grad():
embeddings = model(**inputs).last_hidden_state.mean(dim=1) # Mean pooling
return embeddings.cpu().numpy()
# Sample document corpus also known as the
# authoritative knowledge base, in this example it is for a # bakery shop
documents = [
"We are open for 6 days of the week, on Monday, Tuesday, Wednesday, Thursday, Friday, Saturday",
"The RAG system uses a retrieval component to fetch information.",
"We are located in Lagos, our address is 456 computer Lekki-Epe Express way.",
"Our CEO is Mr Austin, his phone number is 09090909090"]
# Encode documents and store in FAISS index
dimension = 384 # Set embedding dimension based on #the model used
index = faiss.IndexFlatL2(dimension) # Create FAISS index
# Create document embeddings and add to FAISS index
doc_embeddings = np.vstack([embed_text(doc) for doc in documents])
index.add(doc_embeddings)
# Query Given it by a user
query = "Where is the location of your business?"
query_embedding = embed_text(query)
# Retrieve top 2 documents based on similarity
top_k = 2
_, indices = index.search(query_embedding, top_k)
retrieved_docs = [documents[idx] for idx in indices[0]]
print("Your Query:", query)
print("Retrieved Documents:", retrieved_docs)
上面的代码片段为您提供了实用的信息,并让您更详细地了解 RAG 检索过程的内部工作原理。
发生了三件大事:
-
嵌入创建:文档或权威知识库以及传递给它的查询被嵌入。不要太担心“嵌入”的新概念;您将在本文的后面部分详细了解它
-
使用 FAISS 进行索引:嵌入的文档存储在 FAISS 索引中,从而实现快速相似性搜索
-
检索:根据余弦相似度检索与用户传递的查询最相似的前 k 个文档
增强组件
检索过程成功完成后,增强过程会为检索到的信息添加更多与用户传递的提示相关的上下文含义,使其更加流畅。
生成组件
生成过程确保基于增强信息生成自然语言。它允许人类理解检索到的信息,这可以通过使用 GPT-4、GPT-5、BERTH 等预先训练的 LLM 来实现。
下面的代码片段提供了一个完整的 RAG 管道,展示了使用 Pytorch 的 RAG 系统的检索、增强和生成过程。
from sentence_transformers import SentenceTransformer
from transformers import T5ForConditionalGeneration, T5Tokenizer
import faiss
import torch
# Load Sentence Transformer model for embeddings (using PyTorch)
embed_model = SentenceTransformer('all-MiniLM-L6-v2')
# Sample documents for retrieval
documents = [
"We are open for 6 days of the week, on Monday, Tuesday, Wednesday, Thursday, Friday, Saturday",
"The RAG system uses a retrieval component to fetch information.",
"We are located in Lagos, our address is 456 computer Lekki-Epe Express way.",
"Our CEO is Mr. Austin, his phone number is 09090909090"
]
# Embed the documents
doc_embeddings = embed_model.encode(documents)
# Use FAISS for fast similarity search
dimension = doc_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(doc_embeddings)
# Load T5 model and tokenizer for the generation component
tokenizer = T5Tokenizer.from_pretrained("t5-small")
model = T5ForConditionalGeneration.from_pretrained("t5-small")
# Define a query
query = "How does a RAG system work in machine learning?"
# Retrieve top-k relevant documents
query_embedding = embed_model.encode([query])
top_k = 2
_, indices = index.search(query_embedding, top_k)
retrieved_docs = [documents[idx] for idx in indices[0]]
# Concatenate retrieved docs to augment the query
augmented_query = query + " " + " ".join(retrieved_docs)
print("Augmented Query:", augmented_query)
# Prepare input for T5 model
input_text = f"answer_question: {augmented_query}"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
# Generate answer using T5
with torch.no_grad():
output = model.generate(input_ids, max_length=50, num_beams=5, early_stopping=True)
answer = tokenizer.decode(output[0], skip_special_tokens=True)
print("Generated Answer:", answer)
什么是 RAG 嵌入
RAG 中的嵌入是文本的密集向量表示;这与将单词表示为高维稀疏向量的独热编码不同;嵌入将这些信息压缩为低维和连续向量,捕获单词之间的语义关系,使模型理解上下文。
因此,嵌入基本上涉及将文本转换为能够理解语义关系的低维向量表示。
您在 RAG 系统中嵌入了什么?您正在嵌入用户传递的提示和要检索的自定义文档/权威领域特定知识。这样做是为了让信息检索在语义上与传递的提示一致。
下一步是在开发 RAG 系统并选择 LLM(例如 GPT-4)时选择检索模型。一些流行的模型是 DPR(密集段落检索器)、Sentence-BERT 和 RoBERTa;这些模型为您处理嵌入。之后,您的自定义文档将被处理和集成以供检索。
因此,您发送提示。检索模型嵌入提示,捕获上下文和语义关系。它从嵌入式数据库中检索最相关的信息。它将其传递给 LLM,LLM 利用其生成能力生成与检索到的数据一致的文本。
优化 RAG 中嵌入的必要性
在 RAG 系统中,嵌入优化在确保从知识源或权威库检索到的信息/数据的质量和相关性方面起着至关重要的作用,就像之前讨论嵌入是什么时所解释的那样;传递给模型的提示被转换为嵌入,这些嵌入在从权威知识库检索之前捕获用户提示的语义含义。
如果嵌入得到适当优化,它们可以通过检索与用户提示非常接近的正确信息来提高模型的整体性能。这就是为什么嵌入优化对 RAG 系统至关重要。
此外,根据 RAG 系统的实现,会使用预先训练的嵌入模型。一些常用的嵌入模型是:
-
DPR(密集段落检索器)
-
Sentence-BERT
-
RoBERTa
-
infloat/e5-large-v2
这些预先训练的嵌入模型可以为您处理嵌入(它们将您的提示转换为嵌入或数字表示),但这需要权衡;由于它们是在大型通用数据集中训练的,因此它们可能无法完全理解自定义或域应用程序。这就是为什么您必须微调或优化嵌入模型的原因。
在 RAG 中嵌入调优的技术
有多种方法可以实现嵌入调整;下面是一些实现嵌入调整的流行技术;
1. 通过适应领域
专门针对特定领域或主题进行调整的嵌入可以产生很大的不同。例如,在相关数据上训练嵌入可以使 RAG 模型在法律或医疗保健等领域更加精确,因为这些领域的语言具有独特的术语和细微差别。这样,当用户提问时,他们会得到与上下文产生共鸣的答案。
2. 使用对比学习
将对比学习视为帮助模型“磨练”相似和不相似的内容。通过教导模型将相关的查询和答案更紧密地分组在一起(并将不相关的查询和答案分开),您可以让模型更容易返回对所提问题有意义的结果。
3. 添加来自真实数据的信号
添加一些监督数据(如用户反馈或标记示例)可以使嵌入更接近人们的期望。这有助于引导模型找到重要的模式,例如识别哪些响应往往会达到目标,哪些不会。模型从真实用户交互中学习得越多,它就越能提供有用的响应。
4. 自监督学习
自监督学习是处理标记数据较少的情况的绝佳选择。此方法在数据本身中发现模式,这有助于为模型构建基础,而无需进行太多手动标记。它非常适合需要保持灵活性的通用 RAG 系统。
5. 结合嵌入以获得更丰富的响应
有时,混合多个嵌入会产生奇效。例如,将通用嵌入与针对特定领域进行微调的嵌入相结合可以创建一个全面的模型,该模型可以理解一般和小众问题。如果您要处理广泛的主题,这种方法尤其有用。
6. 保持嵌入平衡
正则化技术(如 dropout 或 triplet loss)可帮助模型避免“卡”在某些单词或想法上,使其理解范围足够广泛,以处理不同的查询。这可确保模型的响应范围不会太窄,从而有助于其保持对新问题或意外问题的灵活性。
7. 用硬否定挑战模型
硬否定足够接近,但仍然不正确。在训练中添加这些可以鼓励模型完善其理解,尤其是在处理细微差异时。这就像给它所需的心理重复,以便更好地在几乎正确的选项中找到正确答案。
8. 使用反馈循环进行持续改进
通过主动学习,您可以设置一个反馈循环,其中将不确定或具有挑战性的答案标记为人工审核。这些评论反馈到模型中,以随着时间的推移不断提高其准确性,这对于不断发展或具有许多复杂细微差别的领域非常有用。
9. 通过跨编码器调优进行更深入的研究
对于更细微的查询(尤其是需要问题和答案紧密匹配的查询),跨编码器方法可以提供帮助。跨编码器直接评估查询和文档对,因此模型会将它们一起“读取”,而不是将它们视为单独的实体。这通常会在精确匹配是关键的领域带来更深入的理解。
通过这种方式对嵌入进行微调,RAG 模型可以提供更自然、更切题的响应。简而言之,就是要让 AI 成为更好的倾听者和响应者,为用户提供切中要害的答案。
评估 RAG 嵌入质量的方法
评估 RAG 系统嵌入的质量至关重要,因为它可以作为一个指标,表明它是否可以检索相关且上下文正确的数据,无论是否经过优化。
下面列出了用于评估 RAG 中嵌入质量的方法:
-
余弦相似度和最近邻评估:此方法计算查询嵌入与其相关文档之间的余弦相似度
-
平均倒数排名 (MRR) 和平均准确率 (MAP):在此方法中,当给出查询时,检索到的文档将根据相关性进行排名,并计算 MRR 或 MAP 分数
-
嵌入聚类和可视化:这涉及使用 t-SNE 或 UMAP 等技术将嵌入投影到 2D 或 3D 空间中,以可视化查询和文档如何聚类在一起的相似性
-
人工判断和反馈循环:这涉及使用人工根据提示评估检索到的信息的质量并提供反馈以进行可能的改进
-
特定领域的评估指标:此方法可确保嵌入有效地针对特定领域的细微差别,因为这会对应用于此类专业学科的 RAG 系统的性能产生负面影响
嵌入 RAG 调优的挑战
尽管嵌入调整会对 RAG 系统的性能产生巨大影响,但有时实施起来非常具有挑战性。它不是直接的,有时需要迭代才能达到所需的性能。
其中一些挑战包括:
-
成本:训练和微调嵌入的计算成本,尤其是在处理大型数据集时
-
过拟合:模型可能对训练数据过于熟悉。如果向其传递除精确训练数据之外的提示,则无法检索正确的信息
-
难以获得高质量数据:由于模型严重依赖于用于训练的数据,如果没有使用有关特定领域或细分市场的足够高质量和准确的数据来训练模型,则模型可能会出现偏差且性能不佳
-
管理领域趋势的变化:由于大多数领域的动态性质,总是有新的更新和进步,因此必须经常重新训练模型以避免过时,而这并不容易跟上
写在最后的话
在开发需要高精度的系统时,RAG 优化至关重要,因为用于开发 RAG 系统的嵌入模型主要用于通用应用程序。嵌入调整对于提高 RAG 系统的检索精度以获得更好的性能是必要的。
在开发 RAG 模型时实施上述任何一种检索技术后,正确的做法是测试新开发的 RAG 模型的性能,以了解它对传递给它的某些提示的响应程度;如果它表现得非常好;满足您的期望和要求,那对您来说很好,您在开发 RAG 系统方面做得很好。如果在向它传递某些提示时它没有给您所需的响应,请不要担心;您仍然可以通过进一步优化和微调来提高模型的性能。谢谢阅读。
如何学习AI大模型?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业
?”“谁的饭碗又将不保了?
”等问题热议不断。
不如成为「掌握AI工具的技术人
」,毕竟AI时代,谁先尝试,谁就能占得先机!
想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高
那么针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料
分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈
学习路线
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓