免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

如何在 Web-Dev-For-Beginners 用 LangChain 工具调用让 AI 执行自定义函数

如何在 Web-Dev-For-Beginners 用 LangChain 工具调用让 AI 执行自定义函数 如何在 Web-Dev-For-Beginners 用 LangChain 工具调用让 AI 执行自定义函数【免费下载链接】Web-Dev-For-Beginners24 Lessons, 12 Weeks, Get Started as a Web Developer项目地址: https://gitcode.com/GitHub_Trending/we/Web-Dev-For-BeginnersWeb-Dev-For-Beginners 课程的 AI Framework 一课10-ai-framework-project/README.md演示了如何用 LangChain 的 tool calling 机制让大模型在对话中识别并调用你自己定义的 Python 函数——比如让它执行一个加法函数add或者调用外部 Web API 取回内容。读完并跑通本文后你将拥有一个可以绑定自定义工具的 LangChain 客户端并在模型判断需要某项能力时自动执行对应函数。前提条件Python 环境通过 pip 安装依赖环境变量GITHUB_TOKEN可用。课程文档说明在 GitHub Codespaces 中该 token 已经配置好如果在本地运行需要自行创建一个具有相应权限的 personal access token代码连接的是 GitHub Modelsbase_urlhttps://models.github.ai/inference模型使用openai/gpt-4o-mini。安装依赖并连接模型课程给出的安装命令见文档 Quick Start 与 Assignment 的 Step 1pip install langchain langchain-openai连接模型用ChatOpenAI客户端这是后续所有工具调用代码的基础from langchain_openai import ChatOpenAI import os llm ChatOpenAI( api_keyos.environ[GITHUB_TOKEN], base_urlhttps://models.github.ai/inference, modelopenai/gpt-4o-mini, )仓库中的 app.py 就是这个最小客户端如果连llm.invoke(What is the capital of France)这一步都无法返回内容说明 token 或网络配置有问题应先解决它再继续工具调用部分。定义自定义函数工具LangChain 中一个“工具”由两部分组成一个给模型看的参数蓝图TypedDict 类和一个真正执行的函数实现functions字典。课程文档用一个加法函数演示了完整写法from typing_extensions import Annotated, TypedDict class add(TypedDict): Add two integers. # Annotations must have the type and can optionally include a default value and description (in that order). a: Annotated[int, ..., First integer] b: Annotated[int, ..., Second integer] tools [add] functions { add: lambda a, b: a b }各部分的作用均出自课程文档的讲解类继承TypedDict类的 docstringAdd two integers.成为工具的说明模型据此判断“这个问题该不该用这个工具”字段用Annotated标注。文档中的注释明确了书写规则annotation 必须包含类型可选地按顺序附带默认值和描述tools列表是传给模型的工具清单functions字典是“工具箱”键是工具名值是真正执行的动作——模型只负责报出工具名和参数执行发生在你的代码里。绑定工具并触发调用创建好工具后用bind_tools把它挂到模型上llm_with_tools llm.bind_tools(tools)bind_tools调用之后llm_with_tools这个 LLM 实例就“知道”了这些工具的存在。接下来发送请求并检查返回值中是否产生了tool_callsquery What is 3 12? res llm_with_tools.invoke(query) if res.tool_calls: for tool in res.tool_calls: print(TOOL CALL: , functions[tool[name]](**tool[args])) print(CONTENT: , res.content)这里的执行逻辑是模型分析 query 后如果认定该用add工具返回的res.tool_calls里就会有对应条目每个条目的name指明要调哪个工具、args给出参数functions[tool[name]](**tool[args])随即在你的进程里执行a b。把上面三段拼起来的完整脚本与文档中的全量代码一致from langchain_core.messages import HumanMessage, SystemMessage from langchain_openai import ChatOpenAI import os from typing_extensions import Annotated, TypedDict class add(TypedDict): Add two integers. a: Annotated[int, ..., First integer] b: Annotated[int, ..., Second integer] tools [add] functions { add: lambda a, b: a b } llm ChatOpenAI( api_keyos.environ[GITHUB_TOKEN], base_urlhttps://models.github.ai/inference, modelopenai/gpt-4o-mini, ) llm_with_tools llm.bind_tools(tools) query What is 3 12? res llm_with_tools.invoke(query) if res.tool_calls: for tool in res.tool_calls: print(TOOL CALL: , functions[tool[name]](**tool[args])) print(CONTENT: , res.content)验证结果文档给出的示例输出为注意是“output similar to”实际措辞和空行可能不同TOOL CALL: 15 CONTENT:看到这个结果说明链路完整工作模型从add工具的名字、描述和字段规格中识别出这是一次加法任务functions字典里的 lambda 实际算出了 15。CONTENT:之后为空是文档示例中的正常现象——这一轮模型只报工具调用没有另行生成文本。如果res.tool_calls为空、只打印出CONTENT:说明模型没有把这次请求路由到工具文档没有给出更多排错顺序此时可以先核对tools是否已传入bind_tools、query 是否确实匹配工具描述。可选分支让自定义函数调用外部 Web API加法函数只演示机制文档的进阶例子是让工具真正干活——joke工具会请求https://api.chucknorris.io/jokes/random?category{category}并返回 JSON 中的value字段class joke(TypedDict): Tell a joke. category: Annotated[str, ..., The joke category] def get_joke(category: str) - str: response requests.get( fhttps://api.chucknorris.io/jokes/random?category{category}, headers{Accept: application/json} ) if response.status_code 200: return response.json().get(value, fHeres a {category} joke!) return fHeres a {category} joke! functions { add: lambda a, b: a b, joke: lambda category: get_joke(category) } tools [add, joke]配套改动只有两处把joke加进tools列表、把joke的实现加进functions字典后面的bind_tools/invoke/tool_calls流程完全不变。查询换成query Tell me a joke about animals文档给出的示例输出同样是“something like”TOOL CALL: Chuck Norris once rode a nine foot grizzly bear through an automatic car wash, instead of taking a shower. CONTENT:两点需要注意这段代码import requests运行前环境中需要有requests库get_joke在接口非 200 时会返回兜底文案Heres a {category} joke!而不是抛异常。仓库里可直接运行的完整脚本是 app-tools.py内容与文档全量代码一致add和joke两个工具都已绑定。限制与下一步工具是否被调用由模型根据工具名、描述和字段规格自行判断文档中的说法是模型“examined” query 后“made this determination from the tools name, description, and field specifications”。描述写得模糊会增加误判概率这一点由 TypedDict 的 docstring 和Annotated描述字段控制。res.tool_calls可能为空模型直接作答代码必须像文档示例那样先判断再执行不能假设每次都会触发工具。文档在“Building a complete AI application”一节把工具调用和会话记忆组合成了一个CodingAssistant类含execute_tool分发逻辑Assignment 则要求实现至少两个教育类工具的StudyAssistant两者都在 10-ai-framework-project/README.md 内可作为跑通本文后的延伸练习。【免费下载链接】Web-Dev-For-Beginners24 Lessons, 12 Weeks, Get Started as a Web Developer项目地址: https://gitcode.com/GitHub_Trending/we/Web-Dev-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表