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#
全部评论

相关推荐

09-10 13:35
已编辑
四平职业大学 机器学习
终于讲到一个还没寄的人才计划了,感谢兴子一面:兴子好像每一轮面试都是采用的群面的方式,每轮面试都是至少2个面试官在场兴子整体的面试氛围比较轻松,首先也都是介绍一下简历里的项目和实习,然后就是就是面试官对简历的项目进行提问,由于自己做的项目都是偏基础软件的项目,感觉面试官也并不是很懂,唯一相关的就是正在进行的实习,是做LLM推理Infra的经历,然后就是正常询问,问问做了哪些工作,有什么收益,感觉更像是我自己在说,他们也并没有深问,而且虽然投递的是大模型算法的岗位,但是实际上并没有拷打算法八股,反而是问了几个cpp和OS的八股,都比较基础,时间有点久也不太记得了。然后手撕只能算撕半个题,就是最经典的DP爬楼梯问题,让我把状态转移方程写出来就可以,不需要我写完整的代码哈哈哈哈,然后一面就比较轻松的结束了二面:二面当时去车站接女朋友了,然后出租车堵在路上了,无奈就没用电脑面试,用手机面了全程,最后手机还没什么电了,借了出租车师傅的充电器才完成的面试。二面就是综合面试了,感觉是轻技术重性格的一轮面试,问了很多开放性的看法问题,对xxx是什么看法,如果遇到xxx你会怎么想等等这类的问题,然后就是问了问在校期间最难忘的事情是什么,我说是本科打竞赛的时光,很充实,和队友一起碰撞思想很有意思,然后面试官就顺着这个问题继续问,问我如果队友没有完成他应做的工作会怎么做什么的,我就如实回答说我的两个队友都非常积极,我们都是遇到问题一起解决,谁遇到卡点了,其他人都会帮着一起看等等这样的问题。最后就是问了问我有没有女朋友,女朋友是做什么工作的,在哪里上班啊这样的问题,然后和这个部门的base地(上海)也都比较近,所以没有像腾讯那样不太好回答三面:三面相对来说是技术含量最高的一轮面试,这一次就是会拷打一些大模型相关的知识,让我觉得这才是正常的算法岗吧哈哈哈哈三面一开始也是一样介绍简历里的项目,并且进行深入的提问,对于实习经历重点问了问,因为比较相关,然后这边的部门感觉主要的业务是做AI Coding工具的部门,问了我很多Agent和RAG的一些知识,我说Agent没有做过相关的项目,但是大概了解过一些基础的框架如:LangChain等等,然后又问我对RAG技术是什么看法,这个问题我的回答有点狂了我说我不太看好RAG技术,感觉这是一个混淆概念对技术,面试官问我原因,我说与其把精力放在做RAG上,不如提升模型等Long Context能力,但是后面回想了一下,这两个工作的方面其实也不一样,一个是提升使用LLM的能力,一个是提升LLM自身的能力,当时不知道怎么回事就脑子一热了,面试官也没有拷打我,就说即便RAG技术不以现在的形式存在,也可能以另外一种方式存在,然后我就顺着他的话说是的是的,我刚才的表述不太准确然后就是简单的业务咨询和反问环节了,面完三面之后已经过了很久了,中间让我提交了一次附件材料,让我把获奖证书,奖学金证书什么的上传一下,说要进行评估,然后到现在也没啥消息,不过倒是不是很慌,三面的面试官就是推我进来的人,我俩有联系方式,我经常骚扰他问他进度,他给我的回复也都是还在蓝剑流程,所以也没有很慌哈哈哈哈,就看后续还有啥流程吧
查看12道真题和解析
点赞 评论 收藏
分享
09-30 16:05
已编辑
门头沟学院 Java
30min 自我介绍1. 有什么需求或理由使得你选择netty?2. 对于这样IM的实现基于netty自己做了什么?过程中遇到什么问题怎么解决的?3. 你说创建的这个对象引用了没法回收,可以具体讲讲吗?你这样说应该是特意了解了,这个对象的生命周期,在tcp(没听清)中如何回收的?4. 除了netty知道什么方法实现IM吗?5. 讲讲这个langchain4j,为什么不用langchain,以及基于langchain4j做了什么,基于怎样的需求6. 你提到向量化,有对分词做什么优化吗?7. 第二个项目,你觉得有必要用微服务吗?8. 讲讲你对微服务和DDD的看法9. 为什么要使用nacos?(我对比了Eureka说nacos保证强一致性...)10. 对于它的高可用,可以具体说说嘛?我举个例子,它有二三十个服务,在这个区,如果这些服务宕机了,那等它们恢复过来时,nacos如何保证这些服务可以正常使用的?(这里我是听都听不懂)11. 讲讲乐观锁和悲观锁12. 它们各自的区别和使用场景?比如多进/线程写一个文件应该用哪个,具体流程会怎样?13. mysql事务讲一下14. 知道他们的使用场景吗?比如可重复读通常什么时候用15. 你在做项目的过程中有遇到什么问题吗?怎么解决的?(讲了langchain4j调milvus有个方法官方文档没提到)16. 遇到官方文档没有相应解决办法时怎么做的?17. 有没有想过去改它的源码呢?18. 有了解过docker网络的几种模式吗?19. 有用docker部署过梯子吗?20. 项目有上线吗?21. 团队开发的流程怎么样?反问:后续--这两天有结果,可能还有一面业务--不透露建议--多了解应用层、应用场景之类的,看看博客文章,这个阶段不用过于注重底层。很好的面试,让我的八股无用武之处9.28 oc,国庆后入职,觉得能学到东西
查看22道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务