智能体课程文档
为宾客故事创建 RAG 工具
并获得增强的文档体验
开始使用
为宾客故事创建 RAG 工具
你值得信赖的智能体阿尔弗雷德正在为本世纪最盛大的晚会做准备。为了确保活动顺利进行,阿尔弗雷德需要快速访问每位宾客的最新信息。让我们通过创建一个由我们自定义数据集驱动的自定义检索增强生成 (RAG) 工具来帮助阿尔弗雷德。
为什么盛会需要 RAG?
想象一下阿尔弗雷德在宾客中穿梭,需要随时回忆起每个人的具体细节。传统的 LLM 可能难以胜任这项任务,因为
- 宾客名单是你的活动所独有的,不在模型的训练数据中
- 宾客信息可能会频繁更改或更新
- 阿尔弗雷德需要检索精确的详细信息,例如电子邮件地址
这正是检索增强生成 (RAG) 的优势所在!通过将检索系统与 LLM 结合,阿尔弗雷德可以按需访问有关宾客的准确、最新信息。
你可以选择课程中涵盖的任何框架来处理此用例。从代码选项卡中选择你偏好的选项。
设置我们的应用程序
在本单元中,我们将在 HF Space 中开发我们的智能体,作为一个结构化的 Python 项目。这种方法通过将不同的功能组织到单独的文件中,帮助我们保持代码的干净和模块化。此外,这使得应用程序部署到公共使用成为更实际的用例。
项目结构
tools.py
– 为智能体提供辅助工具。retriever.py
– 实现检索功能以支持知识访问。app.py
– 将所有组件集成到一个功能齐全的智能体中,我们将在本单元的最后部分完成它。
如需实践参考,请查看此 HF Space,本单元开发的智能 RAG 正在其中运行。欢迎克隆并进行实验!
你可以在下方直接测试智能体
数据集概览
我们的数据集 agents-course/unit3-invitees
包含每位宾客的以下字段
- 姓名:宾客全名
- 关系:宾客与主人的关系
- 描述:宾客的简要传记或有趣的事实
- 电子邮件地址:发送邀请或后续联系的联系方式
以下是数据集的预览
构建宾客名册工具
我们将创建一个自定义工具,阿尔弗雷德可以在晚会期间快速检索宾客信息。让我们将其分解为三个易于管理的步骤
- 加载并准备数据集
- 创建检索器工具
- 将工具与阿尔弗雷德集成
让我们从加载和准备数据集开始!
步骤 1:加载和准备数据集
首先,我们需要将原始宾客数据转换为针对检索优化的格式。
我们将使用 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:创建检索器工具
现在,让我们创建一个自定义工具,阿尔弗雷德可以使用它来搜索我们的宾客信息。
我们将使用 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)
让我们逐步了解这个工具
name
和description
有助于智能体了解何时以及如何使用此工具inputs
定义了工具期望的参数(在本例中为搜索查询)- 我们使用的是
BM25Retriever
,它是一种强大的文本检索算法,不需要嵌入 forward
方法处理查询并返回最相关的宾客信息
步骤 3:将工具与阿尔弗雷德集成
最后,让我们通过创建我们的智能体并为其配备我们的自定义工具来将所有内容整合起来
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"
}
进一步探索
现在阿尔弗雷德可以检索宾客信息了,考虑一下你如何增强这个系统
- 改进检索器 以使用更复杂的算法,例如 sentence-transformers
- 实现对话记忆,让阿尔弗雷德记住之前的交互
- 结合网络搜索 以获取不熟悉宾客的最新信息
- 集成多个索引 以从经过验证的来源获取更完整的信息
现在,阿尔弗雷德已全副武装,可以轻松处理宾客查询,确保你的晚会成为本世纪最精致、最令人愉快的盛事!
完成后,在 retriever.py
文件中实现你的宾客检索工具。