深入剖析:如何利用 AI 智能體增強傳統 RAG 系統 原創 精華
一、引言
在當今的人工智能領域,生成式人工智能(Generative AI)正迅速發展,越來越多的企業希望利用定制數據構建自己的生成式 AI 助手。檢索增強生成系統(Retrieval Augmented Generation systems,簡稱 RAG 系統)因其能夠避免對大語言模型(Large Language Models,LLMs)進行昂貴的微調而迅速流行起來。RAG 系統的一個關鍵優勢在于,它可以輕松集成企業自身的數據,增強大語言模型的智能,并為用戶的問題提供更具上下文的答案。
然而,傳統的 RAG 系統也面臨著一系列問題,這些問題可能導致其性能不佳,甚至給出錯誤的答案。那么,有沒有一種方法可以改進這些問題呢?答案是肯定的。在本文中,我們將探討如何利用 AI 智能體(AI Agents)來增強傳統 RAG 系統的能力,并解決其一些局限性。
二、傳統 RAG 系統概述
(一)傳統 RAG 系統架構
傳統的 RAG 系統架構通常由兩個主要步驟組成:數據處理和索引、檢索和響應生成。
1.數據處理和索引:在這一步驟中,我們的重點是將定制的企業數據轉換為更易于處理的格式。具體來說,就是加載文本內容以及其他工件(如圖表和圖像),將大文檔分割成較小的塊,使用嵌入模型將這些塊轉換為嵌入向量,然后將這些塊和嵌入向量存儲到向量數據庫中。
2.檢索和響應生成:當用戶提出問題時,這一步驟開始。系統從向量數據庫中檢索與輸入問題相似的相關文檔塊,然后將這些文檔塊與問題一起發送給大語言模型(LLM),以生成類似人類的響應。
這種兩步式工作流程在行業中被廣泛用于構建傳統的 RAG 系統,但它也存在一些局限性。
(二)傳統 RAG 系統的局限性
傳統 RAG 系統存在幾個明顯的局限性:
- 缺乏實時數據:系統的表現依賴于向量數據庫中已有的數據,對于實時發生的事件或數據,無法及時獲取和處理。
- 檢索策略問題:如果檢索策略不佳,可能會導致使用不相關的文檔來回答問題,從而影響答案的準確性。
- 大語言模型的局限性:LLM 可能會出現幻覺(hallucinations),即生成一些沒有事實依據的答案,或者無法回答某些問題。
在本文中,我們將特別關注 RAG 系統無法訪問實時數據的局限性,并確保檢索到的文檔塊確實與回答問題相關。這樣可以使 RAG 系統能夠回答關于最近事件和實時數據的問題,并減少出現幻覺的可能性。
三、糾正性 RAG 系統
糾正性 RAG 系統的靈感來自于論文《Corrective Retrieval Augmented Generation》(作者:Yan 等人)中提出的解決方案。其關鍵思想是像往常一樣從向量數據庫中檢索文檔塊,然后使用 LLM 檢查每個檢索到的文檔塊是否與輸入問題相關。
如果所有檢索到的文檔塊都相關,那么就像標準的 RAG 管道一樣,將其發送到 LLM 進行正常的響應生成。然而,如果某些檢索到的文檔與輸入問題不相關,我們會重新表述輸入查詢,在網絡上搜索與輸入問題相關的新信息,然后將其發送到 LLM 以生成響應。
這種方法的關鍵創新點包括在網絡上搜索,用實時數據擴充向量數據庫中的靜態信息,以及檢查檢索到的文檔是否與輸入問題相關,這是簡單的嵌入余弦相似度無法捕捉到的。
四、AI 智能體的興起
AI 智能體或智能 AI 系統在 2024 年有了顯著的發展,它使我們能夠構建能夠推理、分析、交互并自動采取行動的生成式 AI 系統。智能 AI 的核心思想是構建完全自主的系統,能夠在最少的人工干預下理解和管理復雜的工作流程和任務。智能系統可以掌握細微的概念,設定并追求目標,通過任務進行推理,并根據不斷變化的條件調整其行動。這些系統可以由單個智能體或多個智能體組成。
我們可以使用各種框架來構建智能 AI 系統,包括 CrewAI、LangChain、LangGraph、AutoGen 等等。使用這些框架可以讓我們輕松開發復雜的工作流程。需要記住的是,智能體基本上是一個或多個大語言模型,它們可以訪問一組工具,并根據特定的基于提示的指令來回答用戶問題。
在我們的實際實現中,我們將使用 LangGraph 來構建我們的智能 RAG 系統。LangGraph 建立在 LangChain 之上,有助于創建循環圖,這對于開發由 LLM 驅動的 AI 智能體至關重要。它的接口受到廣泛使用的 NetworkX 庫的啟發,能夠通過循環計算步驟協調和檢查點多個鏈(或參與者)。LangGraph 將智能體工作流程視為循環圖結構。
LangGraph 智能體的主要組件包括:
- 節點:函數或 LangChain 可運行對象,如工具。
- 邊:指定節點之間的有向路徑。
- 有狀態的圖:在通過節點處理數據時管理和更新狀態對象。
LangGraph 利用這些來促進具有狀態持久性的循環 LLM 調用執行,這是 AI 智能體經常需要的。
五、智能糾正性 RAG 系統工作流程
智能糾正性 RAG 系統的工作流程包含了多個關鍵組件和執行流程。該系統中有兩個主要的流程:
1.常規 RAG 系統工作流程:用戶提出問題,系統從向量數據庫中檢索上下文文檔。然后,我們引入了一個額外的步驟,即根據糾正性 RAG 論文的方法,使用 LLM 檢查所有檢索到的文檔是否與用戶問題相關(在“評分”節點);如果所有文檔都相關,那么我們使用 LLM 生成響應。
2.異常處理流程:如果從向量數據庫中檢索到的至少一個或多個上下文文檔與用戶問題不相關,那么我們利用 LLM 重寫用戶查詢,并對其進行優化以便在網絡上搜索。接下來,我們利用網絡搜索工具使用這個重新表述的查詢在網絡上搜索,并獲取一些新文檔。最后,我們將查詢和任何相關的上下文文檔(包括網絡搜索文檔)發送到 LLM 以生成響應。
六、詳細的智能糾正性 RAG 系統架構
我們從用戶查詢開始,該查詢將發送到向量數據庫(我們將使用 Chroma),并檢索一些上下文文檔。如果用戶查詢基于最近的事件或超出我們向量數據庫中初始數據范圍的主題,那么有可能無法檢索到任何文檔。
接下來,我們將用戶查詢和上下文文檔發送給 LLM,并使其充當文檔評分器。它將根據每個上下文文檔在含義和上下文方面是否與用戶查詢相關,將其評為“是”或“否”。
然后是決策節點,這里有兩種可能的路徑:
- 所有文檔相關路徑:如果所有上下文文檔都與用戶查詢相關,那么我們將進入標準的 RAG 流程,即將文檔和查詢發送到 LLM,以生成作為用戶查詢答案的上下文響應。
- 存在不相關文檔或無文檔路徑:如果至少有一個或多個上下文文檔與用戶查詢不相關,或者對于給定的用戶查詢沒有上下文文檔,那么我們將用戶查詢發送給 LLM,并要求它重新表述用戶查詢,以優化其在網絡上的搜索。
下一步是調用網絡搜索工具,在我們的實現中,我們將使用 Tavily Web Search API 工具在網絡上搜索并獲取相關信息作為上下文文檔,然后將它們添加到從向量數據庫中檢索到的任何相關上下文文檔列表中。
最后一步是通過相同的 RAG 流程,使用查詢和上下文文檔(包括從網絡檢索到的實時信息)生成響應。
七、使用 LangGraph 進行智能 RAG 系統的實踐實現
我們將使用 LangGraph 實現我們之前討論的智能 RAG 系統。我們將從 Wikipedia 加載一些文檔到我們的向量數據庫(Chroma 數據庫)中,并使用 Tavily Search 工具進行網絡搜索。與 LLM 的連接和提示將使用 LangChain 進行,并且智能體將使用 LangGraph 構建。對于我們的 LLM,我們將使用 ChatGPT GPT-4o,這是一個功能強大的 LLM,對工具調用具有原生支持。不過,你也可以自由使用任何其他 LLM,包括開源 LLM,建議使用經過微調以進行工具調用的強大 LLM 以獲得最佳性能。
(一)安裝依賴項
我們首先安裝必要的依賴項,這些是我們構建系統將使用的庫:
!pip install langchain==0.2.0
!pip install langchain-openai==0.1.7
!pip install langchain-community==0.2.0
!pip install langgraph==0.1.1
!pip install langchain-chroma==0.1.1
(二)輸入 Open AI API 密鑰
我們使用 getpass() 函數輸入我們的 Open AI 密鑰,這樣我們就不會意外地在代碼中暴露我們的密鑰。
from getpass import getpass
OPENAI_KEY = getpass('Enter Open AI API Key: ')
(三)輸入 Tavily Search API 密鑰
同樣,我們使用 getpass() 函數輸入我們的 Tavily Search API 密鑰,并從指定位置獲取免費的 API 密鑰。
TAVILY_API_KEY = getpass('Enter Tavily Search API Key: ')
(四)設置環境變量
接下來,我們設置一些系統環境變量,這些變量將在稍后對 LLM 進行身份驗證和搜索 API 時使用。
import os
os.environ['OPENAI_API_KEY'] = OPENAI_KEY
os.environ['TAVILY_API_KEY'] = TAVILY_API_KEY
(五)為 Wikipedia 數據構建向量數據庫
我們從 Wikipedia 中選取一部分文檔來構建用于檢索和搜索的向量數據庫。我們已經從 Wikipedia 中提取了這些文檔并將它們存儲在一個存檔文件中。
Open AI 嵌入模型:LangChain 使我們能夠訪問 Open AI 嵌入模型,包括最新的模型:一個較小且高效的 text-embedding-3-small 模型和一個更大且功能更強大的 text-embedding-3-large 模型。我們需要一個嵌入模型,以便在將文檔塊存儲到向量數據庫之前將其轉換為嵌入向量。
from langchain_openai import OpenAIEmbeddings
openai_embed_model = OpenAIEmbeddings(model='text-embedding-3-small')
獲取 Wikipedia 數據:我們已經將 Wikipedia 文檔下載并存儲在 Google Drive 上的一個存檔文件中,你可以手動下載,也可以使用以下代碼下載。如果無法使用代碼下載,可以從指定的 Google Drive 鏈接下載并手動上傳到 Google Colab。
# 使用 Google Colab 下載
!gdown 1oWBnoxBZ1Mpeond8XDUSO6J9oAjcRDyW
加載和分塊文檔:我們現在將解壓數據存檔,加載文檔,將其分割和分塊為更易于管理的文檔塊,然后再進行索引。
import gzip
import json
from langchain.docstore.document import Document
from langchain.text_splitter import RecursiveCharacterTextSplitter
wikipedia_filepath ='simplewiki-2020-11-01.jsonl.gz'
docs = []
with gzip.open(wikipedia_filepath, 'rt', encoding='utf8') as fIn:
for line in fIn:
data = json.loads(line.strip())
docs.append({
'metadata': {
'title': data.get('title'),
'article_id': data.get('id')
},
'data':''.join(data.get('paragraphs')[0:3])
})
docs = [doc for doc in docs for x in ['india'] if x in doc['data'].lower().split()]
docs = [Document(page_cnotallow=doc['data'], metadata=doc['metadata']) for doc in docs]
splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=300)
chunked_docs = splitter.split_documents(docs)
創建向量數據庫并持久化到磁盤:我們初始化與 Chroma 向量數據庫客戶端的連接,并通過初始化 Chroma 客戶端并傳遞我們要保存數據的目錄來將數據保存到磁盤。我們還指定使用 Open AI 嵌入模型將每個文檔塊轉換為嵌入向量,并將文檔塊及其相應的嵌入向量存儲在向量數據庫索引中。
from langchain_chroma import Chroma
chroma_db = Chroma.from_documents(documents=chunked_docs,
collection_name='rag_wikipedia_db',
embedding=openai_embed_model,
collection_metadata={"hnsw:space": "cosine"},
persist_directory="./wikipedia_db")
(六)設置向量數據庫檢索器
我們使用“帶閾值的相似性檢索”策略,該策略使用余弦相似性,并根據用戶輸入查詢檢索前 3 個最相似的文檔,同時引入一個截止值,以不返回任何低于特定相似性閾值(在這種情況下為 0.3)的文檔。
similarity_threshold_retriever = chroma_db.as_retriever(search_type="similarity_score_threshold",
search_kwargs={"k": 3,
"score_threshold": 0.3})
我們可以通過一些示例查詢來測試我們的檢索器是否正常工作。
(七)創建查詢檢索評分器
我們使用 LLM(在我們的例子中是 GPT-4o)來判斷任何檢索到的文檔是否與給定問題相關,答案將是“是”或“否”。
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
class GradeDocuments(BaseModel):
"""Binary score for relevance check on retrieved documents."""
binary_score: str = Field(
descriptinotallow="Documents are relevant to the question, 'yes' or 'no'"
)
llm = ChatOpenAI(model="gpt-4o", temperature=0)
structured_llm_grader = llm.with_structured_output(GradeDocuments)
SYS_PROMPT = """You are an expert grader assessing relevance of a retrieved document to a user question.
Follow these instructions for grading:
- If the document contains keyword(s) or semantic meaning related to the question, grade it as relevant.
- Your grade should be either 'yes' or 'no' to indicate whether the document is relevant to the question or not."""
grade_prompt = ChatPromptTemplate.from_messages(
[
("system", SYS_PROMPT),
("human", """Retrieved document:
{document}
User question:
{question}
"""),
]
)
doc_grader = (grade_prompt | structured_llm_grader)
我們可以通過一些示例用戶查詢來測試這個評分器,看看從向量數據庫中檢索到的上下文文檔的相關性如何。
(八)構建問答 RAG 鏈
我們將檢索器連接到 LLM(在我們的例子中是 GPT-4o),并構建我們的問答 RAG 鏈。這將是我們的傳統 RAG 系統,我們稍后將其與 AI 智能體集成。
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
from langchain_core.output_parsers import StrOutputParser
from operator import itemgetter
prompt = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If no context is present or if you don't know the answer, just say that you don't know the answer.
Do not make up the answer unless it is there in the provided context.
Give a detailed answer and to the point answer with regard to the question.
Question:
{question}
Context:
{context}
Answer:
"""
prompt_template = ChatPromptTemplate.from_template(prompt)
chatgpt = ChatOpenAI(model_name='gpt-4o', temperature=0)
def format_docs(docs):
return"\n\n".join(doc.page_content for doc in docs)
qa_rag_chain = (
{
"context": (itemgetter('context') | RunnableLambda(format_docs)),
"question": itemgetter('question')
}
|
prompt_template
|
chatgpt
|
StrOutputParser()
)
我們可以通過一些查詢來測試我們的傳統 RAG 系統。
(九)創建查詢重寫器
我們構建一個查詢重寫器,它將使用 LLM(在我們的例子中是 GPT-4o)將輸入的用戶查詢重寫為更適合網絡搜索的更好版本。這將幫助我們從網絡上為我們的查詢獲取更好的上下文信息。
llm = ChatOpenAI(model="gpt-4o", temperature=0)
SYS_PROMPT = """Act as a question re-writer and perform the following task:
- Convert the following input question to a better version that is optimized for web search.
- When re-writing, look at the input question and try to reason about the underlying semantic intent / meaning.
"""
re_write_prompt = ChatPromptTemplate.from_messages(
[
("system", SYS_PROMPT),
("human", """Here is the initial question:
{question}
Formulate an improved question.
""",
),
]
)
question_rewriter = (re_write_prompt
|
llm
|
StrOutputParser())
我們可以用一個示例問題來測試查詢重寫器,看看它是如何工作的:
query = "who won the champions league in 2024?"
question_rewriter.invoke({"question": query})
輸出結果可能類似:
Who was the winner of the 2024 UEFA Champions League?
可以看到,查詢重寫器將原始問題優化為更適合網絡搜索的形式。
(十)加載網絡搜索工具
我們將使用 Tavily API 進行網絡搜索,因此要建立與該 API 的連接。在搜索時,我們將使用前 3 個搜索結果作為額外的上下文信息,當然你也可以自由加載更多的搜索結果。
from langchain_community.tools.tavily_search import TavilySearchResults
tv_search = TavilySearchResults(max_results=3, search_depth='advanced',max_tokens=10000)
(十一)構建智能 RAG 組件
圖狀態(Graph State):這用于存儲和表示智能體圖在遍歷各個節點時的狀態。它會存儲和跟蹤用戶查詢、一個指示是否需要進行網絡搜索的標志變量、一系列上下文文檔(從向量數據庫和/或網絡搜索中檢索到的)以及由 LLM 生成的響應。
from typing import List
from typing_extensions import TypedDict
class GraphState(TypedDict):
"""
Represents the state of our graph.
Attributes:
question: question
generation: LLM response generation
web_search_needed: flag of whether to add web search - yes or no
documents: list of context documents
"""
question: str
generation: str
web_search_needed: str
documents: List[str]
從向量數據庫檢索的函數(Retrieve function for retrieval from Vector DB):這個函數用于通過我們之前構建的檢索器從向量數據庫中獲取相關的上下文文檔。記住,由于它將成為智能體圖中的一個節點,之后我們將從圖狀態中獲取用戶問題,然后將其傳遞給檢索器,以從向量數據庫中獲取相關的上下文文檔。
def retrieve(state):
"""
Retrieve documents
Args:
state (dict): The current graph state
Returns:
state (dict): New key added to state, documents - that contains retrieved context documents
"""
print("---RETRIEVAL FROM VECTOR DB---")
question = state["question"]
# Retrieval
documents = similarity_threshold_retriever.invoke(question)
return {"documents": documents, "question": question}
文檔評分(Grade documents):這個函數用于使用 LLM 評分器來確定檢索到的文檔是否與問題相關。如果至少有一個文檔在上下文上不相關,或者沒有檢索到上下文文檔,它會將??web_search_needed?
? 標志設置為 “Yes”。否則,如果所有文檔在上下文上都與給定的用戶查詢相關,它會將該標志設置為 “No”。它還會更新狀態圖,確保上下文文檔僅包含相關文檔。
def grade_documents(state):
"""
Determines whether the retrieved documents are relevant to the question
by using an LLM Grader.
If any document are not relevant to question or documents are empty - Web Search needs to be done
If all documents are relevant to question - Web Search is not needed
Helps filtering out irrelevant documents
Args:
state (dict): The current graph state
Returns:
state (dict): Updates documents key with only filtered relevant documents
"""
print("---CHECK DOCUMENT RELEVANCE TO QUESTION---")
question = state["question"]
documents = state["documents"]
# Score each doc
filtered_docs = []
web_search_needed = "No"
if documents:
for d in documents:
score = doc_grader.invoke(
{"question": question, "document": d.page_content}
)
grade = score.binary_score
if grade == "yes":
print("---GRADE: DOCUMENT RELEVANT---")
filtered_docs.append(d)
else:
print("---GRADE: DOCUMENT NOT RELEVANT---")
web_search_needed = "Yes"
continue
else:
print("---NO DOCUMENTS RETRIEVED---")
web_search_needed = "Yes"
return {"documents": filtered_docs, "question": question,
"web_search_needed": web_search_needed}
查詢重寫(Rewrite query):這個函數用于使用 LLM 重寫輸入查詢,以生成一個更適合網絡搜索的優化問題。它還會更新狀態圖中的查詢,以便我們即將創建的智能體圖中的其他節點可以訪問它。
def rewrite_query(state):
"""
Rewrite the query to produce a better question.
Args:
state (dict): The current graph state
Returns:
state (dict): Updates question key with a re-phrased or re-written question
"""
print("---REWRITE QUERY---")
question = state["question"]
documents = state["documents"]
# Re-write question
better_question = question_rewriter.invoke({"question": question})
return {"documents": documents, "question": better_question}
網絡搜索(Web Search):這個函數用于使用網絡搜索工具針對給定的查詢在網絡上進行搜索,并從網絡中檢索一些信息,這些信息可以在我們的 RAG 系統中用作額外的上下文文檔。正如前面所討論的,我們將在系統中使用 Tavily Search API 工具。這個函數還會更新狀態圖,特別是上下文文檔列表,添加從網絡上為重新表述的用戶查詢檢索到的新文檔。
from langchain.schema import Document
def web_search(state):
"""
Web search based on the re-written question.
Args:
state (dict): The current graph state
Returns:
state (dict): Updates documents key with appended web results
"""
print("---WEB SEARCH---")
question = state["question"]
documents = state["documents"]
# Web search
docs = tv_search.invoke(question)
web_results = "\n\n".join([d["content"] for d in docs])
web_results = Document(page_cnotallow=web_results)
documents.append(web_results)
return {"documents": documents, "question": question}
生成答案(Generate Answer):這是 RAG 系統中從查詢和上下文文檔生成標準 LLM 響應的函數。我們還會更新狀態圖中的??generation?
? 字段,以便在智能體圖中的任何時候都可以訪問它,并根據需要將響應輸出給用戶。
def generate_answer(state):
"""
Generate answer from context document using LLM
Args:
state (dict): The current graph state
Returns:
state (dict): New key added to state, generation, that contains LLM generation
"""
print("---GENERATE ANSWER---")
question = state["question"]
documents = state["documents"]
# RAG generation
generation = qa_rag_chain.invoke({"context": documents, "question": question})
return {"documents": documents, "question": question,
"generation": generation}
決定生成(Decide to Generate):這個函數用作條件函數,從智能體圖狀態中檢查??web_search_needed?
? 標志,并決定是進行網絡搜索還是生成響應。它將返回要調用的函數名稱。如果需要進行網絡搜索,系統將返回??rewrite_query?
? 字符串,促使我們的智能 RAG 系統遵循查詢重寫、搜索和響應生成的流程。如果不需要進行網絡搜索,該函數將返回??generate_answer?
? 字符串,使我們的 RAG 系統進入從給定上下文文檔和查詢生成響應的常規流程。你將在我們智能體圖的條件節點中使用這個函數,根據兩種可能的路徑將流程路由到正確的函數。
def decide_to_generate(state):
"""
Determines whether to generate an answer, or re-generate a question.
Args:
state (dict): The current graph state
Returns:
str: Binary decision for next node to call
"""
print("---ASSESS GRADED DOCUMENTS---")
web_search_needed = state["web_search_needed"]
if web_search_needed == "Yes":
# All documents have been filtered check_relevance
# We will re-generate a new query
print("---DECISION: SOME or ALL DOCUMENTS ARE NOT RELEVANT TO QUESTION, REWRITE QUERY---")
return "rewrite_query"
else:
# We have relevant documents, so generate answer
print("---DECISION: GENERATE RESPONSE---")
return "generate_answer"
(十二)使用 LangGraph 構建智能體圖
我們使用 LangGraph 并根據上一節實現的函數將智能體構建為一個圖,按照我們的智能 RAG 系統架構將它們放入相關節點,并根據定義的工作流程用相關邊連接它們。
from langgraph.graph import END, StateGraph
agentic_rag = StateGraph(GraphState)
# Define the nodes
agentic_rag.add_node("retrieve", retrieve) # retrieve
agentic_rag.add_node("grade_documents", grade_documents) # grade documents
agentic_rag.add_node("rewrite_query", rewrite_query) # transform_query
agentic_rag.add_node("web_search", web_search) # web search
agentic_rag.add_node("generate_answer", generate_answer) # generate answer
# Build graph
agentic_rag.set_entry_point("retrieve")
agentic_rag.add_edge("retrieve", "grade_documents")
agentic_rag.add_conditional_edges(
"grade_documents",
decide_to_generate,
{"rewrite_query": "rewrite_query", "generate_answer": "generate_answer"},
)
agentic_rag.add_edge("rewrite_query", "web_search")
agentic_rag.add_edge("web_search", "generate_answer")
agentic_rag.add_edge("generate_answer", END)
# Compile
agentic_rag = agentic_rag.compile()
我們可以使用以下代碼可視化我們的智能 RAG 系統工作流程:
from IPython.display import Image, display, Markdown
display(Image(agentic_rag.get_graph().draw_mermaid_png()))
(十三)測試我們的智能 RAG 系統
最后,我們準備在一些用戶查詢上實時測試我們的智能 RAG 系統!由于我們在圖節點的相關函數中放置了打印語句,因此在圖執行時我們可以看到它們的打印輸出。
場景一:查詢印度的首都
query = "what is the capital of India?"
response = agentic_rag.invoke({"question": query})
輸出如下:
---RETRIEVAL FROM VECTOR DB---
---CHECK DOCUMENT RELEVANCE TO QUESTION---
---GRADE: DOCUMENT RELEVANT---
---GRADE: DOCUMENT NOT RELEVANT---
---GRADE: DOCUMENT NOT RELEVANT---
---ASSESS GRADED DOCUMENTS---
---DECISION: SOME or ALL DOCUMENTS ARE NOT RELEVANT TO QUESTION, REWRITE QUERY---
---REWRITE QUERY---
---WEB SEARCH---
---GENERATE ANSWER—
可以看到,從向量數據庫中檢索到的一些文檔不相關,因此它成功地從網絡上檢索了上下文信息并生成了響應。我們現在可以查看生成的響應:
display(Markdown(response['generation']))
輸出:
The capital city of India is New Delhi. It is a union territory within the
larger metropolitan area of Delhi and is situated in the north-central part
of the country on the west bank of the Yamuna River. New Delhi was formally
dedicated as the capital in 1931 and has a population of about 9.4 million
people.
場景二:查詢 2024 年歐冠冠軍
query = "who won the champions league in 2024?"
response = agentic_rag.invoke({"question": query})
輸出:
---RETRIEVAL FROM VECTOR DB---
---CHECK DOCUMENT RELEVANCE TO QUESTION---
---GRADE: DOCUMENT NOT RELEVANT---
---ASSESS GRADED DOCUMENTS---
---DECISION: SOME or ALL DOCUMENTS ARE NOT RELEVANT TO QUESTION, REWRITE QUERY---
---REWRITE QUERY---
---WEB SEARCH---
---GENERATE ANSWER---
系統似乎按預期工作,由于沒有上下文文檔,它使用網絡搜索工具從網絡上檢索新信息來生成對我們查詢的響應。我們現在可以查看響應:
display(Markdown(response['generation']))
輸出:
The winner of the 2024 UEFA Champions League was Real Madrid. They secured
victory in the final against Borussia Dortmund with goals from Dani Carvajal
and Vinicius Junior.
場景三:查詢關于印度的信息
query = "Tell me about India"
response = agentic_rag.invoke({"question": query})
輸出:
---RETRIEVAL FROM VECTOR DB---
---CHECK DOCUMENT RELEVANCE TO QUESTION---
---GRADE: DOCUMENT RELEVANT---
---GRADE: DOCUMENT RELEVANT---
---GRADE: DOCUMENT RELEVANT---
---ASSESS GRADED DOCUMENTS---
---DECISION: GENERATE RESPONSE---
---GENERATE ANSWER—
我們的智能 RAG 系統運行良好,在這種情況下,由于所有檢索到的文檔都與回答用戶問題相關,所以它沒有進行網絡搜索。我們現在可以查看響應:
display(Markdown(response['generation']))
輸出:
India is a country located in Asia, specifically at the center of South Asia.
It is the seventh largest country in the world by area and the largest in
South Asia. . . . . . .
India has a rich and diverse history that spans thousands of years,
encompassing various languages, cultures, periods, and dynasties. The
civilization began in the Indus Valley, . . . . . .
八、結論
在本指南中,我們深入了解了傳統 RAG 系統當前面臨的挑戰、AI 智能體的作用和重要性,以及智能 RAG 系統如何應對其中的一些挑戰。我們詳細討論了受《Corrective Retrieval Augmented Generation》論文啟發的智能糾正性 RAG 系統的詳細系統架構和工作流程。最后但同樣重要的是,我們使用 LangGraph 實現了這個智能 RAG 系統,并在各種場景下進行了測試。你可以通過這個 Colab 筆記本輕松訪問代碼,并嘗試通過添加更多功能(如額外的幻覺檢查等)來改進這個系統。
如果你想深入學習如何構建這樣的智能 AI 系統,可以參加 GenAI Pinnacle Program。在這里,你將通過與生成式 AI 專家的一對一指導、超過 200 小時的強化學習的高級課程以及對 26 多種 GenAI 工具和庫的掌握,徹底革新你的 AI 學習和開發之旅。提升你的技能,成為 AI 領域的領導者。
希望本文能為你在 RAG 系統和 AI 智能體的探索中提供有價值的參考,讓我們一起期待在人工智能領域不斷創新和突破,構建更智能、更高效的系統,為各個行業帶來變革性的影響 。無論是企業應用場景,還是學術研究方向,對這些技術的深入理解和應用都將為我們打開新的大門,創造更多可能。
本文轉載自公眾號Halo咯咯 作者:基咯咯
