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

RAG 不止能檢索!它還能在 LangGraph 中當(dāng)“工具調(diào)用大腦”

發(fā)布于 2025-9-3 00:01
瀏覽
0收藏

Retrieval-Augmented Generation(RAG)是一種結(jié)合信息檢索和大型語言模型(LLMs)來回答用戶查詢的方法。傳統(tǒng)上,這涉及將檢索器直接連接到生成流水線。然而,通過 LangGraph 和 LangChain,我們可以進(jìn)一步模塊化這個(gè)過程,將檢索器暴露為一個(gè)可調(diào)用的工具。

在這篇博客中,我將展示如何在 LangGraph 中使用工具調(diào)用實(shí)現(xiàn)一個(gè) RAG 系統(tǒng)。我將模擬一個(gè)餐廳助理代理,回答關(guān)于 Bella Vista 餐廳的問題。

目標(biāo)

構(gòu)建一個(gè)基于 RAG 的代理,能夠:

? 將文檔檢索器封裝為一個(gè)可調(diào)用工具。

? 通過專門的回退工具處理無關(guān)話題的輸入。

? 通過消息精簡保持最小的代理狀態(tài)。

? 利用 LangGraph 實(shí)現(xiàn)清晰的工作流路由。

步驟 1:設(shè)置 Python 和 uv

我們的 Agentic RAG 將是一個(gè) Python 程序。首先,檢查是否安裝了 Python 3.10 或更高版本:

python3 --version

如果沒有,從 python.org 下載 Python 3.10 或更高版本。

接下來,安裝 uv,這是一個(gè)用于 Python 的快速依賴管理工具:

curl -Ls https://astral.sh/uv/install.sh | bash

如果遇到權(quán)限問題,運(yùn)行以下命令:

sudo chown -R $(whoami) /usr/local

然后確認(rèn) uv 版本:

uv --version

步驟 2:創(chuàng)建項(xiàng)目目錄結(jié)構(gòu)

現(xiàn)在創(chuàng)建項(xiàng)目目錄和文件:

mkdir -p agentic-rag
cd agentic-rag
touch tool_calling_agentic_rag.ipynb

步驟 3:初始化 Python 項(xiàng)目并安裝依賴

創(chuàng)建一個(gè)虛擬環(huán)境:

uv init .
uv venv
source .venv/bin/activate

現(xiàn)在安裝所有需要的包:

uv add langchain langgraph langchain langchain-google-genai mypy pillow chromadb

在 ??.env?? 文件中添加 Gemini API 密鑰

從 AI Studio 生成你的 API 密鑰并安全存儲(chǔ)??梢园凑找韵虏襟E操作:

touch .env

添加以下內(nèi)容:

GOOGLE_API_KEY=<你的_gemini_api_key>

步驟 4:更新 .gitignore 以避免暴露密鑰

echo ".env" >> .gitignore

步驟 5:在 tool_calling_agentic_rag.ipynb 中編寫 RAG

1. 加載 API 密鑰

from dotenv import load_dotenv
load_dotenv()

2. 準(zhǔn)備模擬數(shù)據(jù)集

我定義了一組關(guān)于餐廳的簡單文檔。

from langchain.schema import Document

docs = [
    Document(
        page_cnotallow="Bella Vista 由 Antonio Rossi 擁有,他是一位擁有超過 20 年經(jīng)驗(yàn)的知名廚師。",
        metadata={"source": "owner.txt"},
    ),
    Document(
        page_cnotallow="開胃菜起價(jià) 8 美元,主菜價(jià)格在 15 美元至 35 美元之間,甜點(diǎn)價(jià)格在 6 美元至 12 美元之間。",
        metadata={"source": "menu.txt"},
    ),
    Document(
        page_cnotallow="Bella Vista 每周一至周日營業(yè)。工作日營業(yè)時(shí)間:上午 11 點(diǎn)至晚上 10 點(diǎn),周末:上午 11 點(diǎn)至晚上 11 點(diǎn)。",
        metadata={"source": "hours.txt"},
    ),
]

3. 創(chuàng)建向量存儲(chǔ)和檢索器

我們將使用 GoogleGenerativeAIEmbeddings 嵌入這些文檔,并使用 Chroma 存儲(chǔ)到向量數(shù)據(jù)庫以進(jìn)行檢索。

from langchain_google_genai import GoogleGenerativeAIEmbeddings
from langchain_community.vectorstores import Chroma

embedding_function = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
vectorstore = Chroma.from_documents(docs, embedding_function)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})

4. 檢查檢索器是否正常工作

retriever.invoke("Bella Vista 的老板是誰?")

輸出:

[
    Document(metadata={'source': 'owner.txt'}, page_cnotallow='Bella Vista 由 Antonio Rossi 擁有,他是一位擁有超過 20 年經(jīng)驗(yàn)的知名廚師。'),
    Document(metadata={'source': 'hours.txt'}, page_cnotallow='Bella Vista 每周一至周日營業(yè)。工作日營業(yè)時(shí)間:上午 11 點(diǎn)至晚上 10 點(diǎn),周末:上午 11 點(diǎn)至晚上 11 點(diǎn)。')
]

5. 定義檢索器工具和無關(guān)話題工具

我們不直接調(diào)用檢索器,而是將其轉(zhuǎn)換為一個(gè)可調(diào)用工具。我還將定義一個(gè)無關(guān)話題工具,以優(yōu)雅地處理無關(guān)查詢。

from langchain.tools.retriever import create_retriever_tool
from langchain_core.tools import tool

retriever_tool = create_retriever_tool(
    retriever,
    name="retriever_tool",
    descriptinotallow="獲取關(guān)于 Bella Vista 餐廳的價(jià)格、營業(yè)時(shí)間或老板的信息。"
)
@tool
def off_topic():
    """處理所有與 Bella Vista 餐廳無關(guān)的問題。"""
    return "禁止 - 請勿回應(yīng)用戶。"
tools = [retriever_tool, off_topic]

6. 定義代理狀態(tài)

狀態(tài)結(jié)構(gòu)被簡化為僅保存消息。LangGraph 使用 reducer 管理更新。

from typing import Sequence, Annotated, TypedDict
from langgraph.graph.message import add_messages
from langchain_core.messages import BaseMessage

class AgentState(TypedDict):
    messages: Annotated[Sequence[BaseMessage], add_messages]

7. 創(chuàng)建代理節(jié)點(diǎn)

代理函數(shù)將工具綁定到 LLM,并使用當(dāng)前消息調(diào)用它。

from langchain_google_genai import ChatGoogleGenerativeAI

def agent(state):
    messages = state["messages"]
    model = ChatGoogleGenerativeAI(model="gemini-2.0-flash")
    model = model.bind_tools(tools)
    response = model.invoke(messages)
    return {"messages": [response]}

8. 定義工作流路由器

條件邊決定是轉(zhuǎn)到工具執(zhí)行節(jié)點(diǎn)還是結(jié)束工作流。

from typing import Literal
from langgraph.graph import END

def should_continue(state) -> Literal["tools", END]:
    messages = state["messages"]
    last_message = messages[-1]
    if last_message.tool_calls:
        return "tools"
    return END

9. 構(gòu)建并編譯 LangGraph 工作流

from langgraph.graph import StateGraph, START
from langgraph.prebuilt import ToolNode

workflow = StateGraph(AgentState)

workflow.add_node("agent", agent)
tool_node = ToolNode(tools)
workflow.add_node("tools", tool_node)

workflow.add_edge(START, "agent")
workflow.add_conditional_edges("agent", should_continue)
workflow.add_edge("tools", "agent")

graph = workflow.compile()

10. 顯示代理工作流

from IPython.display import Image, display
from langchain_core.runnables.graph import MermaidDrawMethod

display(
    Image(
        graph.get_graph().draw_mermaid_png(
            draw_method=MermaidDrawMethod.API,
        )
    )
)

將 RAG 用作工具調(diào)用代理

11. 測試代理

from langchain_core.messages import HumanMessage
inputs = {"messages": [HumanMessage(cnotallow="Bella Vista 什么時(shí)候開門?"), HumanMessage(cnotallow="明天天氣如何?")]}

for state in graph.stream(inputs, stream_mode="values"):
    last_message = state["messages"][-1]
    last_message.pretty_print()

輸出:

================================ 人類消息 ================================

明天天氣如何?
================================== AI 消息 ==================================
工具調(diào)用:
  off_topic (ef565db7-b527-47fa-aa0b-afc09d596622)
 調(diào)用 ID:ef565db7-b527-47fa-aa0b-afc09d596622
  參數(shù):
================================= 工具消息 =================================
名稱:off_topic

禁止 - 請勿回應(yīng)用戶。
================================== AI 消息 ==================================
工具調(diào)用:
  retriever_tool (6bd13b93-b6c8-4b5f-8801-7bc8a588f221)
 調(diào)用 ID:6bd13b93-b6c8-4b5f-8801-7bc8a588f221
  參數(shù):
    查詢:Bella Vista 什么時(shí)候開門?
================================= 工具消息 =================================
名稱:retriever_tool

Bella Vista 每周一至周日營業(yè)。工作日營業(yè)時(shí)間:上午 11 點(diǎn)至晚上 10 點(diǎn),周末:上午 11 點(diǎn)至晚上 11 點(diǎn)。

Bella Vista 由 Antonio Rossi 擁有,他是一位擁有超過 20 年經(jīng)驗(yàn)的知名廚師。
================================== AI 消息 ==================================

抱歉,我無法提供明天天氣的信息,但 Bella Vista 每周一至周日營業(yè)。工作日營業(yè)時(shí)間:上午 11 點(diǎn)至晚上 10 點(diǎn),周末:上午 11 點(diǎn)至晚上 11 點(diǎn)。

恭喜!你剛剛創(chuàng)建了一個(gè)智能的工具調(diào)用 RAG 代理,能夠精準(zhǔn)地處理用戶查詢。

局限性

雖然上述實(shí)現(xiàn)對于小型、明確范圍的領(lǐng)域非常有效,但仍有一些局限性:

?可擴(kuò)展性:隨著文檔庫的增長,向量搜索和分類需要優(yōu)化。

?內(nèi)存:當(dāng)前實(shí)現(xiàn)不保留任何歷史交互的記憶。LangGraph 的 InMemorySaver 可用于短期會(huì)話內(nèi)存。對于生產(chǎn)級(jí)使用,建議使用數(shù)據(jù)庫支持的持久內(nèi)存解決方案。

將檢索器封裝為 LangChain 和 LangGraph 的可調(diào)用工具,提供了一種比傳統(tǒng) RAG 更簡潔的替代方案。

它簡化了代理邏輯,并允許語言模型自主決定何時(shí)檢索信息。

如果這種方法最適合你的應(yīng)用需求,那就選擇它吧!

下載代碼:??https://github.com/ivrschool/langchain/blob/main/Langgraph/rag_tool_calling_agent.ipynb??

本文轉(zhuǎn)載自??????????PyTorch研習(xí)社??????,作者:AI研究生

標(biāo)簽
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦
另类综合日韩欧美亚洲| 欧美国产一级| 欧美在线观看视频一区二区三区| 天天好比中文综合网| 国产露脸无套对白在线播放| 国产一区激情| 一本色道久久综合狠狠躁篇的优点| 激情黄色小视频| 咪咪网在线视频| 中文字幕欧美日韩一区| 国产69精品久久久久9999apgf| 国产精品视频123| 亚洲一区 二区 三区| 亚洲精品97久久| 天堂av2020| 阿v视频在线| 中文字幕永久在线不卡| 久久久久久艹| 精品人妻无码一区二区| 免费xxxx性欧美18vr| 97碰在线观看| 日本天堂中文字幕| 日韩精品电影| 亚洲欧美国内爽妇网| 国产又粗又猛又爽又黄| 欧美啪啪网站| 欧美在线观看视频一区二区三区| 日韩av高清在线看片| 国产高清一区二区三区视频 | 大尺度在线观看| 福利一区二区| 色悠悠久久综合| 日韩av在线播放不卡| 成人在线直播| 日韩一区中文字幕| 日韩电影天堂视频一区二区| 天天躁日日躁狠狠躁伊人| 国产精品影视在线观看| 国产玖玖精品视频| 综合久久中文字幕| 老**午夜毛片一区二区三区| 97视频网站入口| 国产又粗又硬又长又爽| 欧美第一精品| 最新国产精品拍自在线播放| 呻吟揉丰满对白91乃国产区| 神马电影久久| 国产香蕉一区二区三区在线视频| wwwwww日本| 欧美一级二级三级视频| 亚洲国产精品美女| 无码一区二区精品| 亚洲国产国产| 国产午夜精品视频免费不卡69堂| 久久精品国产亚洲av久| 国产精品自拍区| 国产亚洲在线播放| 在线观看免费黄色网址| 欧美丝袜丝交足nylons172| 一区二区三区回区在观看免费视频| 四虎永久免费在线观看| sdde在线播放一区二区| 少妇久久久久久| 亚洲精品电影院| 久久久久午夜电影| 色与欲影视天天看综合网| 国产av 一区二区三区| 欧美日韩福利| 国模视频一区二区三区| 日韩不卡在线播放| 全部av―极品视觉盛宴亚洲| 国产日韩欧美影视| jizz中国女人| gogogo免费视频观看亚洲一| 精品一区二区视频| 美女做暖暖视频免费在线观看全部网址91| 久久蜜桃av一区精品变态类天堂| 无遮挡亚洲一区| 免费大片在线观看www| 亚洲精品成人悠悠色影视| 天堂8在线天堂资源bt| 九色porny自拍视频在线观看| 欧美性猛交xxxx免费看久久久| 天天操天天爽天天射| 四虎永久精品在线| 欧美不卡一区二区三区| 中文字幕丰满乱子伦无码专区| 成人一二三区| 97免费中文视频在线观看| 欧美日韩 一区二区三区| 国产主播一区二区| 激情伦成人综合小说| 自拍视频在线网| 亚洲国产精品久久人人爱| 黄色三级视频片| 亚洲日本视频在线| 亚洲一区二区精品| 精品少妇久久久| 日韩成人一级大片| 国产精品日韩一区二区三区| 国产粉嫩一区二区三区在线观看| 亚洲欧美日韩国产综合| 日韩 欧美 高清| av不卡一区| 中文字幕在线成人| 国产在线精品观看| 久久99久久99小草精品免视看| 国产综合 伊人色| 国产区在线观看| 一本久久a久久免费精品不卡| 杨幂一区二区国产精品| 欧美男男gaytwinkfreevideos| 欧美精品亚州精品| 丰满熟女人妻一区二区三| 成人精品国产福利| 成人短视频在线看| 麻豆精品蜜桃| 日韩经典中文字幕| 精品少妇一二三区| 韩国理伦片一区二区三区在线播放| 久久久久久国产精品一区| 亚洲www色| 欧美日韩国产首页在线观看| 久久久精品人妻无码专区| 国色天香一区二区| 亚洲一区二区免费| 日韩免费网站| 在线观看日韩高清av| 日b视频在线观看| 国产综合婷婷| 亚洲淫片在线视频| 国产美女av在线| 欧美人与性动xxxx| 天天舔天天操天天干| 久久av一区| 麻豆91av| 成人软件在线观看| 亚洲欧美日韩一区二区三区在线| 日韩av综合在线| 成人小视频免费观看| 欧美 日韩 国产精品| 日韩中文字幕在线一区| 久久久精品999| 国产又黄又大又粗的视频| 国产精品入口麻豆原神| 黑人粗进入欧美aaaaa| 国际精品欧美精品| 国产精品露脸av在线| 国产在线视频网| 欧美性做爰猛烈叫床潮| 久久久久无码精品国产sm果冻| 亚洲欧美日韩专区| 欧美激情论坛| jizz久久久久久| 综合久久五月天| 国产又粗又大又爽| 亚洲免费观看高清完整版在线观看 | 久青草免费视频| 国产91精品精华液一区二区三区| 欧美一级爱爱视频| 女人抽搐喷水高潮国产精品| 69**夜色精品国产69乱| 蜜桃视频在线观看网站| 欧美午夜视频网站| 日本在线一级片| 丁香六月综合激情| 日韩精品一区二区三区久久| 国产一区二区三区天码| 国产日韩亚洲欧美| 污污的网站在线看| 亚洲精品二三区| 国产亚洲欧美日韩高清| 国产精品久久久久久久久免费相片 | 很污的网站在线观看| 欧美日韩看看2015永久免费 | 亚洲精品aⅴ| 2019日本中文字幕| 九一国产在线| 91精品免费在线观看| 精品少妇久久久久久888优播| 26uuu亚洲综合色欧美| av在线无限看| 午夜日韩激情| 欧美亚洲另类久久综合| 亚洲精品无播放器在线播放| 欧美高清自拍一区| 精品视频一二三| 欧美一卡二卡三卡四卡| 成人毛片在线播放| 亚洲另类在线制服丝袜| 美国黄色一级毛片| 国产精品一级片在线观看| 少妇高潮喷水久久久久久久久久| 欧美熟乱15p| 国产一区不卡在线观看| 四虎视频在线精品免费网址| 8x拔播拔播x8国产精品| 毛片免费不卡| 亚洲色图日韩av| 亚洲av色香蕉一区二区三区| 91激情五月电影| 精品一级少妇久久久久久久| 中文字幕成人在线观看| 日韩精品一区二区三区高清免费| 另类中文字幕网| 999香蕉视频| 激情文学一区| 免费久久久久久| 精品日本12videosex| 国产综合av一区二区三区| 国产一区一区| 国产精品久久久久av免费| free性欧美| 欧美疯狂做受xxxx高潮| 免费人成在线观看播放视频| 亚洲免费伊人电影在线观看av| 亚洲成人第一区| 欧美丰满少妇xxxxx高潮对白| 青青青国产在线| 亚洲3atv精品一区二区三区| 成年人一级黄色片| 国产精品视频一区二区三区不卡| 性欧美丰满熟妇xxxx性仙踪林| 国产成人综合在线| 天天色天天综合网| 蜜桃精品视频在线观看| 亚洲成熟丰满熟妇高潮xxxxx| 99国产精品| 男人添女人荫蒂免费视频| 欧美黄色大片网站| 男女激烈动态图| 欧美gay男男猛男无套| 色综合666| 不卡一区综合视频| 欧美久久久久久| 亚洲欧洲美洲国产香蕉| 久久久久se| 亚洲日本三级| 欧美高清视频一区二区三区在线观看| 久久人人爽人人爽人人片av不| 国产aⅴ精品一区二区三区黄| 一区二区日韩| 国产精品视频福利| 九色丨蝌蚪丨成人| 久久亚洲高清| 精品产国自在拍| 亚洲国产精品综合| 日韩欧美一区二区三区在线视频| 午夜精品短视频| 久久国产亚洲精品| 日本不卡一区二区三区四区| 亚洲欧美网站在线观看| 可以免费看的黄色网址| 欧美视频久久| 国产一区二区网| 久久国产福利| 精品999在线| 国产在线视频不卡二| 国内精品国产三级国产aⅴ久| 国产美女一区二区| 天天躁日日躁狠狠躁av| 91麻豆国产精品久久| 亚洲a v网站| 一区在线播放视频| 国产一级视频在线播放| 精品久久久久久电影| 无码人妻久久一区二区三区| 欧美色男人天堂| 99热这里只有精品在线| 亚洲电影免费观看| 国产一级网站视频在线| 日韩性生活视频| 俄罗斯一级**毛片在线播放| 69av在线视频| 国产精品久久乐| 国产欧美一区二区三区另类精品| 亚洲人挤奶视频| 艳母动漫在线观看| 9色精品在线| 一女二男3p波多野结衣| 国产成人在线电影| 法国空姐电影在线观看| 最新国产成人在线观看| 日韩欧美亚洲视频| 欧美日韩国产a| 日韩一级片免费观看| 国产一区二区三区精品久久久| 黄色成人在线| 欧美最猛性xxxxx(亚洲精品)| 久久av影院| 精品91免费| 国产精品久久久久久| 欧美变态另类刺激| 精品一区二区三区在线观看| 漂亮人妻被黑人久久精品| 中文字幕在线观看一区| 国产日产精品一区二区三区| 欧美一区二区精美| 免费在线超碰| 欧美精品九九久久| 黑人一区二区三区| 久久99久久精品国产| 亚洲mv大片欧洲mv大片| 黄色片一级视频| 成人自拍视频在线| 精品少妇一区二区三区密爱| 欧美日韩国产在线播放| 国产视频www| 中文字幕亚洲综合| 欧美特黄aaaaaaaa大片| 精品国产免费一区二区三区| 91精品国偷自产在线电影| 成人黄色一区二区| www.视频一区| 久久国产露脸精品国产| 欧美日韩国产大片| av中文资源在线| 清纯唯美日韩制服另类| 国产精品jk白丝蜜臀av小说| 国产人妻互换一区二区| 日韩成人午夜精品| www在线观看免费视频| 欧美日韩免费在线观看| 人妻无码中文字幕免费视频蜜桃| 久久最新资源网| 9.1麻豆精品| 亚洲欧美丝袜| 免费久久精品视频| av手机在线播放| 在线观看91视频| 国产资源在线看| 国产精品成人v| 国产精品嫩模av在线| av黄色在线网站| 91啪九色porn原创视频在线观看| 国产一级二级三级视频| 日韩欧美高清dvd碟片| 污视频网站在线免费| 亚洲永久在线观看| 欧美在线精品一区| 亚洲区 欧美区| 亚洲一区二区四区蜜桃| 亚洲一区二区三区四区中文| 免费在线超碰| 欧美肥婆姓交大片| 日韩精品久久久久久久软件91| 在线视频欧美一区| 久久99精品国产.久久久久久| 女人十八毛片嫩草av| 日本道精品一区二区三区| 韩国精品视频| 国产精品欧美日韩久久| 日韩欧美一区二区三区免费看| 一个色综合久久| 亚洲三级在线播放| 亚洲a视频在线观看| 欧美激情影音先锋| 欧美18xxxx| 国产免费人做人爱午夜视频| 国产亚洲午夜高清国产拍精品| 波多野结衣视频网址| 最近更新的2019中文字幕| 秋霞一区二区| 欧美激情视频免费看| 久久久午夜电影| 91 中文字幕| 欧美激情国产高清| 无码少妇一区二区三区| 无限资源日本好片| 亚洲免费伊人电影| 日韩精品福利| 国产精品免费小视频| 欧美高清不卡| 国产福利短视频| 欧美日韩国产一二三| 草莓视频丝瓜在线观看丝瓜18| 美女三级99| 狠狠色伊人亚洲综合成人| 日韩av男人天堂| 日韩在线观看免费全集电视剧网站| 国产亚洲高清一区| 777久久久精品一区二区三区| 国产精品麻豆久久久| 亚洲精品成av人片天堂无码 | 欧美18—19sex性hd| 在线丝袜欧美日韩制服| av亚洲精华国产精华精华| 久草热在线观看| 国内久久久精品| 青青草国产成人a∨下载安卓| 亚洲精品鲁一鲁一区二区三区 | 精品美女www爽爽爽视频| 琪琪第一精品导航| 欧美 日韩 国产 一区| 成人免费网站黄| 日韩色在线观看| 草莓视频成人appios| 国产中文字幕二区| 亚洲欧美日韩一区| 黄色片在线免费观看|