智慧體課程文件

為賓客故事建立 RAG 工具

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

為賓客故事建立 RAG 工具

你值得信賴的智慧體阿爾弗雷德正在為本世紀最盛大的晚會做準備。為了確保活動順利進行,阿爾弗雷德需要快速訪問每位賓客的最新資訊。讓我們透過建立一個由我們自定義資料集驅動的自定義檢索增強生成 (RAG) 工具來幫助阿爾弗雷德。

為什麼盛會需要 RAG?

想象一下阿爾弗雷德在賓客中穿梭,需要隨時回憶起每個人的具體細節。傳統的 LLM 可能難以勝任這項任務,因為

  1. 賓客名單是你的活動所獨有的,不在模型的訓練資料中
  2. 賓客資訊可能會頻繁更改或更新
  3. 阿爾弗雷德需要檢索精確的詳細資訊,例如電子郵件地址

這正是檢索增強生成 (RAG) 的優勢所在!透過將檢索系統與 LLM 結合,阿爾弗雷德可以按需訪問有關賓客的準確、最新資訊。

你可以選擇課程中涵蓋的任何框架來處理此用例。從程式碼選項卡中選擇你偏好的選項。

設定我們的應用程式

在本單元中,我們將在 HF Space 中開發我們的智慧體,作為一個結構化的 Python 專案。這種方法透過將不同的功能組織到單獨的檔案中,幫助我們保持程式碼的乾淨和模組化。此外,這使得應用程式部署到公共使用成為更實際的用例。

專案結構

  • tools.py – 為智慧體提供輔助工具。
  • retriever.py – 實現檢索功能以支援知識訪問。
  • app.py – 將所有元件整合到一個功能齊全的智慧體中,我們將在本單元的最後部分完成它。

如需實踐參考,請檢視此 HF Space,本單元開發的智慧 RAG 正在其中執行。歡迎克隆並進行實驗!

你可以在下方直接測試智慧體

資料集概覽

我們的資料集 agents-course/unit3-invitees 包含每位賓客的以下欄位

  • 姓名:賓客全名
  • 關係:賓客與主人的關係
  • 描述:賓客的簡要傳記或有趣的事實
  • 電子郵件地址:傳送邀請或後續聯絡的聯絡方式

以下是資料集的預覽

在實際場景中,此資料集可以擴充套件以包括飲食偏好、禮物偏好、應避免的談話主題以及其他對主人有用的詳細資訊。

構建賓客名冊工具

我們將建立一個自定義工具,阿爾弗雷德可以在晚會期間快速檢索賓客資訊。讓我們將其分解為三個易於管理的步驟

  1. 載入並準備資料集
  2. 建立檢索器工具
  3. 將工具與阿爾弗雷德整合

讓我們從載入和準備資料集開始!

步驟 1:載入和準備資料集

首先,我們需要將原始賓客資料轉換為針對檢索最佳化的格式。

smolagents
llama-index
langgraph

我們將使用 Hugging Face 的 datasets 庫來載入資料集,並將其轉換為 langchain.docstore.document 模組中的 Document 物件列表。

import datasets
from langchain_core.documents import Document

# Load the dataset
guest_dataset = datasets.load_dataset("agents-course/unit3-invitees", split="train")

# Convert dataset entries into Document objects
docs = [
    Document(
        page_content="\n".join([
            f"Name: {guest['name']}",
            f"Relation: {guest['relation']}",
            f"Description: {guest['description']}",
            f"Email: {guest['email']}"
        ]),
        metadata={"name": guest["name"]}
    )
    for guest in guest_dataset
]

在上面的程式碼中,我們

  • 載入資料集
  • 將每個賓客條目轉換為具有格式化內容的 Document 物件
  • Document 物件儲存在一個列表中

這意味著我們所有的資料都已準備就緒,可以開始配置我們的檢索。

步驟 2:建立檢索器工具

現在,讓我們建立一個自定義工具,阿爾弗雷德可以使用它來搜尋我們的賓客資訊。

smolagents
llama-index
langgraph

我們將使用 langchain_community.retrievers 模組中的 BM25Retriever 來建立檢索器工具。

BM25Retriever 是檢索的一個很好的起點,但對於更高階的語義搜尋,你可以考慮使用基於嵌入的檢索器,例如來自 sentence-transformers 的檢索器。
from smolagents import Tool
from langchain_community.retrievers import BM25Retriever

class GuestInfoRetrieverTool(Tool):
    name = "guest_info_retriever"
    description = "Retrieves detailed information about gala guests based on their name or relation."
    inputs = {
        "query": {
            "type": "string",
            "description": "The name or relation of the guest you want information about."
        }
    }
    output_type = "string"

    def __init__(self, docs):
        self.is_initialized = False
        self.retriever = BM25Retriever.from_documents(docs)

    def forward(self, query: str):
        results = self.retriever.get_relevant_documents(query)
        if results:
            return "\n\n".join([doc.page_content for doc in results[:3]])
        else:
            return "No matching guest information found."

# Initialize the tool
guest_info_tool = GuestInfoRetrieverTool(docs)

讓我們逐步瞭解這個工具

  • namedescription 有助於智慧體瞭解何時以及如何使用此工具
  • inputs 定義了工具期望的引數(在本例中為搜尋查詢)
  • 我們使用的是 BM25Retriever,它是一種強大的文字檢索演算法,不需要嵌入
  • forward 方法處理查詢並返回最相關的賓客資訊

步驟 3:將工具與阿爾弗雷德整合

最後,讓我們透過建立我們的智慧體併為其配備我們的自定義工具來將所有內容整合起來

smolagents
llama-index
langgraph
from smolagents import CodeAgent, InferenceClientModel

# Initialize the Hugging Face model
model = InferenceClientModel()

# Create Alfred, our gala agent, with the guest info tool
alfred = CodeAgent(tools=[guest_info_tool], model=model)

# Example query Alfred might receive during the gala
response = alfred.run("Tell me about our guest named 'Lady Ada Lovelace'.")

print("🎩 Alfred's Response:")
print(response)

預期輸出

🎩 Alfred's Response:
Based on the information I retrieved, Lady Ada Lovelace is an esteemed mathematician and friend. She is renowned for her pioneering work in mathematics and computing, often celebrated as the first computer programmer due to her work on Charles Babbage's Analytical Engine. Her email address is ada.lovelace@example.com.

這最後一步發生了什麼

  • 我們使用 InferenceClientModel 類初始化 Hugging Face 模型
  • 我們將我們的智慧體(阿爾弗雷德)建立為 CodeAgent,它可以執行 Python 程式碼來解決問題
  • 我們要求阿爾弗雷德檢索有關一位名為“阿達·洛芙萊斯女爵”的賓客的資訊

互動示例

晚會期間,對話可能會像這樣進行

你:“阿爾弗雷德,那位和大使說話的紳士是誰?”

阿爾弗雷德:快速搜尋賓客資料庫 “那是尼古拉·特斯拉博士,先生。他是你大學時代的老朋友。他最近獲得了一項新的無線能量傳輸系統專利,很樂意與你討論。只要記住他熱愛鴿子,那可能是一個很好的開場白。”

{
    "name": "Dr. Nikola Tesla",
    "relation": "old friend from university days",  
    "description": "Dr. Nikola Tesla is an old friend from your university days. He's recently patented a new wireless energy transmission system and would be delighted to discuss it with you. Just remember he's passionate about pigeons, so that might make for good small talk.",
    "email": "nikola.tesla@gmail.com"
}

進一步探索

現在阿爾弗雷德可以檢索賓客資訊了,考慮一下你如何增強這個系統

  1. 改進檢索器 以使用更復雜的演算法,例如 sentence-transformers
  2. 實現對話記憶,讓阿爾弗雷德記住之前的互動
  3. 結合網路搜尋 以獲取不熟悉賓客的最新資訊
  4. 整合多個索引 以從經過驗證的來源獲取更完整的資訊

現在,阿爾弗雷德已全副武裝,可以輕鬆處理賓客查詢,確保你的晚會成為本世紀最精緻、最令人愉快的盛事!

嘗試擴充套件檢索器工具,使其還能根據每位賓客的興趣或背景返回對話開場白。你將如何修改該工具來實現這一點?

完成後,在 retriever.py 檔案中實現你的賓客檢索工具。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.