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来满足各种需求。

相关推荐
专吃海绵宝宝菠萝屋的派大星3 分钟前
使用Dify对接自己开发的mcp
java·服务器·前端
2501_9333295519 分钟前
技术架构深度解析:Infoseek舆情监测系统的全链路设计与GEO时代的技术实践
开发语言·人工智能·分布式·架构
大数据新鸟21 分钟前
操作系统之虚拟内存
java·服务器·网络
Tong Z22 分钟前
常见的限流算法和实现原理
java·开发语言
凭君语未可26 分钟前
Java 中的实现类是什么
java·开发语言
He少年28 分钟前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
前端大波36 分钟前
前端面试通关包(2026版,完整版)
前端·面试·职场和发展
迷枫71238 分钟前
达梦数据库的体系架构
数据库·oracle·架构
克里斯蒂亚诺更新38 分钟前
myeclipse的pojie
java·ide·myeclipse
迷藏4941 小时前
**eBPF实战进阶:从零构建网络流量监控与过滤系统**在现代云原生架构中,**网络可观测性**和**安全隔离**已成为
java·网络·python·云原生·架构