精品欧美一区二区三区在线观看 _久久久久国色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??

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
收藏
回復
舉報
回復
相關推薦
视频在线一区二区| 91福利社在线观看| 国产成人精品日本亚洲11 | 午夜亚洲福利| 欧美一区二区三区小说| 日韩美女爱爱视频| 亚洲 精品 综合 精品 自拍| 三级欧美在线一区| 久久激情视频免费观看| 在线看黄色的网站| 澳门av一区二区三区| 亚洲视频每日更新| 国产亚洲情侣一区二区无| 精品国产xxx| 午夜影院欧美| 日韩精品中文字幕在线| 精品久久久99| 欧美gv在线观看| 国产精品成人一区二区艾草| 成人性色av| 在线免费一区二区| 国内精品美女在线观看| 亚洲天堂影视av| 日本成人在线免费观看| 欧美香蕉视频| 亚洲自拍偷拍网站| 无遮挡亚洲一区| 可以免费看毛片的网站| 久久精品国产久精国产爱| 韩国19禁主播vip福利视频| www.99热| 天堂综合网久久| 91精品国产综合久久香蕉的特点 | 中文字幕人妻一区二区在线视频| 五月综合激情| 国产视频综合在线| 伊人影院在线观看视频| 成人网ww555视频免费看| 亚洲一本大道在线| 国产精品99久久久久久大便| 日本一二三区在线视频| 久久精品二区亚洲w码| 欧美最顶级的aⅴ艳星| 国产一级性生活| 久久精品免费一区二区三区| 中文字幕成人在线| 一级黄色性视频| 思热99re视热频这里只精品| 精品久久国产老人久久综合| 污污的视频免费| 亚洲高清黄色| 狠狠色香婷婷久久亚洲精品| 97视频久久久| 搞黄网站在线看| 亚洲精品免费视频| 日本黄xxxxxxxxx100| 免费人成在线观看播放视频| 欧美国产成人精品| 色视频一区二区三区| 蜜臀av午夜精品| 国产+成+人+亚洲欧洲自线| 亚洲一区二区三| 91精品人妻一区二区三区果冻| 国产日韩欧美一区在线| 性色av香蕉一区二区| 日韩av一二三区| 伊人精品视频| 97av视频在线| 日本高清不卡码| 久久国产毛片| 国产成人精品在线| 懂色av蜜臀av粉嫩av喷吹| 日韩影院精彩在线| 国产日韩精品综合网站| 国产精品探花视频| 国产成人免费视| 国产精品一区二区三区在线| 日韩在线观看视频一区| 91蜜桃传媒精品久久久一区二区| 国产精品视频免费观看| 日本黄视频在线观看| wwww国产精品欧美| 日韩在线电影一区| 伦xxxx在线| 亚洲一区二区三区四区在线免费观看| 亚洲免费精品视频| 成人免费视屏| 午夜电影久久久| 妞干网在线免费视频| av免费在线一区| 欧美日韩大陆在线| 精品少妇人妻av一区二区三区| 国产一区二区在线视频你懂的| 精品欧美乱码久久久久久1区2区| 国产调教打屁股xxxx网站| 巨人精品**| 国产一区二区三区三区在线观看| 99久久久无码国产精品衣服| 99精品视频在线观看播放| 欧美二区在线播放| 欧美精品韩国精品| 韩国成人在线视频| 狠狠色综合一区二区| 触手亚洲一区二区三区| 亚洲欧美日韩一区二区| 日批视频在线免费看| 免费成人黄色网| 欧美精品一区二区久久久| 美女洗澡无遮挡| 久久久久久久久久久妇女| 91大神福利视频在线| 国产又粗又猛又爽又黄视频| 99精品视频中文字幕| 伊人情人网综合| 国产夫妻在线播放| 欧美日韩国产乱码电影| 亚洲久久久久久| 99视频精品全部免费在线视频| 欧美激情视频一区二区三区不卡| 99re这里只有精品在线| 国产成人av影院| 亚洲欧美国产一区二区| bl视频在线免费观看| 欧美久久一二区| 国产精品无码毛片| 欧美91福利在线观看| 国产精品va在线播放我和闺蜜| 99国产精品久久久久久久成人| 91亚洲精品久久久蜜桃| 妺妺窝人体色www看人体| 国产成人免费9x9x人网站视频| 欧美一区二区三区视频免费 | 日产欧产va高清| 久久精品国产一区二区三 | 国产福利拍拍拍| 久久99国内精品| 日本一区二区三区四区高清视频| 污片在线免费观看| 7777精品伊人久久久大香线蕉经典版下载 | 久久综合九色九九| 99精品在线播放| 国产米奇在线777精品观看| 日本精品一区二区| 欧美日韩国产观看视频| 欧美一区二区三区免费| 日韩av网站在线播放| 久久综合九色综合欧美狠狠| 久久久久久国产精品mv| 888av在线视频| 精品国产三级电影在线观看| 手机在线免费看毛片| 精品亚洲国内自在自线福利| 亚洲欧美电影在线观看| 色综合视频一区二区三区日韩| 精品视频偷偷看在线观看| 国产一级特黄视频| www.在线成人| 拔插拔插海外华人免费| 激情亚洲另类图片区小说区| 久久久久久久久久久91| 亚洲国产精品欧美久久| 亚洲一区二区三区不卡国产欧美| 深夜做爰性大片蜜桃| 亚洲一区色图| 3d动漫啪啪精品一区二区免费 | 在线看片第一页欧美| 亚洲国产成人精品女人久久| 国产网站一区二区三区| 亚洲 欧美 日韩系列| 久久大综合网| 亚洲精品欧美日韩专区| 日本乱理伦在线| 亚洲成色777777在线观看影院 | 一区二区三区在线免费视频| 亚洲精品久久一区二区三区777 | 久久99精品久久久久久国产越南| 日韩久久不卡| 欧美日韩尤物久久| 久久精品成人欧美大片古装| 国产成人a人亚洲精品无码| 亚洲综合一区二区三区| 特级西西人体wwwww| 久久只有精品| 伊人色综合久久天天五月婷| 日韩中文字幕无砖| 97香蕉久久超级碰碰高清版| 蝌蚪视频在线播放| 欧美日韩色一区| 欧美日韩成人免费观看| 99精品视频一区二区| 国产福利影院在线观看| 亚洲精品99| 精品一区二区三区日本| 日韩一区国产在线观看| 国产51人人成人人人人爽色哟哟| 日韩综合小视频| 先锋在线资源一区二区三区| 国产午夜亚洲精品一级在线| 久久久之久亚州精品露出| 久久伊伊香蕉| 7777精品久久久大香线蕉| 国产在线精品观看| 中文久久乱码一区二区| 久久精品女同亚洲女同13| 三级欧美韩日大片在线看| 在线观看污视频| 香蕉视频一区| 96精品久久久久中文字幕| 鲁鲁在线中文| 久久久精品一区二区| 欧美在线一卡| 欧美电影免费提供在线观看| 日本免费在线观看视频| 伊人婷婷欧美激情| 特级西西www444人体聚色 | 无码久久精品国产亚洲av影片| 国产精品精品国产色婷婷| 制服丝袜在线第一页| 麻豆91精品视频| 激情综合在线观看| 欧美淫片网站| 亚洲春色综合另类校园电影| 99这里只有精品视频| 成人激情av在线| 另类专区亚洲| 国产做受高潮69| 乱人伦中文视频在线| 国产午夜精品全部视频播放| 搡老岳熟女国产熟妇| 91精品国模一区二区三区| 中文字幕av影视| 欧美性xxxxxx| 中文字幕在线观看免费视频| 亚洲视频在线一区观看| 成熟人妻av无码专区| 91在线精品一区二区| 精品伦一区二区三区| 国内精品国产三级国产a久久| av动漫在线观看| 精品福利电影| 国产制服91一区二区三区制服| 欧美伦理在线视频| 免费精品视频一区| 欧美男人操女人视频| 狠狠色综合一区二区| 成人福利一区| 成人免费看片网站| 亚洲一二av| 亚洲一区制服诱惑| 精品国模一区二区三区欧美| 国产精品一二区| 成人午夜亚洲| 国产精品电影一区| 日本肉肉一区| 国产精品青草久久久久福利99| 亚洲精华液一区二区三区| 性日韩欧美在线视频| 多野结衣av一区| 97免费视频在线播放| 极品视频在线| 奇米4444一区二区三区| 天堂在线中文网官网| 欧美一区在线直播| 天天免费亚洲黑人免费| 国产成人精品av| 欧美国产日韩电影| 国产精品免费一区| 未满十八勿进黄网站一区不卡| 国产精品免费视频xxxx| 四虎影视成人精品国库在线观看| 国产精品久久久久秋霞鲁丝| 91精品国产66| 国产精品爽黄69天堂a| 国产成+人+综合+亚洲欧美| 国产中文日韩欧美| 日韩欧美一级| 国模精品娜娜一二三区| 国模精品一区| 香蕉精品视频在线| 欧美日本一区二区高清播放视频| 欧美一级黄色录像片| 亚洲私人影院| 北条麻妃在线一区| 精品在线视频一区| 成年女人免费视频| 久久精品在线免费观看| 波多野结衣家庭教师在线观看| 国产精品欧美经典| 欧美成人片在线观看| 欧美日韩另类在线| 中文字幕你懂的| 日韩午夜在线播放| 视频三区在线观看| 日韩视频一区在线| av日韩国产| 国产精品久久久久久久久影视 | 亚洲娇小娇小娇小| 国产成人一区二区精品非洲| 好吊一区二区三区视频| 中文字幕不卡三区| 日本三级2019| 欧美日韩一区二区三区免费看| 99久久久国产精品无码网爆| 亚洲娇小xxxx欧美娇小| 91看片在线观看| 久久久久久网站| 成人精品国产亚洲| 国产日韩欧美一区二区三区四区| 亚洲国产欧美日韩在线观看第一区 | 超碰在线观看91| 欧美三片在线视频观看 | 69久久99精品久久久久婷婷| 五月婷婷丁香六月| 美女精品久久久| 毛片无码国产| 99久久自偷自偷国产精品不卡| 偷拍亚洲色图| 日韩中文字幕在线不卡| 爽好多水快深点欧美视频| 亚洲午夜久久久久久久久| 国产精品丝袜一区| 伊人手机在线视频| 精品美女一区二区| 免费a级在线播放| 日本高清久久天堂| 都市激情久久| 中文字幕一区二区三区乱码| 丝袜美腿一区二区三区| 少妇被狂c下部羞羞漫画| 亚洲欧美日韩中文字幕一区二区三区 | 岛国av一区二区三区| 中文字幕日本人妻久久久免费 | 99re91这里只有精品| 亚洲精品中文字幕乱码三区不卡| 欧美午夜影院| 男女污污视频网站| 欧美国产综合色视频| 国产精品21p| 亚洲精品理论电影| 韩国成人免费视频| av成人观看| 欧美涩涩视频| 免费欧美一级片| 综合在线观看色| 在线观看中文字幕网站| 在线观看成人黄色| 日韩在线观看不卡| 欧美一区二区三区四区在线观看地址 | 亚洲一卡二卡三卡| 亚洲在线观看| 性色av蜜臀av色欲av| 天天影视网天天综合色在线播放| 中文字幕视频免费观看| 这里只有精品视频在线| 在线一区视频观看| 一区二区三区久久网| 秋霞成人午夜伦在线观看| 夜夜春很很躁夜夜躁| 欧美亚洲国产一区二区三区 | 国产高潮在线| 韩国精品一区二区三区六区色诱| 欧美女激情福利| 韩国一区二区三区四区| 亚洲国产精品久久久久婷婷884| 国产三级午夜理伦三级| 欧美成人一区在线| 白白在线精品| 无码专区aaaaaa免费视频| a亚洲天堂av| 国产精品视频久久久久久久| 日韩精品视频三区| 午夜精品久久久久久久久久蜜桃| 精品不卡在线| 新67194成人永久网站| 人人妻人人藻人人爽欧美一区| 富二代精品短视频| 成人p站proumb入口| 国产日韩精品在线| 欧美成人69av| 免费看毛片的网站| 色欧美88888久久久久久影院| 国产在线观看高清视频| 国产精品一二三在线| 亚洲特级毛片| 精品人妻一区二区三区视频| 欧美在线观看18| 2024最新电影免费在线观看| 国产九色91| 日韩精彩视频在线观看| 九九精品视频免费| 亚洲经典中文字幕| 青青久久精品| 黄色大片中文字幕| 中文在线一区二区| 国产91免费看| 日韩av不卡电影| 亚洲午夜精品一区 二区 三区| 午夜影院福利社| 91福利精品第一导航| 五月花成人网|