使用 LangChain 搭建一个 AI Agent:从零到可运行 Demo

本文将带你从零搭建一个基于 LangChain + NestJS + Gemini 的 AI Agent Demo。

使用的是NestJS框架,不了解的可能需要先了解下。

大模型使用Gemini,Gemini有免费配额。

直接开整:

1. 建项目,导包

npm i -g @nestjs/cli
nest new langchain-agent-demo

导包

npm add @langchain/core @langchain/google-genai @langchain/agents zod 

2. 建模块

模块建立纯属个人习惯,大可按照自己的规范来。

image

3. 开搓

tools://tools 工具,给llm调用的 

import { z } from 'zod';
import { DynamicStructuredTool } from '@langchain/core/tools';

// 新增
export const addTool = new DynamicStructuredTool({
  name: 'addItem',
  description: '新增一个项目',
  schema: z.object({
    name: z.string(),
  }),
  async func({ name }) {
    console.log('11执行新增:', name);
    return `已新增: ${name}`;
  },
});

// 删除
export const deleteTool = new DynamicStructuredTool({
  name: 'deleteItem',
  description: '删除一个项目',
  schema: z.object({
    id: z.string(),
  }),
  async func({ id }) {
    console.log('执行删除:', id);
    return `已删除: ${id}`;
  },
});

// 修改
export const updateTool = new DynamicStructuredTool({
  name: 'updateItem',
  description: '修改一个项目',
  schema: z.object({
    id: z.string(),
    name: z.string(),
  }),
  async func({ id, name }) {
    console.log('执行修改:', id, name);
    return `已修改 ID=${id}, 新名称=${name}`;
  },
});

export const selectTool = new DynamicStructuredTool({
  name: 'selectItem',
  description: '查询项目,可以查询所有项目或者单个项目',
  schema: z.object({}),
  async func() {
    console.log('执行查询11');
    return `已执行查询所有:123`;
  },
});

service:

import { Injectable } from '@nestjs/common';
import { ChatPromptTemplate } from '@langchain/core/prompts';
import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
import { addTool, deleteTool, selectTool, updateTool } from './tool/tool';

@Injectable()
export class LangchainService {
  private readonly model: ChatGoogleGenerativeAI;

  constructor() {
   // ps: 访问gemini的api需要设置代理,不同llm 构建model的方法不同,也可使用langchain的createAgent(...)等方式,具体参考官方文档
this.model = new ChatGoogleGenerativeAI({ model: 'gemini-2.5-flash-lite', apiKey: 'xxxxxxxx',//你的gemini api key temperature: 0.7, }); } /** * 简单 Demo: * 传入一个需求,Gemini对工具做出简单调用 */ async chat(question: string) { // 1. Prompt 模版 const prompt = ChatPromptTemplate.fromMessages([ [ 'system', '你是一个智能助手,可以根据用户的要求调用工具,判断是否有数据增删改查要求调用工具', ], ['human', '{input}'], ]);
  // 封工具
const modelWithTools = this.model.bindTools([ addTool, deleteTool, updateTool, selectTool, ]); const chain = prompt.pipe(modelWithTools); const aiMessage = await chain.invoke({ input: question });    // 返回需要调用的工具,可以有多个 console.log('工具调用信息:', aiMessage?.tool_calls); const results = []; if (aiMessage?.tool_calls?.length > 0) { for (const toolCall of aiMessage.tool_calls) {// 调用工具 const toolMap = { addItem: addTool, deleteItem: deleteTool, updateItem: updateTool, selectItem: selectTool, }; const tool = toolMap[toolCall.name]; const result = await tool.func(toolCall.args); console.log('工具执行结果:', result); results.push(result); } } return results; } }

controller:

import { Body, Controller, Post } from '@nestjs/common';
import { LangchainService } from './langchain.service';


  class ChatDto {
    message: string;
  }
 
@Controller('langchain')
export class LangchainController {
  constructor(private readonly langchainService: LangchainService) {}

  @Post('chat')
  async chat(@Body() body: ChatDto) {
    const { message } = body;
    const answer = await this.langchainService.chat(message);

    return {
      question: message,
      answer,
    };
  }
}

4. 启动->运行 ->调用 -> ok

5.常见错误与排查建议

  1. fetch failed / timeout / 403:通常是模型 API 地址、代理、或 key 权限问题。

  2. 工具无法被调用:检查工具描述是否清晰。LLM 必须理解:工具用途、什么场景应该触发。(切记)

  3. 返回空白或不响应:Gemini 免费版可能存在限额。

(ps: 有不对的地方,欢迎留言)

posted @ 2025-12-10 16:40  w_a_i  阅读(12)  评论(0)    收藏  举报