微信扫码
添加专属顾问
探索13种顶级RAG技术,从基础优化到高级应用,助你构建更智能的AI问答系统。 核心内容: 1. 基本RAG系统的三大局限性分析 2. 高级RAG技术在索引、检索和生成阶段的优化方案 3. 实际应用案例与开源工具实现方法
AI 能否大规模生成真正相关的答案?我们如何确保它理解复杂的多轮对话?我们如何防止它轻率地吐出错误的事实?这些都是现代 AI 系统面临的挑战,尤其是使用 RAG 构建的系统。RAG 将文档检索的强大功能与语言生成的流畅性相结合,使系统能够基于上下文感知、基于事实的响应来回答问题。虽然基本的 RAG 系统在处理简单任务时表现良好,但在处理复杂查询、幻听以及长时间交互中的上下文记忆时,它们往往会遇到问题。这时,高级 RAG 技术就派上用场了。
在本篇博文中,我们将探讨如何升级你的 RAG 流水线,从而增强堆栈的每个阶段:索引、检索和生成。我们将逐步介绍一些强大的方法(并附上实际代码),这些方法可以帮助你提升相关性、降低噪音并扩展系统性能——无论你是构建医疗助理、教育导师还是企业知识机器人。
让我们看一下基本 RAG 框架:
这个 RAG 系统架构展示了向量存储中块嵌入的基本存储方式。第一步是加载文档,然后使用各种分块技术对其进行拆分或分块,最后使用嵌入模型进行嵌入,以便 LLM 能够轻松理解。
这张图描绘了RAG的检索和生成步骤:用户提出一个问题,然后我们的系统通过搜索 Vector 库,根据该问题提取结果。检索到的内容连同问题一起传递给 LLM,LLM 提供结构化的输出。
基本的 RAG 系统有明显的局限性,尤其是在苛刻的情况下。
幻觉:幻觉是一个主要问题。该模型创建的内容在事实上是错误的,或者没有源文档的支持。这会损害可靠性,尤其是在医学或法律等精确性至关重要的领域。
缺乏领域特异性:标准 RAG 模型难以处理专业主题。如果不根据领域的具体细节调整检索和生成过程,系统可能会发现不相关或不准确的信息。
复杂对话:基本的 RAG 系统难以处理复杂的查询或多轮对话。它们经常在交互过程中丢失上下文信息,导致答案不连贯或不完整。RAG 系统必须能够处理日益复杂的查询。
因此,我们将逐一介绍 RAG 堆栈的高级 RAG 技术,即索引、检索和生成。我们将讨论如何使用开源库和资源进行改进。无论你构建的是医疗聊天机器人、教育机器人还是其他应用程序,这些高级 RAG 技术都具有普遍适用性。它们将改进大多数 RAG 系统。
让我们从高级 RAG 技术开始吧!
良好的索引对于任何 RAG 系统都至关重要。第一步涉及如何导入、拆分和存储数据。让我们探索索引数据的方法,重点介绍如何索引和分块文本以及使用元数据。
Hierarchical Navigable Small Worlds (HNSW)是一种在大型数据集中查找相似项的有效算法。它使用基于图的结构化方法,帮助快速定位近似最近邻 (ANN) 。
邻近图:HNSW 构建了一个图,其中每个点都连接到附近的点。这种结构可以实现高效的搜索。
层次结构:该算法将点组织成多层。顶层连接较远的点,而较低层连接较近的点。这种设置加快了搜索过程。
贪婪路由:HNSW 使用贪婪算法来寻找邻居。它从高阶点开始,然后移动到最近的邻居,直到达到局部最小值。这种方法减少了查找相似项目所需的时间。
HNSW 的工作包括几个关键部分:
HNSW 的设计使其能够快速准确地找到相似的项目。这使得它成为需要在大型数据集中高效搜索的任务的理想选择。
该图描绘了一个简化的 HNSW 搜索:算法从“入口点”(蓝色)开始,将图导航至“查询向量”(黄色)。“最近邻”(条纹)是通过基于邻近度的边遍历来识别的。这说明了高效近似最近邻搜索的图导航核心概念。
请按照以下步骤使用 FAISS 实现分层可导航小世界 (HNSW) 算法。本指南包含示例输出,用于说明该过程。
首先,定义 HNSW 索引的参数。需要指定向量的大小以及每个节点的邻居数量。
import faissimport numpy as np# Set up HNSW parametersd = 128 # Size of the vectorsM = 32 # Number of neighbors for each nodel
使用上面定义的参数创建 HNSW 索引。
# Initialize the HNSW indexindex = faiss.IndexHNSWFlat(d, M)
在将数据添加到索引之前,请设置 efConstruction 参数。此参数控制算法在构建索引时考虑的邻居数量。
efConstruction = 200 # Example value for efConstructionindex.hnsw.efConstruction = efConstruction
在此示例中,生成要索引的随机数据。其中,“xb”表示要索引的数据集。
# Generate random dataset of vectorsn = 10000 # Number of vectors to indexxb = np.random.random((n, d)).astype('float32')# Add data to the indexindex.add(xb) # Build the index建立索引后,设置 efSearch 参数。此参数影响搜索过程。
efSearch = 100 # Example value for efSearchindex.hnsw.efSearch = efSearch
现在,你可以搜索查询向量的最近邻。这里,“xq”表示查询向量。
# Generate random query vectorsnq = 5 # Number of query vectorsxq = np.random.random((nq, d)).astype('float32')# Perform a search for the top k nearest neighborsk = 5 # Number of nearest neighbors to retrievedistances, indices = index.search(xq, k)# Output the resultsprint("Query Vectors:\n", xq)print("\nNearest Neighbors Indices:\n", indices)print("\nNearest Neighbors Distances:\n", distances)查询向量: [[0.12345678 0.23456789 ... 0.98765432] [0.23456789 0.34567890 ... 0.87654321] [0.34567890 0.45678901 ... 0.76543210] [0.45678901 0.56789012 ... 0.65432109] [0.56789012 0.67890123 ... 0.54321098]]最近邻索引: [[123 456 789 101 112] [234 567 890 123 134] [345 678 901 234 245] [ 456 789 012 345 356] [ 567 890 123 456 467]]最近邻距离: [[0.123 0.234 0.345 0.456 0.567] [0.234 0.345 0.456 0.567 0.678] [0.345 0.456 0.567 0.678 0.789] [0.456 0.567 0.678 0.789 0.890] [0.567 0.678 0.789 0.890 0.901]]
这种方法根据含义而非固定大小划分文本。每个块代表一段连贯的信息。我们计算句子嵌入之间的余弦距离。如果两个句子语义相似(低于阈值),则将它们归入同一块。这会根据内容的含义创建不同长度的块。
优点:创建更连贯、更有意义的块,改善检索。
缺点:需要更多计算(使用基于 BERT 的编码器)。
from langchain_experimental.text_splitter import SemanticChunkerfrom langchain_openai.embeddings import OpenAIEmbeddingstext_splitter = SemanticChunker(OpenAIEmbeddings())docs = text_splitter.create_documents([document])print(docs[0].page_content)
这段代码使用了 LangChain 的 SemanticChunker,它使用 OpenAI 嵌入将文档拆分为语义相关的块。它创建的文档块旨在捕获连贯的语义单元,而不是任意的文本片段。
这种先进的方法使用语言模型从文本中创建完整的语句。每个块在语义上都是完整的。语言模型(例如,一个拥有 70 亿个参数的模型)负责处理文本。它将文本分解成各自有意义的语句。然后,该模型将这些语句组合成块,在完整性和上下文之间取得平衡。这种方法计算量很大,但准确率很高。
优点:适应文本的细微差别并创建高质量的块。
缺点:计算成本高;可能需要针对特定用途进行微调。
async def generate_contexts(document, chunks): asyncdef process_chunk(chunk): response = await client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "Generate a brief context explaining how this chunk relates to the full document."}, {"role": "user", "content": f"<document> \n{document} \n</document> \nHere is the chunk we want to situate within the whole document \n<chunk> \n{chunk} \n</chunk> \nPlease give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk. Answer only with the succinct context and nothing else."} ], temperature=0.3, max_tokens=100 ) context = response.choices[0].message.content returnf"{context} {chunk}" # Process all chunks concurrently contextual_chunks = await asyncio.gather( *[process_chunk(chunk) for chunk in chunks] ) return contextual_chunks此代码片段利用 LLM(可能是 OpenAI 的 DeepSeek,通过 client.chat.completions.create 调用)为文档的每个块生成上下文信息。它异步处理每个块,促使 LLM 解释该块与完整文档的关系。最后,它返回一个原始块列表,并在列表前面添加了生成的上下文,从而有效地丰富了这些块,从而改进了搜索检索。
元数据提供额外的上下文信息,从而提高检索的准确性。通过添加日期、患者年龄和既往病史等元数据,你可以在搜索过程中过滤掉不相关的信息。过滤功能可以缩小搜索范围,提高检索效率和相关性。索引时,请将元数据与文本一起存储。
例如,医疗保健数据包括患者记录中的年龄、就诊日期和具体病情。使用这些元数据来筛选搜索结果,确保系统只检索相关信息。例如,如果查询与儿童相关,则过滤掉 18 岁以上患者的记录。这可以减少噪音并提高相关性。
块 #1
Source Metadata: {'id': 'doc:1c6f3e3f7ee14027bc856822871572dc:26e9aac7d5494208a56ff0c6cbbfda20', 'source': 'https://plato.stanford.edu/entries/goedel/'}源文本:
2.2.1 The First Incompleteness TheoremIn his Logical Journey (Wang 1996) Hao Wang published thefull text of material Gödel had written (at Wang’s request)about his discovery of the incompleteness theorems. This material hadformed the basis of Wang’s “Some Facts about KurtGödel,” and was read and approved by Gödel:
块 #2
Source Metadata: {'id': 'doc:1c6f3e3f7ee14027bc856822871572dc:d15f62c453c64072b768e136080cb5ba', 'source': 'https://plato.stanford.edu/entries/goedel/'}源文本:
The First Incompleteness Theorem provides a counterexample tocompleteness by exhibiting an arithmetic statement which is neitherprovable nor refutable in Peano arithmetic, though true in thestandard model. The Second Incompleteness Theorem shows that theconsistency of arithmetic cannot be proved in arithmetic itself. ThusGödel’s theorems demonstrated the infeasibility of theHilbert program, if it is to be characterized by those particulardesiderata, consistency and completeness.
在这里,我们可以看到元数据包含块的唯一 ID 和来源,这为块提供了更多上下文并有助于轻松检索。
你不会总是拥有大量的元数据,但使用像 GLiNER 这样的模型可以动态生成元数据!GLiNER 在摄取过程中标记和标记块以创建元数据。
为每个块添加标签以供 GLiNER 识别。如果找到标签,它会对其进行标记。如果没有匹配的标签,则不会生成标签。 通常情况下效果良好,但对于小众数据集可能需要进行微调。这提高了检索准确率,但增加了一个处理步骤。GLiNER 可以解析传入的查询,并将其与元数据标签进行匹配以进行过滤。
GLiNER:使用双向 Transformer 进行命名实体识别的通用模型演示。
这些技术构建了强大的 RAG 系统,能够高效地从大型数据集中检索数据。分块和元数据的使用取决于数据集的具体需求和特性。
现在,我们来关注一下 RAG 中的“R”。如何改进向量数据库的检索?这指的是检索与查询相关的所有文档。这大大提高了 LLM 生成高质量结果的几率。以下是一些技巧:
结合向量搜索(查找语义含义)和关键词搜索(查找精确匹配)。混合搜索兼具两者的优势。在人工智能领域,许多术语都是特定的关键词:算法名称、技术术语、LLM (LLM)。单独的向量搜索可能会遗漏这些术语。关键词搜索可以确保这些重要术语得到考虑。结合两种方法可以创建更完整的检索流程。这些搜索同时运行。
使用加权系统对结果进行合并和排序。例如,使用 Weaviate,你可以调整 alpha 参数来平衡向量和关键词结果。这样就可以创建一个合并的排序列表。
优点:平衡精度和召回率,提高检索质量。
缺点:需要仔细调整重量。
from langchain_community.retrievers import WeaviateHybridSearchRetrieverfrom langchain_core.documents import Documentretriever = WeaviateHybridSearchRetriever( client=client, index_name="LangChain", text_key="text", attributes=[], create_schema_if_missing=True,)retriever.invoke("the ethical implications of AI")此代码初始化了一个 WeaviateHybridSearchRetriever,用于从 Weaviate 矢量数据库中检索文档。它将矢量搜索和关键字搜索结合到了 Weaviate 的混合检索功能中。最后,它执行了一个名为“the ethical implications of AI”的查询,并使用此混合方法检索相关文档。
认识到人类查询可能并非数据库或语言模型的最佳选择。使用语言模型重写查询可以显著提高检索效果。
向量数据库重写:这将用户的初始查询转换为数据库友好的格式。例如,“什么是人工智能代理以及为什么它们是 2025 年的下一个大事件”可以转换为“人工智能代理是 2025 年的重大事件”。我们可以使用任何 LLM 来重写查询,以便它能够捕捉查询的重要方面。
语言模型的提示重写:这涉及自动创建提示以优化与语言模型的交互。这可以提高结果的质量和准确性。我们可以使用 DSPy 等框架或任何 LLM 来重写查询。这些重写的查询和提示确保搜索过程检索到相关文档,并有效地提示语言模型。
查询措辞的细微变化可能会导致检索结果不同。如果嵌入不能准确反映数据的含义,这个问题可能会更加突出。为了应对这些挑战,通常会采用快速工程或调优的方法,但这个过程可能非常耗时。
MultiQueryRetriever简化了这项任务。它使用大型语言模型 (LLM),基于单个用户输入从不同角度创建多个查询。对于每个生成的查询,它会检索一组相关文档。MultiQueryRetriever通过整合所有查询的独特结果, 提供了更广泛的潜在相关文档集。这种方法提高了找到有用信息的机会,而无需进行大量的手动调整。
from langchain_openai import ChatOpenAIchatgpt = ChatOpenAI(model_name="gpt-4o", temperature=0)from langchain.retrievers.multi_query import MultiQueryRetriever# Set logging for the queriesimport loggingsimilarity_retriever3 = chroma_db3.as_retriever(search_type="similarity", search_kwargs={"k": 2})mq_retriever = MultiQueryRetriever.from_llm( retriever=similarity_retriever3, llm=chatgpt, include_original=True)logging.basicConfig()# so we can see what queries are generated by the LLMlogging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)query = "what is the capital of India?"docs = mq_retriever.invoke(query)docs此代码使用 LangChain 构建了一个多查询检索系统。它会生成输入查询(“what is the capital of India?”)的多个变体。然后,这些变体会通过相似性检索器查询 Chroma 向量数据库 (chroma_db3),旨在扩大搜索范围并捕获各种相关文档。MultiQueryRetriever 最终会聚合并返回检索到的文档。
输出
[Document(metadata={'article_id': '5117', 'title': 'New Delhi'}, page_content='New Delhi () is the capital of India and a union territory of the megacity of Delhi. It has a very old history and is home to several monuments where the city is expensive to live in. In traditional Indian geography it falls under the North Indian zone. The city has an area of about 42.7\xa0km. New Delhi has a population of about 9.4 Million people.'), Document(metadata={'article_id': '4062', 'title': 'Kolkata'}, page_content="Kolkata (spelled Calcutta before 1 January 2001) is the capital city of the Indian state of West Bengal. It is the second largest city in India after Mumbai. It is on the east bank of the River Hooghly. When it is called Calcutta, it includes the suburbs. This makes it the third largest city of India. This also makes it the world's 8th largest metropolitan area as defined by the United Nations. Kolkata served as the capital of India during the British Raj until 1911. Kolkata was once the center of industry and education. However, it has witnessed political violence and economic problems since 1954. Since 2000, Kolkata has grown due to economic growth. Like other metropolitan cities in India, Kolkata struggles with poverty, pollution and traffic congestion."), Document(metadata={'article_id': '22215', 'title': 'States and union territories of India'}, page_content='The Republic of India is divided into twenty-eight States,and eight union territories including the National Capital Territory.')]上下文压缩有助于提高检索文档的相关性。这主要通过两种方式实现:
提取相关内容:删除检索到的文档中与查询无关的部分。这意味着只保留回答问题的部分。
过滤不相关文档:排除与查询无关的文档,而不改变文档本身的内容。
为了实现这一点,我们可以使用 LLMChainExtractor,它会审查最初返回的文档,并仅提取与查询相关的内容。它也可能删除完全不相关的文档。
以下是使用 LangChain 实现此目的的方法:
from langchain.retrievers import ContextualCompressionRetrieverfrom langchain.retrievers.document_compressors import LLMChainExtractorfrom langchain_openai import ChatOpenAI# Initialize the language modelchatgpt = ChatOpenAI(model_name="gpt-4o", temperature=0)# Set up a similarity retrieversimilarity_retriever = chroma_db3.as_retriever(search_type="similarity", search_kwargs={"k": 3})# Create the extractor to get relevant contentcompressor = LLMChainExtractor.from_llm(llm=chatgpt)# Combine the retriever and the extractorcompression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=similarity_retriever)# Example queryquery = "What is the capital of India?"docs = compression_retriever.invoke(query)print(docs)输出:
[Document(metadata={'article_id': '5117', 'title': 'New Delhi'}, page_content='New Delhi is the capital of India and a union territory of the megacity of Delhi.')]对于不同的查询:
query = "What is the old capital of India?"docs = compression_retriever.invoke(query)print(docs)
输出
[Document(metadata={'article_id': '4062', 'title': 'Kolkata'}, page_content='Kolkata served as the capital of India during the British Raj until 1911.')]LLMChainFilter 提供了一种更简单但有效的文档过滤方法。它使用 LLM 链来决定哪些文档需要保留、哪些文档需要丢弃,且不会改变文档的内容。
以下是实现过滤器的方法:
from langchain.retrievers.document_compressors import LLMChainFilter# Set up the filter_filter = LLMChainFilter.from_llm(llm=chatgpt)# Combine the retriever and the filtercompression_retriever = ContextualCompressionRetriever(base_compressor=_filter, base_retriever=similarity_retriever)# Example queryquery = "What is the capital of India?"docs = compression_retriever.invoke(query)print(docs)
输出:
[Document(metadata={'article_id': '5117', 'title': 'New Delhi'}, page_content='New Delhi is the capital of India and a union territory of the megacity of Delhi.')]对于另一个查询:
query = "What is the old capital of India?"docs = compression_retriever.invoke(query)print(docs)
输出:
[Document(metadata={'article_id': '4062', 'title': 'Kolkata'}, page_content='Kolkata served as the capital of India during the British Raj until 1911.')]这些策略通过关注相关内容来帮助优化检索过程。“LLMChainExtractor”仅提取文档的必要部分,而“LLMChainFilter”则决定保留哪些文档。这两种方法都提高了检索信息的质量,使其与用户的查询更加相关。
预先训练好的嵌入模型是一个不错的开始。根据你的数据对这些模型进行微调可以显著提升检索效果。
选择合适的模型:对于医学等专业领域,请选择基于相关数据预训练的模型。例如,你可以使用 MedCPT 系列查询和文档编码器,这些编码器已基于 PubMed 搜索日志中的 2.55 亿个查询-文章对进行大规模预训练。
使用正样本对和负样本对进行微调:收集你自己的数据,并创建相似(正样本)和不相似(负样本)的样本对。对模型进行微调以理解这些差异。这有助于模型学习特定领域的关系,从而改进检索。
优点:提高检索性能。
缺点:需要精心创建的训练数据。
这些技术的组合构建了一个强大的检索系统。这提高了提供给 LLM 的对象的相关性,从而提升了生成质量。
最后,我们来讨论一下如何提高语言模型 (LLM) 的生成质量。目标是为 LLM 提供尽可能与提示相关的上下文。不相关的数据可能会引发幻觉。以下是一些提高生成质量的技巧:
Autocut 会过滤掉从数据库中检索到的不相关信息,从而防止LLM 被误导。
检索和评分相似度:进行查询时,将检索具有相似度分数的多个对象。
识别并剔除:使用相似度得分找到一个得分显著下降的临界点。排除超出此点的对象。这确保只向 LLM 提供最相关的信息。例如,如果你检索了六个对象,那么在第四个之后,得分可能会急剧下降。通过查看变化率,你可以确定要排除哪些对象。
from langchain_openai import OpenAIEmbeddingsfrom langchain_pinecone import PineconeVectorStorefrom typing import Listfrom langchain_core.documents import Documentfrom langchain_core.runnables import chainvectorstore = PineconeVectorStore.from_documents( docs, index_name="sample", embedding=OpenAIEmbeddings())@chaindef retriever(query: str): docs, scores = zip(*vectorstore.similarity_search_with_score(query)) for doc, score in zip(docs, scores): doc.metadata["score"] = score return docs result = retriever.invoke("dinosaur")result此代码片段使用 LangChain 和 Pinecone 执行相似性搜索。它使用 OpenAI 嵌入来嵌入文档,将其存储在 Pinecone 向量存储中,并定义一个检索器函数。检索器搜索与给定查询(“dinosaur”)相似的文档,计算相似度分数,并将这些分数添加到文档元数据中,然后返回结果。
[Document(page_content='In her second book, Dr. Simmons delves deeper into the ethical considerations surrounding AI development and deployment. It is an eye-opening examination of the dilemmas faced by developers, policymakers, and society at large.', metadata={}), Document(page_content='A comprehensive analysis of the evolution of artificial intelligence, from its inception to its future prospects. Dr. Simmons covers ethical considerations, potentials, and threats posed by AI.', metadata={}), Document(page_content="In his follow-up to 'Symbiosis', Prof. Sterling takes a look at the subtle, unnoticed presence and influence of AI in our everyday lives. It reveals how AI has become woven into our routines, often without our explicit realization.", metadata={}), Document(page_content='Prof. Sterling explores the potential for harmoniouscoexistence between humans and artificial intelligence. The book discusses how AI can be integrated into society in a beneficial and non-disruptivemanner.', metadata={})]我们可以看到,它还给出了相似度分数,我们可以根据阈值进行截断。
重新排序使用更高级的模型来重新评估和排序最初检索到的对象。这可以提高最终检索集的质量。
过度获取:最初检索的对象多于所需。
应用排序模型:使用高延迟模型(通常是交叉编码器)重新评估相关性。该模型会逐对考虑查询和每个对象,以重新评估相似度。
重新排序结果:根据新的评估结果,重新排序对象。将最相关的结果置于顶部。这可确保最相关的文档优先显示,从而改进提供给LLM (LLM) 的数据。
from langchain.retrievers import ContextualCompressionRetrieverfrom langchain.retrievers.document_compressors import FlashrankRerankfrom langchain_openai import ChatOpenAIllm = ChatOpenAI(temperature=0)compressor = FlashrankRerank()compression_retriever = ContextualCompressionRetriever( base_compressor=compressor, base_retriever=retriever)compressed_docs = compression_retriever.invoke( "What did the president say about Ketanji Jackson Brown")print([doc.metadata["id"] for doc in compressed_docs])pretty_print_docs(compressed_docs)
此代码片段利用 ContextualCompressionRetriever 中的 FlashrankRerank 来提升检索到的文档的相关性。它根据查询“总统对 Ketanji Jackson Brown 有何评价”的相关性,对基础检索器(用 retriever 表示)获取的文档进行重新排序。最后,它会打印文档 ID 以及压缩后、重新排序后的文档。
[0, 5, 3]Document 1:One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court.And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.----------------------------------------------------------------------------------------------------Document 2:He met the Ukrainian people.From President Zelenskyy to every Ukrainian, their fearlessness, their courage, their determination, inspires the world.Groups of citizens blocking tanks with their bodies. Everyone from students to retirees teachers turned soldiers defending their homeland.In this struggle as President Zelenskyy said in his speech to the European Parliament “Light will win over darkness.” The Ukrainian Ambassador to the United States is here tonight.----------------------------------------------------------------------------------------------------Document 3:And tonight, I’m announcing that the Justice Department will name a chief prosecutor for pandemic fraud.By the end of this year, the deficit will be down to less than half what it was before I took office. The only president ever to cut the deficit by more than one trillion dollars in a single year.Lowering your costs also means demanding more competition.I’m a capitalist, but capitalism without competition isn’t capitalism.It’s exploitation—and it drives up prices.
输出显示它根据相关性对检索到的块进行重新排序。
使用特定领域数据对 LLM 进行微调可以显著提升其性能。例如,使用 Meditron 70B 这样的模型。这是针对医疗数据对 LLaMA 2 70b 进行微调的版本,同时使用了以下两种方法:
无监督微调:继续对大量特定领域的文本进行预训练。
监督微调:使用监督学习针对特定领域任务(例如医学多项选择题)进一步完善模型。这种专门的训练有助于模型在目标领域表现良好。在某些特定任务上,它的表现优于基础模型以及规模更大、专业性较低的模型(例如 GPT-3.5)。
微调
此图表示针对特定任务示例进行微调的过程。这种方法允许开发人员指定所需的输出、鼓励某些行为,或更好地控制模型的响应。
RAFT(检索增强微调)是一种改进大型语言模型 (LLM) 在特定领域工作方式的方法。它可以帮助这些模型利用文档中的相关信息更准确地回答问题。
检索增强微调:RAFT 将微调与检索方法相结合。这使得模型在训练过程中能够从有用和不太有用的文档中学习。
思路链推理:该模型生成的答案展现了其推理过程。这有助于它根据检索到的文档提供清晰准确的响应。
动态文档处理:RAFT 训练模型查找和使用最相关的文档,同时忽略那些无助于回答问题的文档。
RAFT 架构包含几个关键组件:
通过采用这种架构,RAFT 增强了模型在特定领域的工作能力,并提供了一种生成准确且相关响应的可靠方法。
RAFT 的架构
左上图展示了一种调整 LLM 的方法,使其能够从一组正向文档和干扰文档中读取解决方案。与标准 RAG 设置不同,标准 RAG 设置基于检索器输出进行训练,检索器输出是记忆和阅读的混合。测试时,所有方法均遵循标准 RAG 设置,并在上下文中提供前 k 个检索到的文档。
改进 RAG 系统的检索和生成能力对于打造更优秀的 AI 应用至关重要。本文讨论的技术涵盖从低投入、高效率的方法(查询重写、重新排序)到更复杂的流程(嵌入和 LLM 微调)。最佳技术取决于你应用的具体需求和限制。先进的 RAG 技术,如果经过深思熟虑地应用,可以帮助开发人员构建更准确、更可靠、更具备情境感知能力的 AI 系统,从而处理复杂的信息需求
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-09-04
向量检索之后,Agent 长期记忆又回到了知识图谱
2026-09-01
RAG的难题,已经从“查到资料”转向“组织可用上下文”
2026-08-31
zg 正式开源:本地检索,不止于关键词
2026-08-31
从0到1打造测试用例生成智能体:RAG+知识图谱实战全记录
2026-08-26
把 Office 文件喂给 AI 之前,先看看 Markdown 丢了什么
2026-08-24
RAG处理表格数据——Table RAG让我把Excel变成了知识库
2026-08-19
Milvus 3.0开源解读|从Entity到Element,StructArray 如何重构多向量检索
2026-08-19
从 DeepWiki 到 OpenWiki:Agent Wiki 到底有什么用?
2026-06-18
2026-06-23
2026-06-10
2026-06-10
2026-06-15
2026-06-22
2026-07-26
2026-07-09
2026-07-04
2026-07-25
2026-08-19
2026-08-18
2026-08-05
2026-08-05
2026-07-28
2026-07-27
2026-07-26
2026-07-25
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。