Langchain基础(三)
发布时间:2026/10/3 8:45:02 锦皓数字建站
`)
大模型本身只会文字推理没法联网、查数据库、算数学工具调用就是让 LLM 自己决定什么时候调用外部工具拿到外部信息再回答用户。工具大语言模型 LLM 本身是封闭系统 它能力只来自训练数据不能直接访问外部世界没法实时查东西、操作数据库、调用 API。工具调用打破这个限制LLM 可以生成工具调用指令交给程序去执行外部操作拿到结果之后再交给大模型整理答案。扩展能力边界做 LLM 自己干不了的事比如数学计算、搜索网页、查询数据库。获取实时信息调用搜索 / 数据库拿到训练集之后的新信息避免 “一本正经胡说八道”幻觉。拆解复杂任务把复杂需求拆成多步骤轮流调用不同工具分步完成任务Agent 智能体核心。对接现有系统调用企业内部 API、数据库让大模型对接业务系统提升自动化。eg查天气用户问天气 → LLM 知道自己不知道实时天气生成调用get-weather工具的指令→ 程序调用天气 API 拿到天气数据 → 把结果丢回给大模型整理成自然语言回复给用户。LLM 就像一个只会思考的大脑但它没有手。工具就是它的手工具调用 大脑写纸条告诉程序帮我去查天气 / 查数据库把结果拿回来给我我再组织语言回答。定义工具(最简单的方法)tool这里的注释,传入参数的类型,返回类型都是不可以省略的1. Schema 是什么Schema模式就是工具的元数据是一份 JSON 格式的工具契约告诉大模型这个工具叫什么名字name工具能干什么description调用这个工具需要哪些参数、参数是什么类型、参数含义argsLangChainAgent / 大模型不会读你的 Python 源码完全依靠这份 Schema来判断要不要调用工具、该传什么参数。如果类型注解、文档字符串缺失Schema 生成就不全大模型就不会正确调用你的工具。为什么文档说 “不可缺失”“函数名、类型提示和文档字符串都是传递给工具 Schema 的一部分不可缺失。定义好的描述是使模型良好运行的重要部分。”没有类型注解 → Schema 参数类型丢失大模型传参类型混乱没有 docstring 描述 → LLM 不知道这个工具是干嘛的不会触发调用没有参数说明 → LLM 搞不懂每个参数代表什么含义工具 schema 文档字符串去获取【参数描述】1.解析 Google 风格# 方式1纯函数tool自动提取schema第一种 # -------------------------- from langchain_core.tools import tool tool def add(a:int,b:int)-int: 两数相加 args: a:first number b:second number return ab2.手动完整写 Pydantic 模型# 方式2自定义Pydantic BaseModel传给args_schema第二种 # -------------------------- from langchain_core.tools import tool from pydantic import BaseModel, Field class AddInput(BaseModel): ADD TWO INTEGERS a:int Field(...,descriptionfirst integer) b:int Field(...,descriptionsecond integer) tool(args_schemaAddInput) def add(a:int,b:int)-int: return ab原理通过args_schemaAddInput交给tool。不再依赖函数 docstring 提取参数说明参数描述写在Field()里面。Field(..., descriptionxxx)...代表该参数必填如果写Field(0, descriptionxxx)就是默认值 0非必填。3.Annotated 注解# 方式3typing_extensions.Annotated 写在参数上第三种 # -------------------------- from langchain_core.tools import tool from typing_extensions import Annotated tool def add( a:Annotated[int,...,first integer], b:Annotated[int,...,second integer], )-int: ADD two integer return ab原理把参数类型、必填标记、参数描述全部直接写在函数参数的Annotated里面。langchain 会读取 Annotated 自动构建 schema。 语法Annotated[类型, 必填标记, 参数描述文本]StructuredTool 类提供的函数创建工具方法一前面都是一样的,要指明类型,还要有注释def add(a: int, b: int) - int: Add two integers. return a b add_tool StructuredTool.from_function(funcadd) print(add_tool.invoke({a: 1, b: 2}))方法二class AddInput(BaseModel): a:intField(descriptionfirst number) b:intField(descriptionsecond number) def add(a: int, b: int) - int: return a b add_tool StructuredTool.from_function( funcadd, descriptionAdd two integers, nameADD, args_schemaAddInput, )在开发可供大语言模型调用的天气查询接口时接口返回的数据存在正确或错误两种可能性因此需要配套结果校验流程。若要支持问题溯源定位就需要完整留存工具调用的全流程信息便于对问题开展分析排查。对于上面的代码我们可以进行修改class AddInput(BaseModel): a:intField(descriptionfirst number) b:intField(descriptionsecond number) def add(a: int, b: int) - tuple[list[int],str]: nums[a,b] contentfnums{nums},answer{ab} return nums,content add_tool StructuredTool.from_function( funcadd, descriptionAdd two integers,#工具描述 nameADD,#工具名 args_schemaAddInput,#工具参数 response_formatcontent_and_artifact ) print(add_tool.invoke( {name: ADD, args: {a: 1, b: 2}, type: tool_call,#必填 id: 11111,#必填,用来将工具调用请求和结果关联起来 } ))v在add这个函数里面记录里面的信息,tool这里还要设置回答的格式调用这里还需要注意设置id和type在调用的时候模仿大预言模型调用的,id和type都是必填的,将里面内容可以看到
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。