想获取更多高质量的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来满足各种需求。