基于 LangChain 搭建带文件读取工具的代码 Agent 实战指南

1 阅读7分钟

一、什么是 AI 智能体 Agent:大模型能力的完整扩展

原生大模型 LLM 本身存在天然短板:无记忆、无法操作外部资源、无法读取私有本地文件、不具备实时获取信息与执行操作的能力,属于无状态(stateless) 的文本生成模型。而 Agent 智能体的核心思路,就是给 LLM 补齐缺失能力,完整公式如下:Agent = LLM + Memory记忆模块 + Tool工具调用 + RAG知识库检索 + MCP第三方协议 + Skills专属技能

其中Tool 工具调用是 Agent 实现自主干活的核心能力,也是打通大模型与本地文件、命令行、接口、数据库的桥梁。原生 LLM 只能输出文字思路,无法真正读写文件、执行脚本、调用接口;接入 Tool 后,模型可以自主判断什么时候需要调用外部工具、传递对应参数,拿到外部数据后再完成推理回答,实现 “思考 + 实操” 一体化。

LangChain 是当下主流的 Agent 开发框架,配套 LangGraph 支持多智能体协作,完美适配 Node.js/NestJS 后端生态。它对各大厂商大模型做了统一封装,不管是 OpenAI、DeepSeek、Claude 都能无缝切换,同时提供标准化工具定义、参数校验、工具绑定能力,大幅降低自定义 Tool 开发成本。

二、Tool 工具的底层设计规范:LangChain+Zod 标准化约束

LangChain 中自定义工具由两大核心部分组成:异步执行函数 + 工具元信息配置,同时借助 Zod 做强参数校验,保证 LLM 调用工具时参数合法完整。

  1. 执行函数:异步逻辑,承载工具真实能力,比如读取文件、写入文件、执行 CLI 命令、发起网络请求;

  2. 元信息配置:包含工具名称、功能描述、Zod 参数 Schema 约束。

    • name:工具唯一标识,供 LLM 识别调用;
    • description:详细描述工具适用场景,让模型自主判断何时触发;
    • schema:Zod 类型约束,规定入参名称、类型、含义,LLM 生成调用参数时必须遵循该规范。

工具调用的完整链路:用户下发复杂任务 → LLM 推理判断需要外部数据 → 输出tool_calls工具调用指令(携带工具 ID、名称、参数)→ 后端执行对应异步工具函数 → 将工具返回结果回填会话上下文 → LLM 结合工具数据生成最终回答。多工具场景下还能利用Promise.all实现并行调用,同步执行多个 IO 任务,大幅提升 Agent 执行效率。

三、实战代码:搭建支持本地文件读取的代码解释 Agent

下面基于 DeepSeek 大模型、LangChain、fs 文件模块、Zod 实现一款文件读取代码助手 Agent,完整实现模型自主调用本地文件读取工具,分析代码文件。

1. 项目依赖与环境配置

需要环境变量配置大模型地址、密钥、模型名称,通过dotenv加载;核心依赖:

  • @langchain/openai:统一封装 OpenAI 兼容接口,适配 DeepSeek、通义千问等国产大模型;
  • @langchain/core:提供工具、消息、基础类型能力;
  • zod:工具参数强校验;
  • fs/promises:异步文件读写;
  • dotenv:读取环境变量。

2. 完整实现代码解析

typescript

运行

import 'dotenv/config';
import { ChatOpenAI } from '@langchain/openai';
import { tool } from '@langchain/core/tools';
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
import fs from 'fs/promises';
import { z } from 'zod';

// 初始化兼容OpenAI协议的DeepSeek大模型
const model=new ChatOpenAI({
    modelName:process.env.DEEPSEEK_MODEL,
    apiKey:process.env.DEEPSEEK_API_KEY, 
    temperature:0, // 温度设0,保证工具调用逻辑稳定、无随机发散
    configuration:{
        baseURL:process.env.DEEPSEEK_API_BASE_URL,
    }
})

// 自定义read_file文件读取工具
const readFileTool = tool(
  // 工具异步执行逻辑:读取本地文件并打印执行日志
  async ({ filePath }) => {
    const fileContent = await fs.readFile(filePath, 'utf-8');
    console.log(`[工具调用]read_file ${filePath}成功读取`);
    console.log(fileContent);
    return fileContent;
  },
  {
    name: 'read_file',
    description: `读取本地文件内容,适用于读取代码、查看文档、分析文件场景,支持绝对/相对文件路径`,
    schema: z.object({
      filePath: z.string().describe('文件绝对路径或相对路径'),
    }),
  }
);

// 聚合所有可用工具
const tools=[readFileTool]

// 将工具绑定到大模型,让模型拥有工具调用能力
const modelWithTools=model.bindTools(tools);

// 会话上下文:系统角色指令 + 用户提问
const messages=[
    new SystemMessage(`
        你是专业代码助手,可调用read_file工具读取本地文件并解读代码。
        固定工作流程:
        1. 用户要求读取文件时,立刻调用read_file工具;
        2. 等待工具返回完整文件内容;
        3. 基于读取到的代码内容完成分析、讲解。
        仅可使用read_file工具获取文件数据。
    `),
    new HumanMessage(`请读取文件 index.js 并解释其内容。`),
]

// 发起模型推理,模型自动生成工具调用指令
let response=await modelWithTools.invoke(messages);
console.log(response.content);
// 将模型返回的工具调用消息存入会话,用于后续回填工具执行结果
messages.push(response);

3. 核心流程拆解

  1. 模型初始化:使用ChatOpenAI兼容国产大模型,配置自定义接口地址、密钥,temperature=0保证工具调用逻辑稳定;

  2. 自定义文件读取工具:通过tool()工厂函数定义,Zod 约束文件路径参数,内置日志打印,方便观测 Agent 执行状态;

  3. 工具绑定model.bindTools(tools)将工具列表注册给 LLM,模型会读取工具描述与参数规范,自主判断调用时机;

  4. 会话消息体系

    • SystemMessage:系统角色提示词,规定 Agent 工作流程、工具使用规则;
    • HumanMessage:用户原始任务指令;
  5. 推理执行:调用invoke触发模型推理,当任务需要本地文件数据时,模型不会直接生成文本,而是返回tool_calls工具调用结构,告知后端需要读取哪个文件;

  6. 会话持久化:将模型工具调用消息推入消息数组,后续执行完文件读取后,把文件内容封装为工具返回消息追加上下文,二次调用模型即可完成代码解读。

四、工具扩展方向:打造全能自动化编码 Agent

单文件读取工具仅为基础能力,参考 Claude Code、Manus 自动化 Agent 设计思路,可拓展多类工具实现完整项目自动化:

  1. write_file 写入工具:自动生成 Vite/React 项目代码、创建配置文件;
  2. cli_command 命令行工具:执行npm create vitenpm run dev等命令,创建并启动前端项目;
  3. file_list 目录遍历工具:读取项目目录结构,梳理工程文件;
  4. http_request 网络工具:拉取在线文档、接口数据辅助开发。

多工具并发场景可使用Promise.all并行执行 IO 操作,相比串行await大幅缩短任务耗时,解决复杂 Agent 多工具连续调用效率低下问题。

五、落地价值:从单纯大模型到可商用 AI 智能体

单纯调用 LLM 接口只能实现问答对话,而基于 LangChain + 自定义 Tool 开发的 Agent 具备落地商业产品的能力:

  1. 本地资源操作:读取私有代码、企业内部文档,弥补 LLM 无法访问本地私有数据的短板;
  2. 自主任务规划:复杂任务自动拆分步骤,按需调用工具获取外部信息;
  3. 可扩展技能体系:按需新增文件、命令行、数据库、接口工具,打造专属行业 Agent;
  4. 后端工程化落地:搭配 NestJS 构建全栈 AI 服务,通过工程化手段完成 AI 能力商业化落地。

Tool 工具是打通大模型从 “文本对话” 到 “自主执行任务” 的关键,掌握自定义工具开发与 LangChain 工具绑定逻辑,就能快速搭建代码助手、自动化运维、企业知识库问答等各类实用 AI 智能体。