智能体工具速通:3个零件、2个框架,十分钟跑通第一次调用
【免费下载链接】agents-courseThis repository contains the Hugging Face Agents Course.项目地址: https://gitcode.com/GitHub_Trending/ag/agents-course
Alfred在韦恩庄园值班,韦恩先生留下一张训练计划照片,只问一个问题:菜单上的食材该买哪些。模型能"看懂"图片,却动不了手。你得给它一套智能体工具,让它真正打开图片、读出文字。Hugging Face 的开源课程 Agents-Course 恰好把"给模型装手"这件事做成了可动手的教程。
项目速览
Agents-Course 是 Hugging Face 的官方开源课程,4 个主单元加 3 个加餐单元,从"智能体是什么"讲到框架实战,最后用基准测试收尾。前置要求只有 Python 基础和一点 LLM 常识,仓库里带完整中文版 units/zh-CN/。
碎片化自学有个隐形成本:博客东一篇西一篇,框架版本对不上,去年的代码拿到今天的 smolagents 里跑不通。跟这门课走,例子是一条线的:ReAct 循环、工具定义、图构建,代码逐行给,每节配能在 Colab 里跑的 notebook。学完你能做三件事:定义并注册工具、用两套框架搭出会调工具的智能体、把它们用到文档分析和 RAG 场景里。
工具的三个零件
拆开框架的魔法,一个工具只有三个零件。可以把它想象成组装一把小工具:
- 标签:这工具干什么。一句话讲清,胜过一串形容词。
- 插口:要喂什么才能跑。每个参数都有名字、类型和用途说明。
- 结果窗:吐出来的是什么。字符串、数字还是一组列表。
为什么只要这三个?因为 LLM 本身不会调函数。它只会根据标签、插口和结果窗,输出一段"调用文本",底下的框架负责解析并执行。零件写得清楚,模型选得准;写得含糊,它就开始乱调。
十分钟上手:跑通第一个工具
最快的路是 SmolAgents 的@tool装饰器:写个普通函数,加个装饰器,它就是工具。
from smolagents import CodeAgent, InferenceClientModel, tool @tool def load_note(path: str) -> str: """加载本地文档,返回其中文本内容。 Args: path: 文档的本地路径。 """ with open(path, encoding="utf-8") as f: return f.read() agent = CodeAgent(tools=[load_note], model=InferenceClientModel()) print(agent.run("读取 units/zh-CN/unit1/introduction.mdx 并告诉我重点"))为什么这么写?装饰器会自动从函数名、docstring 和类型标注里解析出三个零件,这正是模型判断"用不用它、参数怎么填"的全部依据。类型标注还能让框架在真正执行前先校验参数。InferenceClientModel默认走官方推理服务,不需要本地显卡,整段代码就是"定义、注册、调用"的最短路径。
把工具装进智能体:两种框架
课程讲了三个框架,装工具最常用的两个是 SmolAgents 和 LangGraph,思路差得很远。
| SmolAgents | LangGraph | |
|---|---|---|
| 注册方式 | 函数上加@tool,塞进tools列表 | 函数列表用bind_tools绑到模型,图里挂ToolNode节点 |
| 调用风格 | 智能体走 ReAct 循环,模型自己决定何时调 | 你画节点和边,靠条件边判断"最新一条消息有没有工具调用" |
| 适合场景 | 单个智能体快速起步 | 多步骤流程、分支、状态需要显式控制 |
一句话总结:SmolAgents 是"扔进工具就跑",LangGraph 是"你来画流程图"。任务是一条直线,用前者;流程里有分支和回退,用后者。
一个能落地的例子
拿课程里的文档分析场景:一张训练计划照片,提取文字,产出采购清单。在 LangGraph 里,整个流程就是两个节点加一条条件边。
核心代码就这几行:
from langgraph.prebuilt import ToolNode, tools_condition builder.add_node("assistant", assistant) # 模型决定要不要调工具 builder.add_node("tools", ToolNode([extract_text, divide])) builder.add_conditional_edges("assistant", tools_condition) builder.add_edge("tools", "assistant") graph = builder.compile() result = graph.invoke({"messages": msgs, "input_file": "note.png"})assistant 节点让模型表态,它决定调工具,条件边就把消息送进 tools 节点执行,结果再送回模型。它觉得够了,条件边指向答复节点,循环收尾。
踩坑速查
工具集成翻车的原因高度集中,这三个占了一大半,而且都出在"零件"上。
| 症状 | 原因 | 解法 |
|---|---|---|
| 让它抽文字,它去调了计算器 | 工具描述太像,模型分不出边界 | 描述改写成"何时使用",把参数差异写明 |
| 对话中途跑飞或被截断 | 单次返回(整个文件)太长,撑爆上下文 | 限制返回长度,只回摘要加关键段落 |
| 换上新工具后,老调用随机失灵 | 两个工具同名,互相覆盖注册 | 名字起得唯一,批量导入前先按名字查重 |
去哪看源码
拿到整个课程只需一条命令:git clone https://gitcode.com/GitHub_Trending/ag/agents-course
- units/zh-CN/unit1/tools.mdx:工具是什么、三个零件怎么向模型交代
- units/zh-CN/unit2/smolagents/tools.mdx:SmolAgents 两种工具写法,含完整跑通示例
- units/zh-CN/unit2/langgraph/document_analysis_agent.mdx:上一节文档分析智能体的完整源码
- units/zh-CN/unit1/agent-steps-and-structure.mdx:工具调用在智能体循环里一步步怎么展开
工具是智能体的手。模型再聪明,没有一双手也落不了地。三个零件写清楚,框架选一个,路就通了。
动手建议:把上文的load_note拷走,换成你自己的一份文档跑一次agent.run,看看它读回什么;再只改描述、不改代码,感受一下模型选择的变化。
【免费下载链接】agents-courseThis repository contains the Hugging Face Agents Course.项目地址: https://gitcode.com/GitHub_Trending/ag/agents-course
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考