资讯动态

LangChain之工具调用

发布时间:2026/10/14 3:15:03 来源:尧图企业网站定制
今天我们来讲解关于LangChain的相关工具调用。1. 为什么需要工具在 LangChain 的学习中需要学习工具是因为工具相当于是大模型与 API 之间的桥梁。如果没有工具的话那么大模型是没有办法去调用API的。同时大语言模型的话是可以做到自主调用工具的。但是我们如果想要实现大模型对工具的调用的话是需要我们我们在工具的内部提前写好这个关于这个工具的描述的这样模型才可以知道什么时候可以调用这个函数也就是这个工具。2. tool这个的话是语法糖我们只需要简单的几行代码就可以实现对模型的调用。2.1 tool方法一我们来看下面这个代码我们需要先写一个tool代表着我们开始了对工具的创建接着我们def一个函数然后设置好参数和返回值。接着我们需要打“”“”“”然后再里面填入对这个函数的说明以及里面每一个参数是什么是啥东西。这个的话是写给模型看的。最后设置好返回值。我们看下面的打印invoke是用来提取的提取这个add1函数的返回值接着通过namedescriptionargs等函数就可以打印出这个add1函数所对应的名字描述以及参数的类型。tool def add1(a: int, b: int) - int: 这个是方法一的两数相加 Args: a: 第一个整数 b: 第二个整数 return a b print(add1.invoke({a: 2, b: 3})) print(add1.name) print(add1.description) print(add1.args) print(\n)我们看下面这个代码这个的话就是打印的结果因为我们没有改变过函数的名字所以在这里面的话就是add1。2.2 tool方法二我们来看下面这个代码这个的话就和上面的方法一不一了我们在这边的话就是先定义了一个类接着在这边在空格里面输入BaseModelBaseModel 用来定义数据结构、校验数据、自动生成 JSON Schema给大模型函数调用用的。接着我们老样子在里面填入这个函数的描述但是在下面我们需要再每一个参数后面设置一个Field同时需要在第一个位置填入三个省略号这代表这个参数必须要填入第二个description则是用来给给大模型看告诉模型这个参数是什么含义。PS:Field()是一个函数专门用来给 BaseModel 里面的字段附加额外信息、校验规则Pydantic。class AddInput(BaseModel): 这个是方法二的两数相加 a: intField(...,description第一个整数) b: intField(...,description第二个整数) tool(args_schemaAddInput) def add2(a:int, b:int)-int: return ab print(add2.invoke({a: 2, b: 3})) print(add2.name) print(add2.description) print(add2.args) print(\n)这个的话就是这个函数被调用之后的返回值。因为这两个的代码不一样所以最后打印出来的结果也是不一样的。2.2.1 description解释我们看上面的两个代码里面都有关于description的使用同时对于模型来说它看到的结果是一样的因为对于模型来说是只要有description就可以但是底层 JSON Schema 里的参数描述来源完全不同所以我们看到的结果不一样。tool.description工具整体功能描述告诉模型什么时候调用这个工具tool.args参数的 JSON Schema告诉模型每个参数是什么含义2.3 tool方法三这个的话就是方法三我们来看下面的代码这个话有点像方法二我们先定义一个def然后在函数的参数后面加入一个Annotated这个函数Annotated是 Python 的类型注解增强工具简单来说相当于在这边是强调geiAI看的这样我们在下面就不用专门为参数写注释了。只需要加上关于这个函数的描述就可以了。tool def add3( a:Annotated[int,...,第一个整数], b:Annotated[int,...,第一个整数], )-int: 这个是方法三的两数相加 return ab print(add3.invoke({a: 2, b: 3})) print(add3.name) print(add3.description) print(add3.args) print(\n)下面的图片就是运行的代码3. struct工具接下来我们来看struct工具这个的话万能可以理解为更加的接近底层因为tool工具是被封装好的struct工具相当于我们在使用tool的时候会在底层被转换成struct工具。3.1 struct方法一我们来看下面这个代码我们先def一个函数同时加上对他的描述接着设置一个变量用来接收structuredtool函数接着放入前面我们写好的add1函数就可以了。接着我们直接去打印add1_tool相关的信息就可以了。def add1(a:int, b:int) - int: 这个是方法一的两数相加 return ab add1_toolStructuredTool.from_function(funcadd1) print(add1_tool.invoke({a: 2, b: 5})) print(add1_tool.name) print(add1_tool.description) print(add1_tool.args)我们看下面这个图片这个就是方法一的输出结果。3.2 struct方法二我们接下来看这个方法二这个的话有点像我们上面写的tool的方法二一样先写一个class类设定好相关的参数接着def一个函数。到这一步的有些朋友可能节点有点疑惑了因为我们在这边的add2和AddInput函数看起来有点重复但其实是不一样的。因为他们两个对于struct工具来说是两个不同的东西只是我们在这边的函数内部参数都正好选择了a和b而已。接着就直接在struct工具里面进行调用就可以了。在这边我们是需要在struct工具里面填入四个常熟的他们具体的作用我写在下面的表格里了。funcadd2告诉工具真正要执行的业务函数是谁nameADD2给大模型看这个工具叫什么名字在这边的话相当于改名description这个是方法二的两数相加给大模型看这个工具能干什么什么时候该调用它args_schemaAddInput2给大模型看调用这个工具需要传哪些参数、参数类型、参数说明class AddInput2(BaseModel): a: intField(...,description) b: intField(...,description) def add2(a:int, b:int) - int: return ab add2_toolStructuredTool.from_function( funcadd2, nameADD2,# 工具名 description这个是方法二的两数相加,# 工具描述 args_schemaAddInput2,# 工具参数 ) print(add2_tool.invoke({a: 2, b: 5})) print(add2_tool.name) print(add2_tool.description) print(add2_tool.args)AddInput2Pydantic BaseModel专门给【大模型】用生成 JSON Schema告诉 Agent调用这个工具需要什么参数、每个参数是什么含义用来约束大模型输出 tool_call。大模型是文本模型它要读这个 schema生成{a:2,b:5}这种参数。 同时 Pydantic 还会做参数校验比如传字符串就直接报错。add2普通函数专门给【Python 解释器】执行真正干活的逻辑拿到 a、b执行相加。这是业务逻辑是真正运行的代码。简单一句话AddInput2 和大模型沟通的 “接口说明书” add2 真正干活的代码3.2.1 struct工具方法一和方法二的区别他们的区别其实很简单就是方法一是自动推导方法二是我们自己去手动定义通过亲手定义完整参数 schema代码多一点但是信息完整可控LLM 更容易理解参数含义。3.3 struct方法三我们现需要创建一个类AddIntput3这个类的话就是专门用来告诉模型这个工具需要什么参数每一个参数又是什么意思接着在def一个函数这个函数才是真正运行的用的。后用 StructuredTool 把它们打包成工具实例 add_tool。接着的话就是通过一个变量来进行输出结果了在这边这个变量不是关键里面的内容才是关键所以不管我们这个tool_call_request取什么名字只要是按照这个格式这个内容进行填写的那么最后的输出结果就是这样。class AddInput3(BaseModel): a: intField(description第一个整数) b: intField(description第二个整数) #Tuple 就是**元组**Python 里用来一次性返回**多个值**。 def add (a:int, b:int) - Tuple[str, List[int]]: nums[a,b] contentf{nums}相加的结果是{ab} return content,nums add_toolStructuredTool.from_function( funcadd, nameADD3, # 工具名 description两数相加, # 工具描述 args_schemaAddInput3, # 工具参数 response_formatcontent_and_artifact ) # 模拟大模型调用姿势 tool_call_request { name: ADD3, args: {a: 3, b: 4}, type: tool_call, id: 111, } print(tool_call_request )下面这个图片就是方法三的打印结果。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑