原文地址:Why Are Advanced RAG Methods Crucial for the Future of AI?
检索增强生成(RAG)是生成式人工智能领域的一大进步,它将高效的数据检索与大型语言模型的强大功能结合在一起。
RAG 的核心工作是利用向量搜索挖掘相关的现有数据,将这些检索到的信息与用户的查询结合起来,然后通过类似 ChatGPT 的大型语言模型进行处理。
这种 RAG 方法可确保生成的响应不仅精确,而且还能反映当前的信息,从而大大减少输出中的不准确或 "幻觉"。
然而,随着人工智能应用领域的不断扩大,对 RAG 提出的要求也变得更加复杂多样。基本的 RAG 框架虽然强大,但可能已不足以满足不同行业和不断发展的使用情境的细微需求。这就是高级 RAG 技术发挥作用的地方。这些增强的方法被量身定制以解决特定的挑战,在信息处理中提供更高的精度、适应性和效率。
检索增强生成(RAG)将数据管理与智能查询相结合,以提高人工智能的响应精度。
整个过程如图所示,强调了 RAG 对可靠数据处理和根据上下文生成答案的重视,这对于高级人工智能应用至关重要。
随着人工智能技术的发展,RAG 的能力也在不断提高。先进的 RAG 技术层出不穷,不断突破这些模型所能达到的极限。这些进步不仅仅是更好的检索或更流畅的生成。它们包含一系列改进,包括增强对上下文的理解、更复杂地处理细微查询,以及无缝集成各种数据源的能力。
自查询检索器,具有对自身进行查询的能力。给定任何自然语言查询,检索器使用一个构造查询的LLM链来编写一个结构化查询,然后将该结构化查询应用到其底层的VectorStore上。这使得检索器不仅能够使用用户输入的查询进行语义相似性比较,与存储的文档内容进行对比,而且还能从用户查询中提取对存储文档元数据的过滤条件,并执行这些过滤器。(来自LangChain 官网:Self-querying | ️ Langchain)
自查询检索是人工智能驱动的数据库系统中的一项前沿技术,它通过自然语言理解来增强数据查询功能。例如,如果您有一个产品目录数据集,您想搜索 "a black leather mini skirt less than 20 dollars",您不仅要对产品描述进行语义搜索,还可以对产品的子类别和价格进行过滤。
通过从自然语言中构建结构化查询,自查询检索可同时考虑语义元素和元数据,从而确保数据获取的效率和精度。
import openai
import pymongo
from bson.json_util import dumps
# OpenAI API key setup
openai.api_key = 'your-api-key'
# Connect to MongoDB
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client['your_database']
collection = db['your_collection']
# Function to use GPT-3.5 for interpreting natural language query and outputting a structured query
def interpret_query_with_gpt(query):
response = openai.Completion.create(
model="gpt-3.5-turbo",
prompt=f"Translate the following natural language query into a MongoDB vector search query:\n\n'{query}'",
max_tokens=300
)
return response.choices[0].message.content
# Function to execute MongoDB vector search query
def execute_query(query):
structured_query = eval(query) # Caution: Use eval carefully
results = collection.aggregate([structured_query])
return dumps(list(results), indent=4)
# Example usage
natural_language_query = "Find documents related to AI advancements"
structured_query = interpret_query_with_gpt(natural_language_query)
results = execute_query(structured_query)
print(results)
在先进的 RAG 系统中,父子关系的概念将数据检索提升到了一个新的水平。这种方法是将大型文档分割成更小的、易于管理的部分--父文档及其相应的子文档。
这种技术通过提供更微妙和具有上下文丰富度的数据检索方法来解决基本RAG的局限性,对于理解更广泛上下文至关重要的复杂查询非常关键。
这项技术解决了基本 RAG 的局限性,为数据检索提供了一种更细致入微、上下文更丰富的方法,对于理解更广泛上下文至关重要的复杂查询非常关键。
import os
from dotenv import load_dotenv
from pymongo import MongoClient
from langchain.llms import OpenAI
import gradio as gr
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Load environment variables from .env file
load_dotenv(override=True)
# Set up MongoDB connection details
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
MONGO_URI = os.environ["MONGO_URI"]
DB_NAME = "pdfchatbot"
COLLECTION_NAME = "advancedRAGParentChild"
# Initialize OpenAIEmbeddings with the API key
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)
# Connect to MongoDB
client = MongoClient(MONGO_URI)
db = client[DB_NAME]
collection = db[COLLECTION_NAME]
# Initialize the text splitters for parent and child documents
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)
child_splitter = RecursiveCharacterTextSplitter(chunk_size=200)
# Function to process PDF document and split it into chunks
def process_pdf(file):
loader = PyPDFLoader(file.name)
docs = loader.load()
parent_docs = parent_splitter.split_documents(docs)
# Process parent documents
for parent_doc in parent_docs:
parent_doc_content = parent_doc.page_content.replace('\n', ' ')
parent_id = collection.insert_one({
'document_type': 'parent',
'content': parent_doc_content
}).inserted_id
# Process child documents
child_docs = child_splitter.split_documents([parent_doc])
for child_doc in child_docs:
child_doc_content = child_doc.page_content.replace('\n', ' ')
child_embedding = embeddings.embed_documents([child_doc_content])[0]
collection.insert_one({
'document_type': 'child',
'content': child_doc_content,
'embedding': child_embedding,
'parent_ref': parent_id
})
return "PDF processing complete"
# Function to embed a query and perform a vector search
def query_and_display(query):
query_embedding = embeddings.embed_documents([query])[0]
# Retrieve relevant child documents based on query
child_docs = collection.aggregate([{
"$vectorSearch": {
"index": "vector_index",
"path": "embedding",
"queryVector": query_embedding,
"numCandidates": 10
}
}])
# Fetch corresponding parent documents for additional context
parent_docs = [collection.find_one({"_id": doc['parent_ref']}) for doc in child_docs]
return parent_docs, child_docs
# Initialize the OpenAI client
openai_client = OpenAI(api_key=OPENAI_API_KEY)
# Function to generate a response from the LLM
def generate_response(query, parent_docs, child_docs):
response_content = " ".join([doc['content'] for doc in parent_docs if doc])
chat_completion = openai_client.chat.completions.create(
messages=[{"role": "user", "content": query}],
model="gpt-3.5-turbo"
)
return chat_completion.choices[0].message.content
# Bringing It All Together
with gr.Blocks(css=".gradio-container {background-color: AliceBlue}") as demo:
gr.Markdown("Generative AI Chatbot - Upload your file and Ask questions")
with gr.Tab("Upload PDF"):
with gr.Row():
pdf_input = gr.File()
pdf_output = gr.Textbox()
pdf_button = gr.Button("Upload PDF")
with gr.Tab("Ask question"):
question_input = gr.Textbox(label="Your Question")
answer_output = gr.Textbox(label="LLM Response and Retrieved Documents", interactive=False)
question_button = gr.Button("Ask")
question_button.click(query_and_display, inputs=[question_input], outputs=answer_output)
pdf_button.click(process_pdf, inputs=pdf_input, outputs=pdf_output)
demo.launch()
由 MongoDB 销售创新项目负责人 Fabian Valle 开发的交互式 RAG 代表了 AI 驱动搜索能力的前沿。这项技术允许用户实时主动影响检索过程,从而增强了传统 RAG 的功能,使信息发现更加量身定制和精确。
第三项技术展示了先进的 RAG 方法如何对未来的人工智能应用至关重要,它提供了一种动态、自适应和以用户为中心的信息检索和处理方法。
上下文压缩解决了从充斥着无关文本的文档中检索相关信息的挑战。它通过根据查询上下文压缩文档来适应查询的不可预测性,确保只有相关信息才会通过语言模型,从而提高响应质量并降低成本。
最后,我们探索了先进的 RAG 方法,探讨了它们在人工智能革命中的关键作用。自我查询检索、父子关系、交互式 RAG 和上下文压缩等技术向我们展示了将人类的理解力与机器的精确性相融合的艺术。有了人工智能思想领袖的指导和他们开创的实际应用,我们站在了未来的风口浪尖上,人工智能不仅能回答我们的问题,还能理解我们的问题,包括上下文。这就是未来,先进的 RAG 将引导我们走向更直观、反应更迅速、更准确的人工智能。
[1] Interactive RAG with MongoDB Atlas + Function Calling API | MongoDB
[2] Semantic Search Made Easy With LangChain and MongoDB