Agent开发初步——Tools的使用
前言
Agent与LLM的关系,本质是先有LLM,经过开发人员的开发、缝缝补补,最终产出具有自身特色的Agent。
即LLM是出场时我们拿到的一张白纸,它由厂商训练出来,能看懂文字、生成逻辑,但它被禁锢在对话框里。
而Agent则是针对特定的使用场景,将LLM加以改造,结合Tools、记忆、思维链,得到的真正智能的助手。
以上也十分契合我从LLM学习到Agent的过程,最开始拿到LLM,然后配合其他微模型盒api去做额外功能,接触Agent与Langchain后再用Tools重做上述功能,将一个普通的对话模型缝缝补补为了一个具备问题解决能力的agent。
明确需求
何时才会用到Agent?
如果你和我一样在没有任何教程指引下去学习为LLM增添功能,我当时并没有想到使用Agent,而是采用多LLM协作的形式
示例如下:
要为我们的LLM做一个天气查询的功能,在不用Agent的情况下如何设计?
正常的想法应该是,采用一个微LLM对用户的input做判断,if 用户有查询天气倾向,则触发查询程序,并将天气查询结果返回给 主LLM 结合上下文与用户对话。
流程图如下:
{:height=”15%” width=”15%”}
很明显能看出问题,微LLM的存在使我们的整个流程显得臃肿,并且拖慢了执行过程,此外还有一些额外的Token花费。
回到之前的问题,何时才会用到Agent?
很显然当你的LLM需要使用外部工具,调用外部函数、api时,使用Agent的Tools会大大简化执行流程与开发难度。
Agent实现上述功能的流程图如下:
{:height=”15%” width=”15%”}
核心的区别在于原先需要微LLM判断的内容主LLM(Agent)自己就可以做了,大大节省了微LLM的上下文Token开支,并且简化了开发难度。
具体实现
创建Agent
不是Ollama自行寻找对应依赖
1 2
| from langchain_ollama.chat_models import ChatOllama from langchain.agents import create_agent
|
1 2 3 4 5 6
| agent = create_agent( model=ChatOllama(model="qwen3.5:2b",reasoning=False), system_prompt=prompt_file, tools=[], middleware=[], )
|
Tools是开发人员交给Agent的工具,Agent如有自身解决不了的问题便会在prompt的引导下使用Tools获取相关信息
导入依赖
1
| from langchain_core.tools import tool
|
Tools:
tool的具体内容略过,该怎么写怎么写
1 2 3
| @tool(description="天气查询") def get_weather_tool(city:str) -> str: return weather.weather.get_weather(city)
|
光是把Tool塞给Agent也没用,就像你把T72坦克塞给中东老乡,没有 使用手册 ,他们也只会用坦克进行“别样的碰碰车大战”
提示词示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ## 核心思考准则 1. 先判断用户的核心需求,分析「当前已有的信息(用户问题)是否足够直接回答」,若不足,思考需要调用什么工具获取缺失信息; 2. 调用工具获取结果后,**再次判断「工具返回的信息是否能完整、专业地回答用户问题」**: - 若信息足够:整合信息生成流畅、专业的最终回答; - 若工具调用后仍信息不足,则回复用户:我不知道 3. 工具调用的入参必须与工具定义完全一致,字符串参数为纯文本,无额外引号/符号。
## 可使用工具及能力边界 1.get_weather_tool: - 核心能力:获取用户天气查询倾向并返回给他对应的天气信息; - 入参: is_future:bool ,当用户的天气查询倾向为查询今天天气时写入false,倾向为未来时写入true; - 出参:字符串类型的环境信息,包含城市对应的实时天气相关数据;以neuro的口吻融入与用户的对话中,注意:要如实反映天气信息; - 使用场景:当用户谈到涉及“今天天气怎么样”,“明天会下雨吗”等场景时,调用该工具; - 示例: user:"今天天气怎么样" ,入参传false;user:“明天会下雨吗”,入参传true
|
告诉Agent有这个工具
最后的最后,别忘了让Agent知道存在这个Tool
在Agent创建时写入Tool名称即可
1 2 3 4 5 6 7 8
| from tools.tools import (get_weather_tool)
agent = create_agent( model=ChatOllama(model="qwen3.5:2b",reasoning=False), system_prompt=prompt_file, tools=[get_weather_tool], middleware=[], )
|
使用效果
输出结果
1 2 3 4 5 6
| HumanMessage(content='那就帮我查查今天的天气吧'), AIMessage(tool_calls=[{'name': 'get_weather_tool', 'args': {'is_future': False}, 'id': '1609a5b4-4cad-428c-b20a-172fbae315f1', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 1487, 'output_tokens': 27, 'total_tokens': 1514}), ToolMessage(content='{"province": "天津", "city": "天津市", "adcode": "120000", "weather": "阴", "temperature": "11", "winddirection": "东北", "windpower": "≤3", "humidity": "37", "reporttime": "2026-03-13 13:03:26", "temperature_float": "11.0", "humidity_float": "37.0"}', name='get_weather_tool', id='241aee1d-3355-4d5f-8049-29cd155d6142', tool_call_id='1609a5b4-4cad-428c-b20a-172fbae315f1'), AIMessage(content='天津今天阴天,有东北风呢。温度大概 11 度左右,风力也不大。\n\n你跑步的时候可能会稍微有点凉吧?')]}
|