Agents 课程文档
为嘉宾故事创建 RAG 工具
并获得增强的文档体验
开始使用
为嘉宾故事创建 RAG 工具
你忠实的 Agent 阿尔弗雷德正在为本世纪最奢华的盛会做准备。为了确保活动顺利进行,阿尔弗雷德需要快速访问每位嘉宾的最新信息。让我们帮助阿尔弗雷德创建一个自定义的检索增强生成 (RAG) 工具,该工具由我们的自定义数据集提供支持。
为什么晚会需要 RAG?
想象一下,阿尔弗雷德在宾客中穿梭,需要在瞬间回忆起每位宾客的具体细节。传统的 LLM 可能难以胜任这项任务,因为
- 宾客名单是您的活动特有的,不在模型的训练数据中
- 宾客信息可能会频繁更改或更新
- 阿尔弗雷德需要检索精确的详细信息,例如电子邮件地址
这就是检索增强生成 (RAG) 的优势所在!通过将检索系统与 LLM 相结合,阿尔弗雷德可以按需访问关于您的宾客的准确、最新的信息。
您可以从课程中涵盖的任何框架中选择用于此用例。从代码选项卡中选择您首选的选项。
设置我们的应用程序
在本单元中,我们将在 HF Space 中,以结构化的 Python 项目的形式开发我们的 agent。这种方法通过将不同的功能组织到单独的文件中,帮助我们保持代码的整洁和模块化。此外,这使得用例更加真实,您可以在其中部署应用程序以供公众使用。
项目结构
tools.py
– 为 agent 提供辅助工具。retriever.py
– 实现检索功能以支持知识访问。app.py
– 将所有组件集成到一个功能齐全的 agent 中,我们将在本单元的最后一部分完成它。
如需实践参考,请查看此 HF Space,其中本单元开发的 Agentic RAG 是实时的。欢迎克隆并进行实验!
您可以直接在下面测试 agent
数据集概览
我们的数据集 agents-course/unit3-invitees
包含每位宾客的以下字段
- 姓名:宾客全名
- 关系:宾客与主人的关系
- 描述:关于宾客的简短传记或趣闻
- 电子邮件地址:用于发送邀请或后续跟进的联系信息
以下是数据集的预览
构建宾客名册工具
我们将创建一个自定义工具,阿尔弗雷德可以使用该工具在晚会期间快速检索宾客信息。让我们将其分解为三个可管理的步骤
- 加载和准备数据集
- 创建检索器工具
- 将工具与阿尔弗雷德集成
让我们从加载和准备数据集开始!
步骤 1:加载和准备数据集
首先,我们需要将原始宾客数据转换为针对检索进行优化的格式。
我们将使用 Hugging Face datasets
库加载数据集,并将其转换为来自 langchain.docstore.document
模块的 Document
对象列表。
import datasets
from langchain.docstore.document 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
帮助 agent 理解何时以及如何使用此工具inputs
定义了工具期望的参数(在本例中为搜索查询)- 我们正在使用
BM25Retriever
,它是一种强大的文本检索算法,不需要嵌入 forward
方法处理查询并返回最相关的宾客信息
步骤 3:将工具与阿尔弗雷德集成
最后,让我们将所有内容整合在一起,创建我们的 agent 并为其配备我们的自定义工具
from smolagents import CodeAgent, HfApiModel
# Initialize the Hugging Face model
model = HfApiModel()
# 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.
最后一步发生了什么
- 我们使用
HfApiModel
类初始化 Hugging Face 模型 - 我们将我们的 agent(阿尔弗雷德)创建为
CodeAgent
,它可以执行 Python 代码来解决问题 - 我们要求阿尔弗雷德检索关于名为“Lady Ada Lovelace”的宾客的信息
示例互动
在晚会期间,对话可能会像这样进行
你: “阿尔弗雷德,和大使说话的那位绅士是谁?”
阿尔弗雷德: 快速搜索宾客数据库 “先生,那是尼古拉·特斯拉博士。他是您大学时代的老朋友。他最近为一种新的无线能量传输系统申请了专利,并且很乐意与您讨论。请记住他热爱鸽子,这可能会成为很好的闲聊话题。”
{
"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
文件中实现您的宾客检索器工具。