langChain开发你的第一个 Agent
想获取更多高质量的Java技术文章?欢迎访问 技术小馆官网,持续更新优质内容,助力技术成长!
langChain开发你的第一个 Agent
还记得《钢铁侠》中贾维斯的智能助手形象吗?如今,借助LangChain框架,你也能在短短半小时内打造属于自己的AI助手。不需要深厚的机器学习背景,只要几十行代码,你就能创建一个能查询网络、分析数据、回答问题的智能Agent。
一、LangChain与Agent
1. 什么是LangChain
LangChain是一个强大的框架,它让开发者能够轻松构建基于大语言模型(LLM)的应用。就像乐高积木一样,LangChain提供了各种可组合的组件,让你能够快速搭建复杂的AI应用。它解决了单纯使用API调用LLM时的诸多限制,比如上下文管理、工具使用等问题。
// 导入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. 开发环境准备
在开始前,我们需要准备好开发环境:
# 创建项目目录 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。前者速度快成本低,后者推理能力更强。
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,只能基于已知信息回答问题。
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能够"记住"之前的对话,从而提供连贯的交互体验:
import { BufferMemory } from "langchain/memory"; // 创建简单的缓冲记忆 const memory = new BufferMemory({ returnMessages: true, memoryKey: "chat_history", });
三、第一个Agent的诞生
1. 项目结构设计
一个清晰的项目结构能让开发事半功倍:
my-first-agent/ ├── index.ts # 入口文件 ├── tools/ # 自定义工具目录 │ ├── weather.ts # 天气查询工具 │ └── calculator.ts # 计算工具 ├── config.ts # 配置文件 └── package.json
2. 核心代码实现
下面是创建一个简单Agent的完整代码:
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拥有独特能力:
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质量的关键环节:
// 启用详细日志 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推理能力的关键技术:
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能够长期记住用户偏好和历史交互:
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可以帮助管理日程和检索信息:
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. 从数据中提取洞见
数据分析助手可以帮助用户理解复杂数据:
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的用户支持:
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来满足各种需求。
#langchain#