langChain开发你的第一个 Agent

想获取更多高质量的Java技术文章?欢迎访问 技术小馆官网,持续更新优质内容,助力技术成长!

langChain开发你的第一个 Agent

还记得《钢铁侠》中贾维斯的智能助手形象吗?如今,借助LangChain框架,你也能在短短半小时内打造属于自己的AI助手。不需要深厚的机器学习背景,只要几十行代码,你就能创建一个能查询网络、分析数据、回答问题的智能Agent。

一、LangChain与Agent

1. 什么是LangChain

LangChain是一个强大的框架,它让开发者能够轻松构建基于大语言模型(LLM)的应用。就像乐高积木一样,LangChain提供了各种可组合的组件,让你能够快速搭建复杂的AI应用。它解决了单纯使用API调用LLM时的诸多限制,比如上下文管理、工具使用等问题。

javascript 复制代码
// 导入LangChain核心组件
import { ChatOpenAI } from "langchain/chat_models/openai";
import { ChatPromptTemplate } from "langchain/prompts";

// 初始化LLM
const llm = new ChatOpenAI({ 
  temperature: 0.7,
  openAIApiKey: "你的API密钥" 
});

2. Agent的本质

Agent不仅仅是一个能对话的AI,更是一个能够"思考-决策-行动"的智能体。想象一下,如果普通的LLM是一个只会回答问题的图书管理员,那Agent就是一个能够查阅资料、使用工具、解决问题的私人助理。Agent的核心在于它能够根据用户的需求,自主决定使用什么工具,以什么顺序执行任务。

3. 为什么选择LangChain开发Agent?

LangChain为Agent开发提供了完整的生态系统:

  • 简化的工具集成方式
  • 灵活的Agent类型选择
  • 丰富的记忆管理机制
  • 完善的调试与监控功能

与从零开始构建相比,使用LangChain可以将开发时间从数周缩短到数小时。

4. 开发环境准备

在开始前,我们需要准备好开发环境:

bash 复制代码
# 创建项目目录
mkdir my-first-agent
cd my-first-agent

# 初始化项目
npm init -y

# 安装依赖
npm install langchain @langchain/openai

# 创建入口文件
touch index.ts

二、Agent的核心组件

1. LLM模型选择

Agent的"大脑"是LLM模型,选择合适的模型至关重要。对于入门级Agent,推荐使用OpenAI的gpt-3.5-turbo或gpt-4。前者速度快成本低,后者推理能力更强。

php 复制代码
import { ChatOpenAI } from "langchain/chat_models/openai";

// 初始化不同的LLM模型
const fastModel = new ChatOpenAI({ 
  modelName: "gpt-3.5-turbo",
  temperature: 0.7 
});

const smartModel = new ChatOpenAI({ 
  modelName: "gpt-4",
  temperature: 0.2 
});

2. 扩展Agent能力的关键

工具(Tools)是Agent与外部世界交互的桥梁。没有工具的Agent就像被关在笼子里的AI,只能基于已知信息回答问题。

typescript 复制代码
import { DynamicTool } from "langchain/tools";

// 创建一个简单的天气查询工具
const weatherTool = new DynamicTool({
  name: "getCurrentWeather",
  description: "获取指定城市的当前天气情况",
  func: async (city: string) => {
    // 这里应该是实际的API调用,这里用模拟数据
    return `${city}当前天气:晴朗,温度25°C,湿度60%`;
  },
});

3. 让你的Agent具有上下文理解能力

记忆机制让Agent能够"记住"之前的对话,从而提供连贯的交互体验:

javascript 复制代码
import { BufferMemory } from "langchain/memory";

// 创建简单的缓冲记忆
const memory = new BufferMemory({
  returnMessages: true,
  memoryKey: "chat_history",
});

三、第一个Agent的诞生

1. 项目结构设计

一个清晰的项目结构能让开发事半功倍:

perl 复制代码
my-first-agent/
├── index.ts         # 入口文件
├── tools/           # 自定义工具目录
│   ├── weather.ts   # 天气查询工具
│   └── calculator.ts # 计算工具
├── config.ts        # 配置文件
└── package.json

2. 核心代码实现

下面是创建一个简单Agent的完整代码:

javascript 复制代码
import { ChatOpenAI } from "langchain/chat_models/openai";
import { initializeAgentExecutorWithOptions } from "langchain/agents";
import { Calculator } from "langchain/tools/calculator";
import { WebBrowser } from "langchain/tools/webbrowser";
import { BufferMemory } from "langchain/memory";

async function main() {
  // 初始化LLM
  const model = new ChatOpenAI({ temperature: 0 });
  
  // 准备工具
  const tools = [
    new Calculator(),
    new WebBrowser({ model }),
  ];
  
  // 配置记忆
  const memory = new BufferMemory({
    returnMessages: true,
    memoryKey: "chat_history",
  });
  
  // 创建Agent执行器
  const executor = await initializeAgentExecutorWithOptions(
    tools,
    model,
    {
      agentType: "chat-conversational-react-description",
      memory,
      verbose: true,
    }
  );
  
  // 执行查询
  const result = await executor.invoke({ 
    input: "计算23乘以45是多少,然后帮我查询一下北京今天的天气" 
  });
  
  console.log(result.output);
}

main();

3. 自定义工具开发

自定义工具让你的Agent拥有独特能力:

typescript 复制代码
import { DynamicTool } from "langchain/tools";
import * as fs from "fs";

// 创建一个文件读取工具
const fileReaderTool = new DynamicTool({
  name: "FileReader",
  description: "读取指定路径的文本文件内容",
  func: async (filePath: string) => {
    try {
      const content = fs.readFileSync(filePath, "utf-8");
      return content;
    } catch (error) {
      return `读取文件失败: ${error.message}`;
    }
  },
});

// 创建一个简单的翻译工具
const translationTool = new DynamicTool({
  name: "Translator",
  description: "将文本从一种语言翻译到另一种语言",
  func: async (input: string) => {
    // 格式: "文本|源语言|目标语言"
    const [text, from, to] = input.split("|");
    
    // 这里应该是实际的翻译API调用
    // 简单模拟一下结果
    return `已将文本从${from}翻译成${to}: ${text}翻译结果`;
  },
});

4. 提升Agent响应质量的技巧

调试是提升Agent质量的关键环节:

javascript 复制代码
// 启用详细日志
const executor = await initializeAgentExecutorWithOptions(
  tools,
  model,
  {
    agentType: "chat-conversational-react-description",
    memory,
    verbose: true, // 开启详细日志
    maxIterations: 5, // 限制最大迭代次数
    returnIntermediateSteps: true, // 返回中间步骤
  }
);

// 分析Agent的思考过程
const result = await executor.invoke({ input: "帮我分析一下比特币最近的价格趋势" });
console.log("思考步骤:", JSON.stringify(result.intermediateSteps, null, 2));

四、让你的Agent更聪明

1. 提升Agent推理能力

链式思考(Chain of Thought)是提升Agent推理能力的关键技术:

javascript 复制代码
import { ChatOpenAI } from "langchain/chat_models/openai";
import { ChatPromptTemplate, HumanMessagePromptTemplate } from "langchain/prompts";

// 创建一个引导链式思考的提示模板
const promptTemplate = ChatPromptTemplate.fromPromptMessages([
  HumanMessagePromptTemplate.fromTemplate(
    "请一步步思考以下问题:\n{question}\n\n让我们先分析问题,然后逐步推导答案。"
  ),
]);

const llm = new ChatOpenAI({ temperature: 0 });

// 创建链式思考链
const chain = promptTemplate.pipe(llm);

// 执行复杂推理
const response = await chain.invoke({
  question: "如果一个项目需要8人完成10天,那么4人完成同样的项目需要多少天?",
});

console.log(response);

2. Agent如何"记住"历史对话

持久化记忆让Agent能够长期记住用户偏好和历史交互:

javascript 复制代码
import { ChatOpenAI } from "langchain/chat_models/openai";
import { initializeAgentExecutorWithOptions } from "langchain/agents";
import { Calculator } from "langchain/tools/calculator";
import { MongoDBChatMessageHistory } from "langchain/stores/message/mongodb";
import { BufferMemory } from "langchain/memory";

async function createAgentWithPersistentMemory(userId: string) {
  // 创建MongoDB消息存储
  const messageHistory = new MongoDBChatMessageHistory({
    collection: database.collection("chatHistory"),
    sessionId: userId,
  });
  
  // 基于持久化存储创建记忆
  const memory = new BufferMemory({
    chatHistory: messageHistory,
    returnMessages: true,
    memoryKey: "chat_history",
  });
  
  const model = new ChatOpenAI({ temperature: 0 });
  const tools = [new Calculator()];
  
  // 创建Agent执行器
  return await initializeAgentExecutorWithOptions(
    tools,
    model,
    {
      agentType: "chat-conversational-react-description",
      memory,
      verbose: true,
    }
  );
}

// 使用示例
const userId = "user123";
const agent = await createAgentWithPersistentMemory(userId);

// 即使应用重启,Agent也能记住之前的对话
const result = await agent.invoke({ 
  input: "我昨天问你的问题,你还记得吗?" 
});

五、Agent的现实应用

1. 日程管理与信息检索

个人助理Agent可以帮助管理日程和检索信息:

typescript 复制代码
import { ChatOpenAI } from "langchain/chat_models/openai";
import { initializeAgentExecutorWithOptions } from "langchain/agents";
import { DynamicTool } from "langchain/tools";

// 日程管理工具
const calendarTool = new DynamicTool({
  name: "Calendar",
  description: "管理用户的日程安排",
  func: async (input: string) => {
    // 解析指令: "add|2023-07-15 14:00|会议"或"query|2023-07-15"
    const [action, ...params] = input.split("|");
    
    if (action === "add") {
      // 添加日程逻辑
      return `已添加日程: ${params[1]} 在 ${params[0]}`;
    } else if (action === "query") {
      // 查询日程逻辑
      return `${params[0]}的日程: 14:00-15:00 产品评审会议, 16:00-17:00 团队周会`;
    }
    return "无效的日程操作";
  },
});

// 信息检索工具
const searchTool = new DynamicTool({
  name: "Search",
  description: "搜索互联网获取信息",
  func: async (query: string) => {
    // 实际应用中应调用搜索API
    return `关于"${query}"的搜索结果: 1. 相关网页A 2. 相关网页B 3. 相关网页C`;
  },
});

// 创建个人助理Agent
async function createPersonalAssistant() {
  const model = new ChatOpenAI({ temperature: 0.2 });
  const tools = [calendarTool, searchTool];
  
  return await initializeAgentExecutorWithOptions(
    tools,
    model,
    {
      agentType: "chat-conversational-react-description",
      verbose: true,
    }
  );
}

// 使用示例
const assistant = await createPersonalAssistant();
const result = await assistant.invoke({ 
  input: "帮我安排明天下午3点和张总的会议,然后查一下最近的人工智能新闻" 
});

2. 从数据中提取洞见

数据分析助手可以帮助用户理解复杂数据:

typescript 复制代码
import { ChatOpenAI } from "langchain/chat_models/openai";
import { initializeAgentExecutorWithOptions } from "langchain/agents";
import { DynamicTool } from "langchain/tools";

// 数据加载工具
const dataLoaderTool = new DynamicTool({
  name: "DataLoader",
  description: "从CSV或JSON文件加载数据",
  func: async (filePath: string) => {
    // 模拟数据加载
    return `已加载${filePath},包含500条销售记录`;
  },
});

// 数据分析工具
const dataAnalysisTool = new DynamicTool({
  name: "DataAnalysis",
  description: "对加载的数据进行统计分析",
  func: async (analysisType: string) => {
    // 模拟不同类型的分析
    if (analysisType.includes("趋势")) {
      return "销售趋势分析: 过去6个月销售额稳步增长,平均增长率为12%";
    } else if (analysisType.includes("分布")) {
      return "客户分布分析: 80%的收入来自20%的客户,符合帕累托原则";
    }
    return "基本统计: 平均销售额¥5600,中位数¥4200,标准差¥1200";
  },
});

// 创建数据分析Agent
async function createDataAnalysisAssistant() {
  const model = new ChatOpenAI({ temperature: 0 });
  const tools = [dataLoaderTool, dataAnalysisTool];
  
  return await initializeAgentExecutorWithOptions(
    tools,
    model,
    {
      agentType: "chat-conversational-react-description",
      verbose: true,
    }
  );
}

// 使用示例
const analyst = await createDataAnalysisAssistant();
const result = await analyst.invoke({ 
  input: "加载sales_2023.csv文件,然后分析销售趋势" 
});

3. 提升用户体验的智能对话

客服机器人可以提供24/7的用户支持:

typescript 复制代码
import { ChatOpenAI } from "langchain/chat_models/openai";
import { initializeAgentExecutorWithOptions } from "langchain/agents";
import { DynamicTool } from "langchain/tools";
import { BufferMemory } from "langchain/memory";

// 知识库查询工具
const knowledgeBaseTool = new DynamicTool({
  name: "KnowledgeBase",
  description: "查询产品知识库获取信息",
  func: async (query: string) => {
    // 模拟知识库查询
    if (query.includes("退款")) {
      return "退款政策: 购买后7天内未使用可全额退款,使用后根据使用情况部分退款";
    } else if (query.includes("配送")) {
      return "配送信息: 一线城市通常1-2天送达,其他地区3-5天送达";
    }
    return "未找到相关信息,请联系人工客服";
  },
});

// 工单创建工具
const ticketTool = new DynamicTool({
  name: "CreateTicket",
  description: "创建客服工单",
  func: async (issue: string) => {
    // 模拟工单创建
    const ticketId = Math.floor(Math.random() * 10000);
    return `已创建工单 #${ticketId}: ${issue},客服将在24小时内联系您`;
  },
});

// 创建客服Agent
async function createCustomerServiceAgent() {
  const model = new ChatOpenAI({ temperature: 0.3 });
  const tools = [knowledgeBaseTool, ticketTool];
  
  const memory = new BufferMemory({
    returnMessages: true,
    memoryKey: "chat_history",
  });
  
  return await initializeAgentExecutorWithOptions(
    tools,
    model,
    {
      agentType: "chat-conversational-react-description",
      memory,
      verbose: true,
    }
  );
}

// 使用示例
const customerService = await createCustomerServiceAgent();
const result = await customerService.invoke({ 
  input: "我想了解一下你们的退款政策" 
});

通过以上实例,我们看到LangChain Agent在各种场景中的强大应用潜力。从个人助理到数据分析,再到客户服务,Agent都能提供智能化的解决方案。随着你对LangChain的深入了解,你可以构建更复杂、更强大的Agent来满足各种需求。

相关推荐
岁忧7 分钟前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
CJi0NG11 分钟前
【自用】JavaSE--算法、正则表达式、异常
java
Hellyc38 分钟前
用户查询优惠券之缓存击穿
java·redis·缓存
今天又在摸鱼1 小时前
Maven
java·maven
老马啸西风1 小时前
maven 发布到中央仓库常用脚本-02
java·maven
代码的余温1 小时前
MyBatis集成Logback日志全攻略
java·tomcat·mybatis·logback
3Katrina1 小时前
深入理解 useLayoutEffect:解决 UI "闪烁"问题的利器
前端·javascript·面试
前端_学习之路2 小时前
React--Fiber 架构
前端·react.js·架构
一只叫煤球的猫3 小时前
【🤣离谱整活】我写了一篇程序员掉进 Java 异世界的短篇小说
java·后端·程序员
斐波娜娜3 小时前
Maven详解
java·开发语言·maven