2026/1/26 19:13:35
网站建设
项目流程
网站备案主体授权书,企业网站建设动图,新闻热点事件摘抄2022,婚礼婚庆网站建设LangChain实战快速入门笔记#xff08;五#xff09;–LangChain使用之Tools 文章目录LangChain实战快速入门笔记#xff08;五#xff09;--LangChain使用之Tools一、Tools概述1. 介绍2. Tool 的要素二、自定义工具1. 两种自定义方式第1种#xff1a;使用tool装饰器…LangChain实战快速入门笔记五–LangChain使用之Tools文章目录LangChain实战快速入门笔记五--LangChain使用之Tools一、Tools概述1. 介绍2. Tool 的要素二、自定义工具1. 两种自定义方式第1种使用tool装饰器自定义工具的最简单方式第2种使用StructuredTool.from_function类方法2. 几个常用属性3. 具体实现方式1tool 装饰器举例1举例2通过tool的参数设置进行重置方式2StructuredTool的from_function()4. 工具调用举例举例1大模型分析调用工具调用工具说明情况1大模型决定调用工具情况2大模型不调用工具举例2确定工具并调用(1) 检查是否需要调用工具(2) 实际执行工具调用总结一、Tools概述1. 介绍要构建更强大的AI工程应用只有生成文本这样的“纸上谈兵”能力自然是不够的。工具Tools不仅仅是“肢体”的延伸更是为“大脑”插上了想象力的“翅膀”。借助工具才能让AI应用的能力真正具备无限的可能才能从“认识世界”走向“改变世界”。Tools 用于扩展大语言模型LLM的能力使其能够与外部系统、API 或自定义函数交互从而完成仅靠文本生成无法实现的任务如搜索、计算、数据库查询等。特点•增强 LLM 的功能让 LLM 突破纯文本生成的限制执行实际操作如调用搜索引擎、查询数据库、运行代码等•支持智能决策在Agent 工作流中LLM 根据用户输入动态选择最合适的 Tool 完成任务。•模块化设计每个 Tool 专注一个功能便于复用和组合例如搜索工具 计算工具 天气查询工具LangChain 拥有大量第三方工具。请访问工具集成查看可用工具列表。https://python.langchain.com/v0.2/docs/integrations/tools/2. Tool 的要素Tools 本质上是封装了特定功能的可调用模块是Agent、Chain或LLM可以用来与世界互动的接口。Tool 通常包含如下几个要素•name工具的名称•description工具的功能描述• 该工具输入的JSON模式• 要调用的函数•return_direct是否应将工具结果直接返回给用户仅对Agent相关实操步骤• 步骤1将name、description 和 JSON模式作为上下文提供给LLM• 步骤2LLM会根据提示词推断出需要调用哪些工具并提供具体的调用参数信息• 步骤3用户需要根据返回的工具调用信息自行触发相关工具的回调注意如果⼯具具有精心选择的名称、描述和JSON模式则模型的性能将更好。下⼀章内容我们可以看到⼯具的调⽤动作可以通过Agent⾃主接管。二、自定义工具1. 两种自定义方式第1种使用tool装饰器自定义工具的最简单方式装饰器默认使用函数名称作为工具名称但可以通过参数name_or_callable来覆盖此设置。同时装饰器将使用函数的文档字符串作为工具的描述因此函数必须提供文档字符串。第2种使用StructuredTool.from_function类方法这类似于tool装饰器但允许更多配置和同步/异步实现的规范。2. 几个常用属性Tool由几个常用属性组成3. 具体实现方式1tool 装饰器举例1fromlangchain.toolsimporttooltooldefadd_number(a:int,b:int)-int:两个整数相加returnabprint(fname {add_number.name})print(fargs {add_number.args})print(fdescription {add_number.description})print(freturn_direct {add_number.return_direct})resadd_number.invoke({a:10,b:20})print(res)说明return_direct参数的默认值是False。当return_directFalse时工具执行结果会返回给Agent让Agent决定下一步操作而return_directTrue则会中断这个循环直接结束流程返回结果给用户。举例2通过tool的参数设置进行重置fromlangchain.toolsimporttooltool(name_or_callableadd_two_number,descriptiontwo number add,return_directTrue)defadd_number(a:int,b:int)-int:两个整数相加returnabprint(fname {add_number.name})print(fdescription {add_number.description})print(fargs {add_number.args})print(freturn_direct {add_number.return_direct})resadd_number.invoke({a:10,b:20})print(res)补充还可以修改参数的说明fromlangchain.toolsimporttoolfrompydanticimportBaseModel,FieldclassFieldInfo(BaseModel):a:intField(description第1个参数)b:intField(description第2个参数)tool(name_or_callableadd_two_number,descriptiontwo number add,args_schemaFieldInfo,return_directTrue)defadd_number(a:int,b:int)-int:两个整数相加returnabprint(fname {add_number.name})print(fdescription {add_number.description})print(fargs {add_number.args})print(freturn_direct {add_number.return_direct})resadd_number.invoke({a:10,b:20})print(res)方式2StructuredTool的from_function()StructuredTool.from_function类方法提供了比**tool**装饰器更多的可配置性而无需太多额外的代码。举例1fromlangchain_core.toolsimportStructuredTooldefsearch_function(query:str):returnLangChainsearch1StructuredTool.from_function(funcsearch_function,nameSearch,descriptionuseful for when you need to answer questions about current events)print(fname {search1.name})print(fdescription {search1.description})print(fargs {search1.args})search1.invoke(hello)举例2fromlangchain_core.toolsimportStructuredToolfrompydanticimportField,BaseModelclassFieldInfo(BaseModel):query:strField(description要检索的关键词)defsearch_function(query:str):returnLangChainsearch1StructuredTool.from_function(funcsearch_function,nameSearch,descriptionuseful for when you need to answer questions about current events,args_schemaFieldInfo,return_directTrue,)print(fname {search1.name})print(fdescription {search1.description})print(fargs {search1.args})print(freturn_direct {search1.return_direct})search1.invoke(hello)4. 工具调用举例我们通过大模型分析用户需求判断是否需要调用指定工具。举例1大模型分析调用工具#1.导入相关依赖fromlangchain_community.toolsimportMoveFileToolfromlangchain_core.messagesimportHumanMessagefromlangchain_core.utils.function_callingimportconvert_to_openai_functionimportosimportdotenvfromlangchain_openaiimportChatOpenAI dotenv.load_dotenv()os.environ[OPENAI_API_KEY]os.getenv(OPENAI_API_KEY)os.environ[OPENAI_BASE_URL]os.getenv(OPENAI_BASE_URL)#2.定义LLM模型chat_modelChatOpenAI(modelgpt-4o-mini,temperature0)#3.定义工具tools[MoveFileTool()]#4.这里需要将工具转换为openai函数后续再将函数传入模型调用functions[convert_to_openai_function(t)fortintools]#print(functions[0])#5.提供大模型调用的消息列表messages[HumanMessage(content将文件a移动到桌面)]#6.模型使用函数responsechat_model.invoke(inputmessages,functionsfunctions)print(response)模型绑定工具调用模型传入Message对象。作为对照修改代码responsechat_model.invoke([HumanMessage(content今天的天气怎么样)],functionsfunctions)print(response)调用工具说明两种情况情况1大模型决定调用工具如果模型认为需要调用工具如MoveFileTool返回的message会包含• content : 通常为空因为模型选择调用工具而非生成自然语言回复。• additional_kwargs : 包含工具调用的详细信息AIMessage(content,# 无自然语言回复additional_kwargs{function_call:{name:move_file,# 工具名称arguments:{source_path: a, destination_path: /Users/YourUsername/Desktop/a}# 工具参数}})情况2大模型不调用工具如果模型认为无需调用工具例如用户输入与工具无关返回的message会是普通文本回复AIMessage(content我没有找到需要移动的文件。,# 自然语言回复additional_kwargs{refusal:None}# 无工具调用)举例2确定工具并调用# 定义LLM模型chat_modelChatOpenAI(modelgpt-4o-mini,temperature0)# 定义工具tools[MoveFileTool()]# 将工具转换为openai函数functions[convert_to_openai_function(t)fortintools]# 提供消息列表messages[HumanMessage(content将本目录下的abc.txt文件移动到C:\\Users\\shkst\\Desktop)]# 模型调用responsechat_model.invoke(inputmessages,functionsfunctions)print(response)(1) 检查是否需要调用工具importjsoniffunction_callinresponse.additional_kwargs:tool_nameresponse.additional_kwargs[function_call][name]tool_argsjson.loads(message.additional_kwargs[function_call][arguments])print(f调用工具:{tool_name}, 参数:{tool_args})else:print(模型回复: ,response.content)(2) 实际执行工具调用fromlangchain.toolsimportMoveFileToolifmove_fileinresponse.additional_kwargs[function_call][name]:toolMoveFileTool()resulttool.run(tool_args)# 执行工具print(工具执行结果: ,result)大模型与 Agent 的核心区别是否涉及到工具的调用针对大模型仅能分析出要调用的工具但是此工具或函数不能真正的执行针对 Agent除了分析出要调用的工具之外还可以执行具体的工具或函数总结记得关注么么哒