精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統 原創 精華

發布于 2025-3-26 10:21
瀏覽
0收藏

一、引言

在當今的人工智能領域,生成式人工智能(Generative AI)正迅速發展,越來越多的企業希望利用定制數據構建自己的生成式 AI 助手。檢索增強生成系統(Retrieval Augmented Generation systems,簡稱 RAG 系統)因其能夠避免對大語言模型(Large Language Models,LLMs)進行昂貴的微調而迅速流行起來。RAG 系統的一個關鍵優勢在于,它可以輕松集成企業自身的數據,增強大語言模型的智能,并為用戶的問題提供更具上下文的答案。

然而,傳統的 RAG 系統也面臨著一系列問題,這些問題可能導致其性能不佳,甚至給出錯誤的答案。那么,有沒有一種方法可以改進這些問題呢?答案是肯定的。在本文中,我們將探討如何利用 AI 智能體(AI Agents)來增強傳統 RAG 系統的能力,并解決其一些局限性。

二、傳統 RAG 系統概述

(一)傳統 RAG 系統架構

傳統的 RAG 系統架構通常由兩個主要步驟組成:數據處理和索引、檢索和響應生成。

1.數據處理和索引:在這一步驟中,我們的重點是將定制的企業數據轉換為更易于處理的格式。具體來說,就是加載文本內容以及其他工件(如圖表和圖像),將大文檔分割成較小的塊,使用嵌入模型將這些塊轉換為嵌入向量,然后將這些塊和嵌入向量存儲到向量數據庫中。

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統-AI.x社區

2.檢索和響應生成:當用戶提出問題時,這一步驟開始。系統從向量數據庫中檢索與輸入問題相似的相關文檔塊,然后將這些文檔塊與問題一起發送給大語言模型(LLM),以生成類似人類的響應。

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統-AI.x社區

這種兩步式工作流程在行業中被廣泛用于構建傳統的 RAG 系統,但它也存在一些局限性。

(二)傳統 RAG 系統的局限性

傳統 RAG 系統存在幾個明顯的局限性:

  1. 缺乏實時數據:系統的表現依賴于向量數據庫中已有的數據,對于實時發生的事件或數據,無法及時獲取和處理。
  2. 檢索策略問題:如果檢索策略不佳,可能會導致使用不相關的文檔來回答問題,從而影響答案的準確性。
  3. 大語言模型的局限性:LLM 可能會出現幻覺(hallucinations),即生成一些沒有事實依據的答案,或者無法回答某些問題。

在本文中,我們將特別關注 RAG 系統無法訪問實時數據的局限性,并確保檢索到的文檔塊確實與回答問題相關。這樣可以使 RAG 系統能夠回答關于最近事件和實時數據的問題,并減少出現幻覺的可能性。

三、糾正性 RAG 系統

糾正性 RAG 系統的靈感來自于論文《Corrective Retrieval Augmented Generation》(作者:Yan 等人)中提出的解決方案。其關鍵思想是像往常一樣從向量數據庫中檢索文檔塊,然后使用 LLM 檢查每個檢索到的文檔塊是否與輸入問題相關。

如果所有檢索到的文檔塊都相關,那么就像標準的 RAG 管道一樣,將其發送到 LLM 進行正常的響應生成。然而,如果某些檢索到的文檔與輸入問題不相關,我們會重新表述輸入查詢,在網絡上搜索與輸入問題相關的新信息,然后將其發送到 LLM 以生成響應。

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統-AI.x社區

這種方法的關鍵創新點包括在網絡上搜索,用實時數據擴充向量數據庫中的靜態信息,以及檢查檢索到的文檔是否與輸入問題相關,這是簡單的嵌入余弦相似度無法捕捉到的。

四、AI 智能體的興起

AI 智能體或智能 AI 系統在 2024 年有了顯著的發展,它使我們能夠構建能夠推理、分析、交互并自動采取行動的生成式 AI 系統。智能 AI 的核心思想是構建完全自主的系統,能夠在最少的人工干預下理解和管理復雜的工作流程和任務。智能系統可以掌握細微的概念,設定并追求目標,通過任務進行推理,并根據不斷變化的條件調整其行動。這些系統可以由單個智能體或多個智能體組成。

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統-AI.x社區

我們可以使用各種框架來構建智能 AI 系統,包括 CrewAI、LangChain、LangGraph、AutoGen 等等。使用這些框架可以讓我們輕松開發復雜的工作流程。需要記住的是,智能體基本上是一個或多個大語言模型,它們可以訪問一組工具,并根據特定的基于提示的指令來回答用戶問題。

在我們的實際實現中,我們將使用 LangGraph 來構建我們的智能 RAG 系統。LangGraph 建立在 LangChain 之上,有助于創建循環圖,這對于開發由 LLM 驅動的 AI 智能體至關重要。它的接口受到廣泛使用的 NetworkX 庫的啟發,能夠通過循環計算步驟協調和檢查點多個鏈(或參與者)。LangGraph 將智能體工作流程視為循環圖結構。

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統-AI.x社區

LangGraph 智能體的主要組件包括:

  1. 節點:函數或 LangChain 可運行對象,如工具。
  2. :指定節點之間的有向路徑。
  3. 有狀態的圖:在通過節點處理數據時管理和更新狀態對象。

LangGraph 利用這些來促進具有狀態持久性的循環 LLM 調用執行,這是 AI 智能體經常需要的。

五、智能糾正性 RAG 系統工作流程

智能糾正性 RAG 系統的工作流程包含了多個關鍵組件和執行流程。該系統中有兩個主要的流程:

1.常規 RAG 系統工作流程:用戶提出問題,系統從向量數據庫中檢索上下文文檔。然后,我們引入了一個額外的步驟,即根據糾正性 RAG 論文的方法,使用 LLM 檢查所有檢索到的文檔是否與用戶問題相關(在“評分”節點);如果所有文檔都相關,那么我們使用 LLM 生成響應。

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統-AI.x社區

2.異常處理流程:如果從向量數據庫中檢索到的至少一個或多個上下文文檔與用戶問題不相關,那么我們利用 LLM 重寫用戶查詢,并對其進行優化以便在網絡上搜索。接下來,我們利用網絡搜索工具使用這個重新表述的查詢在網絡上搜索,并獲取一些新文檔。最后,我們將查詢和任何相關的上下文文檔(包括網絡搜索文檔)發送到 LLM 以生成響應。

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統-AI.x社區

六、詳細的智能糾正性 RAG 系統架構

我們從用戶查詢開始,該查詢將發送到向量數據庫(我們將使用 Chroma),并檢索一些上下文文檔。如果用戶查詢基于最近的事件或超出我們向量數據庫中初始數據范圍的主題,那么有可能無法檢索到任何文檔。

接下來,我們將用戶查詢和上下文文檔發送給 LLM,并使其充當文檔評分器。它將根據每個上下文文檔在含義和上下文方面是否與用戶查詢相關,將其評為“是”或“否”。

然后是決策節點,這里有兩種可能的路徑:

  1. 所有文檔相關路徑:如果所有上下文文檔都與用戶查詢相關,那么我們將進入標準的 RAG 流程,即將文檔和查詢發送到 LLM,以生成作為用戶查詢答案的上下文響應。
  2. 存在不相關文檔或無文檔路徑:如果至少有一個或多個上下文文檔與用戶查詢不相關,或者對于給定的用戶查詢沒有上下文文檔,那么我們將用戶查詢發送給 LLM,并要求它重新表述用戶查詢,以優化其在網絡上的搜索。

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統-AI.x社區

下一步是調用網絡搜索工具,在我們的實現中,我們將使用 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()))

深入剖析:如何利用 AI 智能體增強傳統 RAG 系統-AI.x社區

(十三)測試我們的智能 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咯咯    作者:基咯咯

原文鏈接:??https://mp.weixin.qq.com/s/BnnKDkm14Js01ULgK_vcKQ??

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關推薦
精精国产xxx在线视频app| 亚洲精品久久久蜜桃动漫| 久久av中文| 欧美三级在线播放| 黄色三级中文字幕| 黄色av免费在线观看| 国模娜娜一区二区三区| 午夜精品一区二区三区在线| 女女互磨互喷水高潮les呻吟| 亚洲人成777| 欧美日在线观看| 中文字幕精品在线播放| 男女网站在线观看| 高清视频一区二区| 国产精品无av码在线观看| 久久综合成人网| 日韩欧美二区| 亚洲精品视频网上网址在线观看| 911av视频| 搜成人激情视频| 亚洲国产欧美在线人成| 亚洲午夜久久久影院伊人| 天天色综合av| 国产v日产∨综合v精品视频| 国产精品久久久av| 成人精品在线看| 亚洲一区二区| 日韩亚洲欧美中文高清在线| 在线观看日韩精品视频| 日韩在线网址| 欧美电影在线免费观看| 99视频精品免费| 婷婷电影在线观看| 亚洲成人第一页| 日本一道在线观看| 好操啊在线观看免费视频| 久久久99精品免费观看不卡| 国产欧美一区二区视频| 国产福利资源在线| 国产一区二区女| 国产欧美日韩综合精品| 国产99免费视频| 蘑菇福利视频一区播放| 91精品国产91久久久久| 国产真实夫妇交换视频| 亚洲无毛电影| 久久久久亚洲精品| 国产一级在线观看视频| 韩日成人在线| 久久久久久久久久av| 免费中文字幕视频| 国产精品v日韩精品v欧美精品网站| 久久亚洲电影天堂| 日韩一级片av| 欧美日韩影院| 久久久久久久97| 日韩无码精品一区二区三区| 在线免费观看欧美| 2019中文字幕免费视频| 91玉足脚交嫩脚丫在线播放| 久久动漫亚洲| 国产精品久久久久久久av电影| 69视频免费看| 精品亚洲国产成人av制服丝袜| 成人性生交大片免费看视频直播 | 色丁香久综合在线久综合在线观看| 大陆极品少妇内射aaaaa| 亚洲国产福利| 欧美三级电影网站| 一级片黄色免费| 66精品视频在线观看| 亚洲国产小视频在线观看| 亚洲AV无码国产精品| 国产aⅴ精品一区二区三区久久| 国产性猛交xxxx免费看久久| a一级免费视频| 欧美日本国产| 7m精品福利视频导航| 69xxxx国产| 精品一区二区三区在线观看| www日韩av| 你懂的在线看| 中文字幕一区日韩精品欧美| 日韩成人三级视频| 欧美成人免费电影| 欧美男男青年gay1069videost | 自拍偷拍色综合| 精品午夜一区二区三区在线观看 | 亚洲精品免费在线观看视频| 26uuu精品一区二区| 在线视频不卡一区二区| www.九色在线| 欧美日韩国产精品自在自线| 日本美女视频网站| 成人嫩草影院| 国内精品一区二区三区四区| 丰满人妻一区二区三区四区| 国产成人综合网站| 少妇免费毛片久久久久久久久| 黄色小网站在线观看| 福利视频第一区| 性久久久久久久久久久久久久| 精品视频在线你懂得| 日韩色av导航| 国产精品theporn动漫| 蜜桃在线一区二区三区| 国产视频在线观看一区| 大片免费在线看视频| 欧美日韩一区二区在线| 四虎国产精品永久免费观看视频| 日韩超碰人人爽人人做人人添| 久久精品男人天堂| 无码人妻aⅴ一区二区三区有奶水| 国产精品亚洲а∨天堂免在线| 区一区二区三区中文字幕| 欧美78videosex性欧美| 欧美日韩精品三区| 性久久久久久久久久| 亚洲福利久久| 51午夜精品| 91官网在线| 色老综合老女人久久久| 日韩精品人妻中文字幕有码 | 99精品人妻少妇一区二区 | 日韩欧美国产高清| 人与动物性xxxx| 免费在线观看精品| 蜜桃视频在线观看成人| av在线不卡免费| 欧美mv日韩mv亚洲| 青青草国产在线观看| 久久成人免费电影| 亚洲精品中文字幕乱码三区不卡| 怡红院成人在线| 亚洲女人初尝黑人巨大| 日韩黄色一级大片| av成人免费在线| 日韩日韩日韩日韩日韩| 91麻豆精品激情在线观看最新| 久久精品在线视频| 国产精品-色哟哟| 一区免费观看视频| 手机免费看av网站| 国产精品国产一区| 成人黄色激情网| 久久久久久国产精品免费无遮挡| 欧美日韩成人综合| 天天爽天天爽天天爽| 久久国产人妖系列| 资源网第一页久久久| 亚洲黑人在线| 欧美成人在线免费视频| а√天堂资源在线| 亚洲一区二区五区| 国产真实乱人偷精品| 国产一区二区三区久久久久久久久| 国产伦精品一区二区三区高清版| av老司机免费在线| 日韩国产欧美精品在线| 黄色一级视频免费看| 国产三级欧美三级| 伊人色在线观看| 中文字幕一区二区三区乱码图片| 97在线中文字幕| 不卡av免费观看| 日韩黄色高清视频| 国产精品xxxxxx| 亚洲欧洲精品一区二区三区| 能看毛片的网站| 雨宫琴音一区二区在线| 欧美日韩中文国产一区发布| 成人福利片在线| 久久成年人视频| 人人妻人人澡人人爽久久av| 色欧美日韩亚洲| 欧美精品久久久久久久久46p| 国产成人免费视频精品含羞草妖精| 久久久久久久久久网| 国产不卡av一区二区| 91精品久久久久久久久久久久久| 性欧美猛交videos| 日韩精品高清视频| 国产又色又爽又黄又免费| 亚洲成a人v欧美综合天堂下载| 性欧美丰满熟妇xxxx性仙踪林| 蜜桃传媒麻豆第一区在线观看| 黄色成人在线免费观看| 亚洲v天堂v手机在线| 成人h视频在线观看播放| 丁香花高清在线观看完整版| 亚洲视频综合网| 精品久久人妻av中文字幕| 岛国精品视频在线播放| 五月综合色婷婷| 97精品久久久午夜一区二区三区 | 久久这里只有精品8| 亚洲国产国产| 999国产在线| 51一区二区三区| 久久久久一本一区二区青青蜜月| av资源种子在线观看| 欧美成人a视频| 中文字幕在线视频第一页| 亚洲成av人影院| 5566中文字幕| 91麻豆精品一区二区三区| 性久久久久久久久久久久久久| 日韩精品国产欧美| 青青青青草视频| 亚洲欧美网站在线观看| 日本一区二区三区www| 91精品国产自产精品男人的天堂| 国产精品亚洲美女av网站| 成年女人在线看片| 欧美精品在线免费| 在线看黄色av| 亚洲视频第一页| 香蕉视频网站在线| 精品少妇一区二区三区日产乱码| 91久久久久久久久久久久| 色婷婷精品久久二区二区蜜臀av| 日韩欧美中文字幕一区二区| 一区二区三区精密机械公司| av在线免费播放网址| 久久久久99精品一区| 免费的av网站| 国产福利视频一区二区三区| 91福利免费观看| 麻豆精品在线观看| 牛夜精品久久久久久久| 丝袜诱惑制服诱惑色一区在线观看 | 欧美国产日本| 国产又黄又爽免费视频| 日韩精品欧美激情一区二区| 欧美精品久久久| 亚洲三级精品| 欧美激情导航| 少妇精品久久久| 欧美1o一11sex性hdhd| 日韩欧美ww| 久久精品aaaaaa毛片| 开心激情综合| 噜噜噜噜噜久久久久久91| 日韩大胆成人| 欧美日韩精品免费看| 亚州精品视频| 欧美性大战久久久久| 久久99国内| 色综合久久av| 欧美电影《睫毛膏》| 日本不卡一区二区三区四区| 一区二区三区四区日韩| www.男人天堂网| 亚洲精一区二区三区| 男人操女人逼免费视频| 老鸭窝91久久精品色噜噜导演| 91淫黄看大片| 久久成人精品无人区| 中文字幕在线视频一区二区| 国产精品亚洲综合一区在线观看| 特级特黄刘亦菲aaa级| 99国产精品久久久久久久久久久 | 亚洲精品国产精品乱码不99| 免费麻豆国产一区二区三区四区| 亚洲国产精品久久一线不卡| 一级片中文字幕| 在线精品国精品国产尤物884a| 18国产免费视频| 日韩三级免费观看| 亚洲人视频在线观看| 国产亚洲欧洲高清| 岛国中文字幕在线| 97在线看免费观看视频在线观看| 肉色欧美久久久久久久免费看| 国产美女91呻吟求| 凹凸av导航大全精品| 欧美不卡福利| 亚洲成人av| av免费中文字幕| 久久99国产精品久久| 伊人久久一区二区三区| 国产午夜精品一区二区三区视频| 老熟妻内射精品一区| 亚洲电影第三页| 中文字幕在线观看高清| 精品人在线二区三区| 国产在线观看黄| 欧美激情一区二区三区在线视频观看| 中文一区一区三区高中清不卡免费 | 久久黄色精品视频| 欧美区视频在线观看| 少妇喷水在线观看| 久久久国产视频| 这里有精品可以观看| 成人欧美一区二区三区在线观看| 免费电影一区二区三区| 亚洲乱码日产精品bd在线观看| 丝袜亚洲另类欧美| 性活交片大全免费看| 国产精品国产三级国产aⅴ中文 | 欧美日韩你懂得| 五月色婷婷综合| 欧美成人免费小视频| 成人交换视频| 久久精品国产美女| 欧美女人交a| 伊人影院综合在线| 久久久精品2019中文字幕之3| 青娱乐免费在线视频| 欧美日韩小视频| 黄色片视频在线观看| 久久久人成影片一区二区三区观看 | 91精品91久久久中77777| 国产综合视频在线| 久久亚洲国产精品| 国产极品一区| 日本在线视频不卡| 国产精品久久久久久模特| 亚洲精品一二三四| 亚洲欧洲精品天堂一级| 精品国产青草久久久久96| 亚洲人成在线免费观看| av成人 com a| 国产欧美日韩综合精品二区| 欧美日韩1080p| 国产一级片中文字幕| 亚洲天堂2016| 91美女精品网站| 色偷偷888欧美精品久久久| 欧美free嫩15| 日韩电影大全在线观看| 久久久久国内| 老鸭窝一区二区| 色偷偷久久人人79超碰人人澡| 天堂av在线免费| 97精品久久久| 日韩免费电影在线观看| 男女午夜激情视频| 91色在线porny| 免费看一级视频| 亚洲人成网在线播放| 国产v综合v| 亚洲v欧美v另类v综合v日韩v| 日韩一级在线| 黄色正能量网站| 91久久精品一区二区三| 成人在线免费视频| 国产精品电影一区| 首页国产精品| 亚洲高清视频免费| 亚洲精品国产视频| 丰满人妻熟女aⅴ一区| 久久久免费高清电视剧观看| 欧美色图婷婷| aaa毛片在线观看| 国产精品视频麻豆| 国产三级三级在线观看| 九九久久久久99精品| 一区中文字幕电影| 91国视频在线| 国产欧美视频一区二区| 一区二区三区免费在线| 欧美区在线播放| 亚洲ab电影| 天天看片天天操| 亚洲成人激情自拍| 成人在线视频成人| 99精品99久久久久久宅男| 亚洲第一网站| 99在线视频免费| 日韩视频免费观看高清完整版| av影片在线| 天天爽天天狠久久久| 国产精品一区三区| 久久国产视频一区| 精品国产拍在线观看| eeuss鲁片一区二区三区| 久久人妻精品白浆国产| 亚洲啪啪综合av一区二区三区| 欧洲成人一区二区三区| 国产精品91一区| 国产精品多人| www..com.cn蕾丝视频在线观看免费版| 欧美乱妇23p| 新版的欧美在线视频| 中文字幕剧情在线观看一区| 不卡电影免费在线播放一区| 欧美视频xxxx| 欧美激情极品视频| 俺要去色综合狠狠| 一级黄色免费视频| 欧美无砖砖区免费| 9765激情中文在线| 伊人久久大香线蕉av一区| 91玉足脚交白嫩脚丫在线播放| 夜夜骚av一区二区三区| 57pao精品| 欧美区亚洲区| 中文字幕美女视频| 亚洲免费福利视频|