当前位置: 首页 > article >正文

AI agent与lang chain的学习笔记 (1)

文章目录

  • 智能体的4大要素
  • 一些上手的例子与思考。
    • 创建简单的AI agent.
    • 从本地读取文件,然后让AI智能体总结。
  • 也可以自己定义一些工具 来完成一些特定的任务。
  • 我们可以使用智能体总结一个视频。用户可以随意问关于视频的问题。

智能体的4大要素

AI 智能体有以下几个重要的要素:
1 规划: AI agent 需要拥有规划和决策能力,规划能力通常包括 目标分解,思维链(连续的进行思考), 自我的反思,以及对过去的反思。
2. 记忆: 包含长期记忆和短期记忆
3. 能使用工具:使用外部的工具来辅助完成更加复杂的任务。可以理解成是扩大了智能体的知识范围,因为训练好的大模型的知识是固定的,相对难以直接扩展。
4. 执行:通过以上提到来执行任务。

一些上手的例子与思考。

创建简单的AI agent.

使用lang chain创建一个AI 智能体是相对简单的。只需要调用一些开放接口就可以了。一般是使用OpenAI 的接口相对方便一点,但是因为所有的OpenAI 接口都要收费,所以这里我是用的是google的gemini.
一个基础的智能体,应该有向外获取信息的能力。 所以出了将大模型作为智能体的大脑外,还需要定义一些基础的工具让他使用。我使用奴serpapi的作为智能体的搜索工具,这个工具可以免费使用100次/月。 首先是获取大模型gemini,和serpapi的接口的密钥,并将它写入本地的.env文件中。之后只用dotenv.load进行读取就好,这样做的好处是直接将密钥显式的写入代码中。 然后就可以直接构建一个llm

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain_google_genai  import ChatGoogleGenerativeAI
#创建一个gemini-1.5模型
llm  = ChatGoogleGenerativeAI(model='gemini-1.5-flash-001')

这就可以让我们直接使用gemini了,如果想要直接使用的话可以:

result = llm.invoke("从文化的角度评价一下印度")

以下是只用大模型的输出结果。从一些固定的角度去评价印度。
在这里插入图片描述但是我们要创建智能体,需要大脑(大模型)还有工具联系到一起,并且定义智能体的推理框架,

#定义工具
tools = load_tools(['serpapi'])
#初始化智能体
agent = initialize_agent(tools,llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

推理框架(AgentType)选择ReACT, 他是一种知道大模型推理和行动的认知框架。基本上就是有三个主要步骤,思考,行动,观察。比如我们用这个最简单的智能体去从文化角度评价一下印度,它的输出会比只用大模型更加的全面。
在这里插入图片描述

从本地读取文件,然后让AI智能体总结。

这个案例主要是讲解如何使用 智能体做一个总结工具。在langchain 框架中,有很多不同的现成的chain工具。 可以把每一个chain理解成是一个任务。我们可以直接使用summarize_chain来完成本地文档的总结。但是需要注意的点有两个。 首先如果文档过长可能会超过大模型的token_size限制。所以一般将很长的文档打散成多个chunk,然后根据不同的chain_type进行总结。

from langchain.document_loaders import UnstructuredFileLoader
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import  RecursiveCharacterTextSplitter
from langchain import OpenAI
from langchain_google_genai  import ChatGoogleGenerativeAI
import osclass LoadFiles():def __init__(self,path):self.path = pathself.loader = UnstructuredFileLoader(self.path)self.splitter  = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=2)self.llm = ChatGoogleGenerativeAI(model='gemini-1.5-flash-001')def get_documents(self):return self.loader.load()def spilit_files(self):documents = self.get_documents()print('split_text:{}'.format(len(self.splitter.split_documents(documents))))return self.splitter.split_documents(documents)def __call__(self, *args, **kwargs):chain = load_summarize_chain(self.llm,chain_type='refine',verbose=True)chain.run(self.spilit_files()[:5])if __name__ == '__main__':load_dotenv()path = '3D-decoupling.pdf'summerzier = LoadFiles(path)summerzier()

需要记录的点是 RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=2)的overlap参数是指每个chunk的重叠程度。当chunk=0时说明每个chunk之间是没有重叠的。重叠chunk在一定程度上可以增加chunk之间的关联性。还有就是 在创建load_summarize_chain中的chain_type有多种种类,代码中的refine 就是深度学习中的残差概念,将第n个文本块总结出来的内容和第n+1个文本块同时输入到大模型中经行总结。
除此之外,stuff 就是将所有的文件一次性塞入模型,map_reduce是先将每一个chunk先做一个初步的总结,然后将所有的总结内容再总结一次。 map_rerank是将总结的文件做一个置信度排名。 比较适合从多个文档中找到最相关的答案。

也可以自己定义一些工具 来完成一些特定的任务。

这个相对比较的简单,只需要使用tool类,来定义工具,然后将它在初始化agent的时候当作参数传入就行了。我们只需要先定义好工具的示例然后当作Tool类的参数传入即可。

    def tools(self):tool = [Tool(name  = 'searcher',func= self.searcher.run,description= 'searcher',),Tool(name= 'calculator',func= self.calculator.run,description= 'calculator',)]return tool

然后初始化智能体即可。

    def ini_agent(self):self.agent = initialize_agent(tools=self.tools,llm=self.llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True)def __call__(self, *args, **kwargs):self.ini_agent()self.agent.run(kwargs['message'])

我们可以使用智能体总结一个视频。用户可以随意问关于视频的问题。

首先因为我们需要连续的问智能体关于视频的问题。 我们希望智能体能以一种相对固定的格式返回答案,所以我们先需要设定一个回答的模板。

   def meg_template(self):system_template = """Use the following context to answer the user's question.If you don't know the answer, say you don't, don't try to make it up. And answer in Chinese.-----------{question}-----------{chat_history}"""messages = [SystemMessagePromptTemplate.from_template(system_template),HumanMessagePromptTemplate.from_template('{question}')]prompt = ChatPromptTemplate.from_messages(messages)return prompt

接下来,我们需要获取视频的内容,并将它存到一个数据库中,来确保访问。 首先需要先读取一个视频,这里使用油管上的一个随便的视频,这里使用一个youtubeLoader.

self.loader = YoutubeLoader.from_youtube_url(video_url)

获取到视频内容之后,我们需要将这些内容进行向量化,然后存入 Chroma中。 这里有一点需要注意,因为我们需要用到OpenAI的Embedding,但是这个也是需要收费的。所以我用了sentence_transformer来输出embedding. 只需要做一个简单的包装重写 embed_queryembed_documents两个类函数即可.

class My_embedding():def __init__(self):self.model =  SentenceTransformer('all-MiniLM-L6-v2')def  embed_query(self,documents):texts = [doc for doc in documents]return self.model.encode(texts, show_progress_bar=False)[0]def embed_documents(self,documents):texts = [doc for doc in documents]return self.model.encode(texts, show_progress_bar=False).tolist()

之后, 我们将数据存入数据库中:

    self.vector_store = Chroma.from_documents(self.data_spilt(),self.embedding_model)self.retriever = self.vector_store.as_retriever()

然后我们使用RetrievalChain去构建这个智能体.

 def __call__(self, *args, **kwargs):self.data_spilt()self.store_and_retrive()prompt = self.meg_template()qa = ConversationalRetrievalChain.from_llm(self.llm, self.retriever,condense_question_prompt=prompt)chat_history = []while True:question = input('问题:')# 开始发送问题 chat_history 为必须参数,用于存储对话历史result = qa({'question': question, 'chat_history': chat_history})chat_history.append((question, result['answer']))print(result['answer'])

相关文章:

AI agent与lang chain的学习笔记 (1)

文章目录 智能体的4大要素一些上手的例子与思考。创建简单的AI agent.从本地读取文件,然后让AI智能体总结。 也可以自己定义一些工具 来完成一些特定的任务。我们可以使用智能体总结一个视频。用户可以随意问关于视频的问题。 智能体的4大要素 AI 智能体有以下几个…...

优化 Spring Boot 应用启动性能的实践指南

1. 引言 Spring Boot 以其“开箱即用”的特性深受开发者喜爱,但随着项目复杂度的增加,应用的启动时间也可能会变得较长。对于云原生、Serverless 等场景而言,快速启动是一个非常关键的指标。 2. 分析启动过程 2.1 启动阶段概述 Spring Boot 的启动流程主要包括以下几个阶…...

谢赛宁团队提出 BLIP3-o:融合自回归与扩散模型的统一多模态架构,开创CLIP特征驱动的图像理解与生成新范式

BLIP3-o 是一个统一的多模态模型,它将自回归模型的推理和指令遵循优势与扩散模型的生成能力相结合。与之前扩散 VAE 特征或原始像素的研究不同,BLIP3-o 扩散了语义丰富的CLIP 图像特征,从而为图像理解和生成构建了强大而高效的架构。 此外还…...

【idea】调试篇 idea调试技巧合集

前言:之前博主写过一篇idea技巧合集的文章,由于技巧过于多了,文章很庞大,所以特地将调试相关的技巧单独成章, 调试和我们日常开发是息息相关的,用好调试可以事半功倍 文章目录 1. idea调试异步线程2. idea调试stream流…...

二叉树深搜:在算法森林中寻找路径

专栏:算法的魔法世界 个人主页:手握风云 目录 一、搜索算法 二、回溯算法 三、例题讲解 3.1. 计算布尔二叉树的值 3.2. 求根节点到叶节点数字之和 3.3. 二叉树剪枝 3.4. 验证二叉搜索树 3.5. 二叉搜索树中第 K 小的元素 3.6. 二叉树的所有路径 …...

golang 安装gin包、创建路由基本总结

文章目录 一、安装gin包和热加载包二、路由简单场景总结 一、安装gin包和热加载包 首先终端新建一个main.go然后go mod init ‘项目名称’执行以下命令 安装gin包 go get -u github.com/gin-gonic/gin终端安装热加载包 go get github.com/pilu/fresh终端输入fresh 运行 &…...

BMVC2023 | 多样化高层特征以提升对抗迁移性

Diversifying the High-level Features for better Adversarial Transferability 摘要-Abstract引言-Introduction相关工作-Related Work方法-Methodology实验-Experiments结论-Conclusion 论文链接 GitHub链接 本文 “Diversifying the High-level Features for better Adve…...

有哪些GIF图片转换的开源工具

以下是关于GIF图片转换的开源工具的详细总结,涵盖功能特点、适用场景及用户评价: 1. FFmpeg 功能特点: 作为开源命令行工具,FFmpeg支持视频转GIF、调整帧率、分辨率、截取片段等操作,可通过脚本批量处理。适用场景: 适合开发者或技术用户进行高效批处理,常用于服务器端自…...

C++—特殊类设计设计模式

目录 C—特殊类设计&设计模式1.设计模式2.特殊类设计2.1设计一个无法被拷贝的类2.2设计一个只能在堆上创建对象的类2.3设计一个只能在栈上创建对象的类2.4设计一个类,无法被继承2.5设计一个类。这个类只能创建一个对象【单例模式】2.5.1懒汉模式实现2.5.2饿汉模…...

Android 手写签名功能详解:从原理到实践

Android 手写签名功能详解 1. 引言2. 手写签名核心实现:SignatureView 类3. 交互层实现:MainActivity 类4. 布局与配置5. 性能优化与扩展方向 1. 引言 在电子政务、金融服务等移动应用场景中,手写签名功能已成为提升用户体验与业务合规性的关…...

Level2.8蛇与海龟(游戏)

#小龟快跑游戏 输入难度(1-5),蛇追到龟,游戏结束 #分析问题:从局部>整体 #游戏画面:创建画笔(海龟蛇)>1.海龟移动(键盘控制)>2.蛇(自动追踪,海龟位置)>3.海龟(限定范围,防止跑出画布之外)>4.游戏&…...

【Android构建系统】如何在Camera Hal的Android.bp中选择性引用某个模块

背景描述 本篇文章是一个Android.bp中选择性引用某个模块的实例。 如果是Android.mk编译时期,在编译阶段通过某个条件判断是不是引用某个模块A, 是比较好实现的。Android15使用Android.bp构建后,要想在Android.bp中通过自定义的一个变量或者条件实现选…...

【Canvas与诗词】醉里挑灯看剑 梦回吹角连营

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>醉里挑灯看剑梦回吹角连营 Draft1</title><style type"…...

Hue面试内容整理-Hue 架构与前后端通信

Cloudera Hue 是一个基于 Web 的 SQL 助手,旨在为数据分析师和工程师提供统一的界面,以便与 Hadoop 生态系统中的各个组件(如 Hive、Impala、HDFS 等)进行交互。其架构设计强调前后端的分离与高效通信,确保系统的可扩展性和可维护性。以下是 Hue 架构及其前后端通信机制的…...

Linux搜索

假如我们要搜索 struct sockaddr_in 我们在命令终端输入 cd/usr/include/ //进入头文件目录地址 /usr/include/ grep " struct sockaddr_in { " *-nir &#xff08;*是在当前目录&#xff0c;n 是找出来显示行数…...

Git基础原理和使用

Git 初识 一、版本管理痛点 在日常工作和学习中&#xff0c;我们经常遇到以下问题&#xff1a; - 通过不断复制文件来保存历史版本&#xff08;如报告-v1、报告-最终版等&#xff09; - 版本数量增多后无法清晰记住每个版本的修改内容 - 项目代码管理存在同样问题 二、版本控…...

实现视频分片上传 OSS

访问 OSS 有两种方式&#xff0c;本文用到的是使用临时访问凭证上传到 OSS&#xff0c;不同语言版本的代码参考&#xff1a; 使用STS临时访问凭证访问OSS_对象存储(OSS)-阿里云帮助中心 1.安装并使用 首先我们要安装 OSS&#xff1a; npm install ali-oss --save 接着我们…...

网络I/O学习(一)

一、什么是网络IO&#xff1f; 就是客户端和服务端之间的进行通信的通道(fd)。 二、网络IO通信步骤 1、建立套接字 int socketfd socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr; servaddr.sin_family AF_INET; servaddr.sin_addr.s_addr htonl(INADDR_A…...

4:OpenCV—保存图像

将图像和视频保存到文件 在许多现实世界的计算机视觉应用中&#xff0c;需要保留图像和视频以供将来参考。最常见的持久化方法是将图像或视频保存到文件中。因此&#xff0c;本教程准备解释如何使用 OpenCV C将图像和视频保存到文件中。 将图像保存到文件 可以学习如何保存从…...

Selenium-Java版(css表达式)

css表达式 前言 根据 tag名、id、class 选择元素 tag名 #id .class 选择子元素和后代元素 定义 语法 根据属性选择 验证CSS Selector 组选择 按次序选择子节点 父元素的第n个子节点 父元素的倒数第n个子节点 父元素的第几个某类型的子节点 父元素的…...

产品更新丨谷云科技 iPaaS 集成平台 V7.5 版本发布

五月&#xff0c;谷云科技 iPaaS 集成平台保持月度更新&#xff0c; V7.5 版本于近日正式发布。我们一起来看看新版本有哪些升级和优化。 核心新增功能&#xff1a;深化API治理&#xff0c;释放连接价值 API网关&#xff1a;全链路可控&#xff0c;精准管控业务状态 业务状态…...

深度学习让鱼与熊掌兼得

通常,一个大的复杂的模型的loss会低,但是拟合方面不够,小的模型在拟合方面更好,但是loss高,我们可以通过深度学习来得到一个有着低loss的小模型 我们之前学过,peacewise linear可以用常数加上一堆这个阶梯型函数得到,然后因为peacewise linear可以逼近任何function,所以理论上…...

TDuckX 2.6 正式发布|API 能力开放,核心表单逻辑重构,多项实用功能上线。

大家好&#xff0c;TDuckX 2.6 已正式发布。 本次更新以可集成性提升、数据处理能力增强和交互体验优化为核心&#xff0c;新增了包括 新增OpenAPI 模块、表单数据批量修改、字段导出分列 等多个面向开发者和实际业务落地场景的功能。 我们也重构了部分底层逻辑模块&#xff…...

LeetCode Hot100刷题——除自身以外数组的乘积

238. 除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&a…...

JAVA EE(进阶)_进阶的开端

别放弃浸透泪水的昨天&#xff0c;晨光已为明天掀开新篇 ——陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;JAVA EE_HTTP-CSDN博客 1.什么是Java EE Java EE&#xff08;Java Pla…...

PDF批量合并拆分+加水印转换 编辑 加密 OCR 识别

各位办公小能手们&#xff01;你们有没有遇到过被PDF文件折腾得晕头转向的时候呀&#xff1f;其实啊&#xff0c;有专门处理、编辑、管理和优化PDF文件的软件&#xff0c;那就是PDF工具。它功能老多了&#xff0c;有文档格式转换、内容编辑、页面管理、安全保护这些核心功能。下…...

Go语言交替打印问题及多种实现方法

Go语言交替打印问题及多种实现方法 在并发编程中&#xff0c;多个线程&#xff08;或 goroutine&#xff09;交替执行任务是一个经典问题。本文将以 Go 语言为例&#xff0c;介绍如何实现多个 goroutine 交替打印数字的功能&#xff0c;并展示几种不同的实现方法。 Go 语言相关…...

ArcGIS Pro调用多期历史影像

一、访问World Imagery Wayback&#xff0c;基本在我国范围 如下图&#xff1a; 二、 放大到您感兴趣的区域 三、 查看影像版本信息 点击第二步的按钮后&#xff0c;便可跳转至World Imagery (Wayback 2025-04-24)的相关信息。 四 、点击上图影像版本信息&#xff0c;页面跳转…...

10.11 LangGraph多角色Agent开发实战:生产级AI系统架构与性能优化全解析

LangGraph 项目:High-level API for Multi-actor Agents 关键词:LangGraph 多角色 Agent, 状态管理, 持久化机制, 工作流编排, 生产级 AI 系统 1. LangGraph 设计哲学与架构演进 LangGraph 是 LangChain 生态中首个面向 多角色协作 Agent 的高阶 API 框架,其核心设计思想可…...

组态王|组态王中如何添加西门子1200设备

哈喽,你好啊,我是雷工! 最近使用组态王采集设备数据,设备的控制器为西门子的1214CPU, 这里边实施边记录,以下为在组态王中添加西门子1200PLC的笔记。 1、新建 在组态王工程浏览器中选择【设备】→点击【新建】。 2、选择设备 和设备建立通讯要通过对应的设备驱动。 在…...