[LangChain] 21. LangChain中创建Agent

news/2025/11/22 16:55:04/文章来源:https://www.cnblogs.com/Answer1215/p/19258108

LangChain Hub

LangChain Hub 是一个托管 Prompt 与 Chain 配置的集中仓库(可以理解成 Hugging Face Hub 的“提示词版”)。

它允许开发者:

  • 上传 / 分享 自己的 prompt、chain 配置;
  • 下游用户可以直接通过一个 key (author/name) 拉取使用;
  • 便于复用、标准化,而不是大家都在项目里复制粘贴 prompt 字符串。

官方定位:“Prompt templates hosting and sharing service”。

核心 API 就两个:

pull(identifier: string):从 Hub 拉取指定资源(prompt 或 chain)。

  • 参数 identifier 的形式通常是:
    • "hwchase17/react"
    • "hwchase17/openai-tools-agent"
    • "org_name/custom_prompt"
  • 返回值取决于资源类型:
    • 如果是 prompt,就返回 PromptTemplateChatPromptTemplate 对象;
    • 如果是 chain,就返回 chain runnable。

push(...):把本地的 prompt / chain 上传到 Hub(需配置账户权限),JS/TS 里用得少,更多是官方/团队场景。

得到的提示词:

Answer the following questions as best you can. You have access to the following tools:{tools}Use the following format:Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input questionBegin!Question: {input}
Thought:{agent_scratchpad}
  • Question:自动填充成用户输入;
  • Thought:模型写下推理思路(“我需要先查天气,然后算…”);(CoT:Chain of Thought)
  • Action:必须严格写成工具名之一([{tool_names}] 会替换成 weather, calculator 之类);
  • Action Input:传给工具的参数(字符串);
  • Observation:执行工具的返回结果;
  • 循环:Thought → Action → Action Input → Observation 可以重复多次;
  • Final Answer:最终答案,直接写给用户。

这就是 ReAct 循环(Reasoning + Acting)

Begin!Question: {input}
Thought:{agent_scratchpad}
  • {input}:用户真实提问,比如“北京今天的天气如何?”;

  • {agent_scratchpad}:ReAct 的关键变量,用来记录之前所有的 Action/Observation 历史。

    • 第一次调用时是空;

    • 之后每轮会把上一轮的 Action/Observation 填进去,再交给模型继续思考。

Tools

前面介绍的模型携带 Tools:

const modelWithTool = new ChatOpenAI({model: "gpt-3.5-turbo-1106",apiKey: process.env.API_KEY,temperature: 0,
}).withConfig({tools: [{type: "function",function: {name: "getCurrentWeather",description: "获取指定城市当前天气",parameters: getCurrentWeatherJsonSchema,},},],
});

这是 OpenAI API 的原生 Function Calling / Tool Calling 配置。在 底层 LLM 请求里,直接把工具符合 OpenAI 规范的 schema 传给模型。特点:

  • 完全贴近 OpenAI 官方的 tools: [...] 格式(type: "function" + JSON Schema)。
  • 模型生成的 tool_calls 会自动遵守 schema;
  • 这是模型原生能力,不需要 ReAct prompt。

这里要使用的 Tool 稍微有些不同,需要一个能被 Agent 消费的 Tool。

在 LangChain.js 中,提供了一个 Tool 工具,能够生成给 Agent 消费的 Tool 工具:

import { tool } from "@langchain/core/tools";
tool(方法(具体的业务逻辑),{name: "xxx",description: "xxx",schema: "xxx"
})

示例:

import { tool } from "@langchain/core/tools";
import { z } from "zod";const weatherTool = tool(async (city) => `${city}:多云转晴,28℃ / 20℃(示例数据)`,{name: "weather",description: "查询城市天气。输入城市名。",schema: z.string(),}
);

上例中得到的 weatherTool 是一个符合 LangChain Tool 接口的对象,可被 AgentExecutor/ createReactAgent/ createToolCallingAgent 直接使用。

createReactAgent

LangChain.js 中提供方法,用于创建基于 ReAct 提示法的 Agent。方法签名:

createReactAgent(params)

必填 params 参数:

  • llm:任一兼容的聊天/文本 LLM。
  • tools:工具列表(结构化工具)。
  • prompt:ReAct 模板(推荐直接从 Hub 拉 hwchase17/react)。这个 prompt 决定了该 agent 的输入变量集合。

返回值:返回的是一个 runnable,每次调用只产出两类结果之一:

  • AgentAction:表示“去调用某个工具”的决策。包含三要素:
    • tool(工具名)
    • toolInput(传给工具的输入,字符串或对象)
    • log(可读的思考/轨迹文本)
  • AgentFinish:表示“本回合已经得到最终答案”。包含:
    • returnValues(一个对象,通常至少有 output 字段)
    • log(最终总结/轨迹)

打印出来的 agent,大致是如下的形式:

RunnableSequence (name: "ReactAgent")├─ first:  RunnableAssign( mapper = RunnableMap(...) )├─ middle: [ PromptTemplate(...), ChatOpenAI(...) ]└─ last:   ReActSingleInputOutputParser(toolNames=[...])===> 输入 → Assign预处理 → 模板渲染 → LLM补全 → ReAct输出解析 → (AgentAction | AgentFinish)
  • RunnableSequence:LCEL 的“管道”。把多个 runnable 依次串起来。

    • first:把原始输入整理成 Prompt 需要的变量。
    • middle:
      • 第 1 项:从 Hub 拉下来的 ReAct 模板
      • 第 2 项:LLM 调用
    • last:ReAct 专用输出解析器。它会:
      • 检查模型的文本是否遵守规范(有 Action:Action Input:Final Answer: 等)。
      • 如果检测到 Final Answer: :产出 AgentFinish(结束)。
      • 否则解析出 Action + Action Input :产出 AgentAction
  • singleAction: true:这个 Agent 每次只产出一个结果:

    • 要么一个工具动作(AgentAction
    • 要么终止(AgentFinish

AgentExecutor

AgentExecutor,顾名思义,就是 agent 执行器,它把你已经构造好的 agent 和 tools 结合起来,负责外层的 ReAct 式决策循环:反复“让 agent 规划一步 → 调工具 → 回填观察 → 再问 agent”,直到结束。

具体的运行过程:

  1. 调用 agent:agent 会返回 AgentAction(要调哪个工具+参数)或 AgentFinish(结束)
  2. 执行工具:当拿到 AgentAction 时,AgentExecutor 根据 action.tool 找到对应 tool,校验 toolInput,执行并得到 observation。
  3. 记录中间步骤:把 { action, observation } 追加成一条 AgentStep,同时把它格式化进 agent_scratchpad,供下一轮给 agent 使用。
  4. 判断是否继续:如果 agent 返回 AgentFinish,或到达最大迭代次数,则停止并产出最终结果。官方提供了一个 shouldContinueGetter() 用来判断是否继续(基于已执行轮数)。

对应的配置项、方法等可以参阅 这里。


import { pull } from "langchain/hub";
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent, AgentExecutor } from "@langchain/classic/agents";
import { weatherTool, weekdayTool } from "./tools.js";
import "dotenv/config";// Prompt
const prompt = await pull("hwchase17/react");const llm = new ChatOpenAI({model: "gpt-4o-mini",temperature: 0,
});const tools = [weatherTool, weekdayTool];const agent = await createReactAgent({llm,tools,prompt,
});const executor = new AgentExecutor({agent,tools,returnIntermediateSteps: true,maxIterations: 3,handleParsingErrors: true,
});const res = await executor.invoke({input: "What is the weather in Tokyo?",
});console.log(res);
import { tool } from "@langchain/core/tools";
import { z } from "zod";export const weatherTool = tool(async (city) => {// call the real weather apiif (!city) {return "Please provide a city name";}return `${city} is ${Math.random() > 0.5 ? "sunny" : "cloudy"}`;},{name: "weather",description: "Get the current weather in a given location",schema: z.string(),}
);export const weekdayTool = tool(async () => {return new Date().toLocaleDateString("en-US", { weekday: "long" });},{name: "weekday",description: "Get the current weekday",schema: z.string(),}
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/973251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年钢丝绳牵引格栅机批发厂家权威推荐榜单:抓斗清污机/耙斗清污机/移动抓斗清污机源头厂家精选

在水环境治理需求持续增长的推动下,钢丝绳牵引格栅机以其稳定的清污性能和可靠的工作效率,正成为市政污水处理、泵站清污的关键设备。 根据水利机械行业数据显示,2024年中国水处理清污设备市场规模达到127亿元,年均…

HBase大数据存储如何提升读写性能

Hbase是一个分布式、可扩展、支持海量数据存储的NoSQL数据库,它通过优化数据模型、硬件配置、系统配置、缓存机制以及负载均衡策略来提升读写性能。以下是一些关键的性能优化措施: Hbase大数据存储提升读写性能的方法…

HBase大数据存储如何应对网络延迟

Hbase分布式数据库,其设计允许它通过一系列优化措施来应对网络延迟,确保数据存储和访问的性能。以下是一些主要的优化方法: Hbase优化方法预分区和预分割表:通过合理设计表的列簇、列族和列的结构,避免过多的列族…

P10683 [COTS 2024] 划分 Particija

思路 转化一下题意,\(a_i\) 和 \(b_i\) 恰有一个限制被满足,变成在一个二分图上有一些边 \((a_i,b_i)\),求最小点覆盖。 \(k>0\) 时可以更改一条边的一个端点,使得最大或最小化最小点覆盖。 不难发现整个图是由…

2025云南曲靖市玉溪市一对一家教辅导测评排行榜:权威推荐高性价比选择

一、家教选择痛点凸显,两地学子急需优质辅导解决方案 在曲靖市麒麟区、沾益区、马龙区、宣威市、罗平县、富源县、师宗县、陆良县、会泽县,玉溪市红塔区、江川区、澄江市、通海县、华宁县、易门县、峨山彝族自治县、…

2026年盐城一对一补习机构权威推荐:靠谱辅导机构测评排行榜

盐城市小学、初中、高中家长在一对一家教选择中深陷困境:小学家长渴求靠谱教育机构夯实基础,却遇“试听课优质、正式课换师”的货不对板;初中家长筛选辅导培训平台时,常被“缴费不退”的霸王条款捆绑;高中家长为培…

2025高粱酒纯粮食酒推荐TOP10,纯粮固态发酵酱香浓郁回甘绵长

高粱酒作为中国白酒的核心品类,以高粱为主要原料的纯粮食酿造工艺,不仅承载着千年酿酒文化,更凭借醇厚的口感与自然的风味成为酒类消费市场的主流选择。不同香型的高粱酒在工艺、风味上各具特色,从酱香的醇厚绵长到…

2025内蒙古兴安盟锡林郭勒盟阿拉善盟一对一家教辅导测评排行榜:优质选择推荐

在兴安盟(乌兰浩特市、阿尔山市、科尔沁右翼前旗、科尔沁右翼中旗、扎赉特旗、突泉县)、锡林郭勒盟(锡林浩特市、二连浩特市、阿巴嘎旗、苏尼特左旗、苏尼特右旗、东乌珠穆沁旗、西乌珠穆沁旗、太仆寺旗、镶黄旗、正…

2025年煤矿用阻燃铠装光缆生产厂家权威推荐榜单:矿用铠装光缆/煤矿用光缆/矿用4芯光缆源头厂家精选

在煤矿智能化建设与安全生产要求不断提升的背景下,矿用阻燃铠装光缆以其卓越的机械防护性能和本质安全特性,正成为煤矿井下通信系统不可或缺的传输媒介。 煤矿井下环境复杂,存在瓦斯、煤尘等易燃易爆风险,对通信光…

玉树州一对一家教机构最新推荐,2026最新家教机构榜单:家长首选靠谱提分方案推荐

玉树市、杂多县、称多县、囊谦县、治多县、曲麻莱县的家长们,是不是总在为孩子的课外补习发愁?靠谱的玉树州一对一辅导机构哪家好?不同平台收费多少合理?如何避开“付费陪读”的坑?不管是结古大道、香达街周边的家…

回滚莫队模版

回滚莫队模版 题意 给定数列,查询 \(l\) 到 \(r\) 的众数。 思路 如果考虑暴力,我们需要一遍遍的遍历数列的数,然后求众数,但是这样效率太低了。 思考怎么优化,首先想到的线段树,但很容易发现这个众数一点都不好…

2025年拉袋离心机订制厂家权威推荐榜单:碟式离心机/卧螺离心机/活塞推料离心机源头厂家精选

在制药、化工等行业对固液分离技术要求不断提高的背景下,拉袋离心机凭借其自动化程度高、卸料效率优异的特点,正成为高端分离设备市场的重要选择。 据行业数据显示,2024年中国离心机市场规模已达156亿元,年均增长率…

Linux中: 通过编译安装的方式升级 OpenSSH 服务

Linux中: "通过编译安装的方式升级 OpenSSH 服务"OpenSSH 升级背景: 因为当前操作系统上的 OpenSSH 是通过包管理工具进行安装,因为低版本存在漏洞问题,但是官方仓库中没有最新的 OpenSSH 版本,所以此时…

纵观当代现状,70年代出生的人,可能别具一格

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891对“70年代出生人群的别具一格”这一现象给出绝对确定性的因果分析。 历史相位的独特烙印 出生环境的因果特殊性 70年代出生者 = 成长于理想主义巅峰期(70-80…

#题解#洛谷 P4375 Out of Sorts G #离散化#

P4375 [USACO18OPEN] Out of Sorts G - 洛谷 分析注意到排序跟只跟数据的序相关,我们将原始数据离散化,并将数值更新为序不难注意到:每次moo只冒泡一次,对于每一个前缀子区间,会将较大的冒泡到末尾;由此不难想到…

hbase上如何导入python包

在 Hbase 上导入 Python 包(如 pandas、numpy、matplotlib 等)通常需要借助 Hadoop 的 YARN 环境 或 Hbase 的 HDFS 存储,因为 Hbase 本身是一个基于 HDFS 的分布式存储系统,其数据存储在 HDFS 上,而 Python 通常…

轻薄手机推荐:不止于轻,2025 旗舰体验榜 - 详解

轻薄手机推荐:不止于轻,2025 旗舰体验榜 - 详解2025-11-22 16:29 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

Git为什么要有submodule呢?

我们的项目中有一个子模块,所以导致经常更新master分支之后还需要对submodule进行一定的操作。所以我时常疑惑为什么会有这个东西呢?为什么一定要用子模块而不能把整个子模块加入我们的代码中呢? 其实主要解决的是这…

征程 6E/M 计算平台部署指南

1. 前言 本文旨在提供 征程 6E/M 计算平台的部署指南,将会从硬件、软件两部分进行介绍,本文整理了我们推荐的使用流程,和大家可能会用到的一些工具特性,以便于您更好地理解工具链。某个工具具体详细的使用说明,还…