精品欧美一区二区三区在线观看 _久久久久国色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)推薦
无码日韩精品一区二区免费| 手机在线看片1024| 激情亚洲影院在线观看| 白白色亚洲国产精品| 国模gogo一区二区大胆私拍| 你懂的av在线| 成人h动漫精品一区二区无码 | 一道本一区二区三区| 欧美日韩国产中文字幕 | 欧美mv和日韩mv的网站| av免费看网址| 国产一级免费在线观看| 免费人成精品欧美精品| xvideos国产精品| 人妻精品久久久久中文字幕69| 乱人伦中文视频在线| 国产成人综合在线| 国语对白做受69| 永久免费毛片在线观看| 国产999精品在线观看| 亚洲国产综合91精品麻豆| 蜜桃999成人看片在线观看| 中文字幕av免费观看| 欧美日本久久| 亚洲欧洲偷拍精品| 中文字幕一区二区在线观看视频| 波多野结衣在线高清| 久久久www成人免费无遮挡大片| 国产精品久久久久久影视| 色婷婷在线视频观看| 天堂99x99es久久精品免费| 欧美三级资源在线| 日韩黄色短视频| a天堂中文在线88| 懂色av一区二区在线播放| 欧洲精品在线视频| 欧美日韩午夜视频| 欧美中文一区| 日韩一区二区电影网| 日本午夜激情视频| 在线观看免费黄色| 97久久精品人人澡人人爽| 91人人爽人人爽人人精88v| 青青国产在线观看| 亚洲成人精品| 怡红院精品视频| 日韩免费高清一区二区| 91福利精品在线观看| 亚洲成人一区在线| 国产在线拍揄自揄拍无码| 你懂的视频在线观看| 国产不卡免费视频| 91精品久久久久久久久不口人| 日韩欧美中文字幕视频| 欧美日韩性在线观看| 亚洲精品97久久| 波多野结衣电影免费观看| 久久精品资源| 亚洲小说欧美激情另类| 9l视频自拍9l视频自拍| 成人亚洲综合天堂| 久久综合九色综合97婷婷女人| 亚洲最大激情中文字幕| 一级片一区二区三区| 久久99伊人| 97欧美精品一区二区三区| 色老板免费视频| 日韩啪啪电影网| 亚洲欧洲日本专区| 最新中文字幕视频| 青青一区二区| 亚洲激情电影中文字幕| 成年女人免费视频| av不卡一区| 精品国产乱码久久| 一级黄色电影片| 美女日韩一区| 日韩欧美中文一区| 亚洲精品久久一区二区三区777 | 中文天堂在线视频| 日韩在线播放一区二区| 欧美一乱一性一交一视频| 日本道在线观看| 制服诱惑一区二区| 中文字幕精品av| 国产亚洲精品精品精品| 波多野结衣在线观看一区二区| 亚洲视频777| 亚洲色图第四色| 久久精品国产www456c0m| 最近中文字幕日韩精品| 欧美日韩国产一二三区| 欧美电影一区| 欧美二区在线播放| 国产成人一区二区三区影院在线| 亚洲久久成人| 日韩av电影在线网| 中文天堂在线资源| 国产一区二区在线观看视频| 亚洲xxx自由成熟| 人妻偷人精品一区二区三区| 99精品在线观看视频| 欧美视频1区| 香港伦理在线| 一区二区三区成人| 日韩av综合在线观看| 天堂中文av在线资源库| 色哦色哦哦色天天综合| 亚洲xxx在线观看| 日本在线视频一区二区三区| 亚洲国产精品va在看黑人| a资源在线观看| 国内揄拍国内精品久久| 国产97色在线| 国产乱码精品一区二区| 99久久精品国产一区二区三区| 欧美日韩在线高清| 日本中文字幕伦在线观看| 亚洲精品国产第一综合99久久 | 美女搞黄视频在线观看| 欧美综合一区二区三区| 国产视频1区2区3区| 亚洲成人偷拍| 亚洲国产欧美自拍| 蜜桃视频无码区在线观看| 欧美一区二区三区红桃小说| 国产一区二区三区网站| 青青草手机在线视频| 午夜精品一区二区三区国产| 欧美精品一区二区免费| 蜜臀99久久精品久久久久小说| 久久精品72免费观看| 国产精品手机在线| 丝袜美腿美女被狂躁在线观看| 亚洲大尺度视频在线观看| 久久久久久香蕉| 9l视频自拍蝌蚪9l视频成人| 日韩中文字幕在线视频播放| 久久久久久久蜜桃| 人人狠狠综合久久亚洲| 99超碰麻豆| 99riav在线| 福利微拍一区二区| 国产人妖在线观看| 91欧美大片| 日产日韩在线亚洲欧美| 亚洲精品一区二区三区新线路| 国产精品日韩成人| 国产男女在线观看| 夜夜春很很躁夜夜躁| 日日狠狠久久偷偷综合色| 精品国产视频在线| 欧美日韩亚洲自拍| 中文字幕在线中文字幕在线中三区| 91成人免费在线视频| 免费看三级黄色片| 亚洲欧洲日韩| 国产精品一区二区三区久久| 欧美香蕉爽爽人人爽| 飘雪影视在线观看免费观看 | 夜色激情一区二区| 亚洲久久中文字幕| 竹菊久久久久久久| 日韩精品一区二区三区在线播放| 日韩中字在线观看| 国产精品久久久久久久久久久久久久久久久久 | 日韩av免费在线播放| 亚洲最大成人在线视频| 国产日韩v精品一区二区| 国产精品久久久久久av下载红粉 | 岛国av中文字幕| 99精品国产99久久久久久福利| 亚洲自拍偷拍色图| 久久中文字幕无码| 日韩精品欧美精品| 精品免费视频123区| 1234区中文字幕在线观看| 亚洲品质自拍视频| 91香蕉视频免费看| 欧洲精品久久久久毛片完整版| 欧美变态tickling挠脚心| 久久国产精品国语对白| 久草这里只有精品视频| 视频一区视频二区视频三区视频四区国产 | 亚洲奶大毛多的老太婆| 97超级碰碰| 久草在线青青草| 91久久精品日日躁夜夜躁欧美| 一区二区黄色片| 日韩午夜在线| 亚洲aaaaaa| 国产偷倩在线播放| 欧美影视一区二区三区| 91社区视频在线观看| 精品国产一级毛片| 97久久久免费福利网址| 可以在线观看的av网站| 欧美三区免费完整视频在线观看| 国产日产精品一区二区三区的介绍| 国产亚洲毛片在线| 色综合电影网| 中文不卡1区2区3区| 欧美日韩大陆在线| 校园春色 亚洲| 99视频国产精品| 久久久久人妻精品一区三寸| 欧美老女人另类| 91香蕉电影院| 亚洲av永久无码精品| brazzers在线观看| 亚洲精品在线观看网站| 国产微拍精品一区| 国产午夜精品一区二区三区嫩草 | 午夜激情在线观看| 日韩av网站大全| 7777久久亚洲中文字幕| 国产酒店精品激情| 欧美大片免费播放| 免费看久久久| 日韩av电影中文字幕| 黄色av电影在线播放| 亚洲第一搞黄网站| 成年人视频软件| 99久久综合狠狠综合久久| 欧美成人精品欧美一级乱| 五月精品视频| 久久精品国产精品国产精品污| 久久精品 人人爱| 欧美国产欧美亚洲国产日韩mv天天看完整| 青青九九免费视频在线| 欧美精品丝袜久久久中文字幕| caoporn91| 91在线高清观看| 亚洲不卡视频在线| 国产亚洲福利| 日本黄大片在线观看| 在线观看的网站你懂的| 成人黄色小视频在线观看| 人妻丰满熟妇av无码区app| 欧美三级黄美女| 欧美另类一区| 日韩三级网址| 国产精品久久久久久久久久99| 日本在线观看免费| 欧美日韩美少妇| 亚洲AV无码成人精品区东京热| 亚洲精品ww久久久久久p站| 久久久久久久毛片| 99久久免费视频.com| 日韩精品xxx| 日韩一区二区三区在线观看视频| 一区二区三区日韩在线观看| 中文字幕有码在线播放| 顶级嫩模精品视频在线看| 91插插插影院| 久久99久久99| 91视频免费版污| 免费永久网站黄欧美| 黄色一级视频片| 黄色成人在线网站| 国产激情在线看| 91高清一区| 国产大尺度在线观看| 手机福利小视频在线播放| 日韩精品专区在线影院观看| a级片免费观看| 精品久久久久久亚洲综合网 | 免费观看a级片| 国产亚洲一本大道中文在线| 亚洲毛片亚洲毛片亚洲毛片| 中文字幕中文字幕一区| 一区二区视频免费看| 亚洲午夜精品网| 久久久久久久久久久久久久av| 日韩欧美aaa| 中文字幕a级片| 91精品国产综合久久久久久久| 亚洲春色一区二区三区| 日韩av在线免费看| yjizz视频网站在线播放| 欧美成人sm免费视频| av美女在线观看| 国产不卡视频在线| 亚洲精品毛片| 国产精品乱码| 国产在线日韩精品| 男女啪啪免费观看| 国产精品毛片在线看| jizz欧美性11| 大白屁股一区二区视频| 丰满圆润老女人hd| 亚洲视频你懂的| 国产免费av一区二区| 欧美性色欧美a在线播放| 国产免费不卡av| 日韩激情片免费| 激情在线小视频| 热久久美女精品天天吊色| 国产一区二区| 免费在线成人av电影| 亚洲女同中文字幕| 国产精品少妇在线视频| 高清国产一区二区| 大吊一区二区三区| 精品国产老师黑色丝袜高跟鞋| 91国产免费视频| 精品一区二区三区四区在线| 好了av在线| 国产精品扒开腿做爽爽爽的视频| 999久久精品| 亚洲一区二区三区欧美| 国产亚洲网站| 精人妻一区二区三区| 国产精品麻豆一区二区| 日本中文在线播放| 精品久久久久香蕉网| 日本视频在线播放| 国产精国产精品| 日韩欧美ww| 无码熟妇人妻av在线电影| 麻豆精品蜜桃视频网站| www.久久av| 午夜欧美在线一二页| 国产绳艺sm调教室论坛| 一区二区三区四区视频| 亚洲精品88| 国产一级精品aaaaa看| 欧美激情日韩| 国产女同无遮挡互慰高潮91| 日本一区二区视频在线观看| 日韩av大片在线观看| 亚洲成人激情视频| 青青草视频在线免费直播| 成人免费网站在线看| 日韩中文字幕高清在线观看| 免费黄色日本网站| 99riav久久精品riav| 国产午夜精品无码| 精品少妇一区二区三区免费观看| 国产精品剧情一区二区在线观看| 国产精品女主播视频| 国产亚洲第一伦理第一区| 哪个网站能看毛片| 久久青草欧美一区二区三区| 日韩精品在线免费视频| 亚洲国产精品va在看黑人| aaa在线播放视频| 国产一区免费视频| 亚洲韩日在线| 三级黄色片网站| 婷婷丁香久久五月婷婷| 手机看片福利永久| 午夜欧美不卡精品aaaaa| 凹凸av导航大全精品| 少妇人妻在线视频| 26uuu欧美| 久久久久久不卡| 中文日韩电影网站| 日韩欧美激情| 潘金莲一级淫片aaaaaa播放1| 黄页网站大全一区二区| 看片网站在线观看| 亚洲国产精品字幕| 原纱央莉成人av片| 日本免费高清一区| 男女激情视频一区| www深夜成人a√在线| 日韩美女在线视频 | 欧美先锋资源| 91女神在线观看| 亚洲精品国产第一综合99久久| 国产黄色av网站| 久久久亚洲成人| 欧美极品中文字幕| 中文字幕国产传媒| 亚洲久本草在线中文字幕| 嫩草影院一区二区| 国产aⅴ夜夜欢一区二区三区| 日韩精品首页| 男人添女人荫蒂国产| 欧美午夜女人视频在线| 日本在线www| 国产综合av一区二区三区| 欧美亚洲一级| 四虎精品免费视频| 亚洲第一偷拍网| 在线日本欧美| 欧美日韩国产免费一区二区三区 | 午夜激情一区二区| wwwxxx在线观看| 国产高清在线精品一区二区三区| 欧美亚洲一区二区三区| av成人免费网站| 国产偷国产偷亚洲清高网站| 欧美黄页免费| 国产av天堂无码一区二区三区| 国产精品污www在线观看| 亚洲高清精品视频| 国产精品久久久久av免费| 亚洲午夜电影|