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'])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react+html2canvas+jspdf将页面导出pdf

主要使用html2canvasjspdf 1.将前端页面导出为pdf 2.处理导出后图表的截断问题 export default function AIReport() {const handleExport async () > {try {// 需要导出的内容idconst element document.querySelector(#AI-REPORT-CONTAINER);if (!element) {message.err…

FFmpeg:多媒体处理的终极利器

FFmpeg详细介绍 1. 定义与基本概述 FFmpeg是一套开源的跨平台多媒体处理工具集,最初由法国程序员Fabrice Bellard于2000年开发,其名称源自“Fast Forward MPEG”,体现了其高效处理MPEG格式的能力。它不仅是命令行工具,还包含多个库和开发套件,支持视频转码、剪辑、合并、…

【应用开发十】pwm

1 应用层操作PWM 与LED设备一样,操作PWD也是通过sysfs方式 1) 所在目录:/sys/class/pwm,该目录下的文件为pwmchipX,为PWM控器,I.MX6ULL有八个pwm控制器 1.1 pwm 控制器 PWM控制器里内容(即pw…

LeetCode算 法 实 战 - - - 双 指 针 与 移 除 元 素、快 慢 指 针 与 删 除 有 序 数 组 中 的 重 复 项

LeetCode算 法 实 战 - - - 双 指 针 与 移 除 元 素、快 慢 指 针 与 删 除 有 序 数 组 中 的 重 复 项 第 一 题 - - - 移 除 元 素方 法 一 - - - 双 重 循 环方 法 二 - - - 双 指 针方 法 三 - - - 相 向 双 指 针(面 对 面 移 动) 第 二 题 - - -…

设计模式系列(03):设计原则(二):DIP、ISP、LoD

本文为设计模式系列第3篇,聚焦依赖倒置、接口隔离、迪米特法则三大设计原则,系统梳理定义、实际业务场景、优缺点、最佳实践与常见误区,适合系统学习与团队协作。 目录 1. 引言2. 依赖倒置原则(DIP)3. 接口隔离原则(ISP)4. 迪米特法则(LoD)5. 常见误区与反例6. 最佳实…

计算机图形学中MVP变换的理论推导

计算机图形学中MVP变换的理论推导 课程地址:Computing the Pixel Coordinates of a 3D Point 知识铺垫:矩阵的真实内涵 矩阵的每一列/行(左乘和右乘的区别)代表了新坐标系的基向量在原基向量构成的坐标系中的坐标,这…

先说爱的人为什么先离开

2025年5月19日,15~23℃,贼好的一天,无事发生 待办: 2024年税务申报 《高等数学2》取消考试资格学生名单 《物理[2]》取消考试资格名单 5月24日、25日监考报名 《高等数学2》备课 《物理[2]》备课 职称申报材料 教学技能大赛PPT 遇…

面试中的线程题

原文链接:线程题大全 Java 并发库同步辅助类 CountDownLatch 工作机制:初始化一个计数器,此计数器的值表示需要等待的事件数量。 提供了两个主要方法: await():当一个线程调用此方法时,它将阻塞&#…

Linux梦开始的地方

1.概率 经过C语言,数据结构,C的学习我们现在要开始学习Linux的学习了。我们学习Linux是从四部分来进行的: 1.Linux初识,Linux环境,Linux指令,Linux开发环境。 2.Linux系统。 3.Linux网络 4.MySQL Lin…

“二维前缀和”算法原理及模板

在学习本篇内容前建议先学习一下“一维前缀和” 一维前缀和 算法https://blog.csdn.net/czt230610/article/details/148012923?fromshareblogdetail&sharetypeblogdetail&sharerId148012923&sharereferPC&sharesourceczt230610&sharefromfrom_link接下来…

软件设计师CISC与RISC考点分析——求三连

一、考点分值占比与趋势分析(CISC与RISC) 综合知识分值统计表 年份考题数量分值分值占比考察重点2018111.33%指令特征对比2019111.33%控制器实现方式2020222.67%寄存器数量/流水线技术2021111.33%寻址方式对比2022222.67%指令复杂度/译码方式2023111.3…

顺 序 表:数 据 存 储 的 “ 有 序 阵 地 ”

顺 序 表:数 据 存 储 的 “ 有 序 阵 地 ” 线 性 表顺 序 表 - - - 顺 序 存 储 结 构顺 序 表 的 操 作 实 现代 码 全 貌 与 功 能 介 绍顺 序 表 的 功 能 说 明代 码 效 果 展 示代 码 详 解SeqList.hSeqList.ctest.c 总 结 💻作 者 简 介&#xf…

网络安全深度解析:21种常见网站漏洞及防御指南

一、高危漏洞TOP 10 1. SQL注入(SQLi) 原理:通过构造恶意SQL语句突破系统过滤机制 典型场景: - 联合查询注入: union select 1,version(),3--+ - 布尔盲注:and (select substr(user(),1,1)=r) - 时间盲注:;if(now()=sysdate(),sleep(5),0)/ 防御方案: - 严格参数化查…

代码上传gitte仓库

把代码push上去就行

创建型:单例模式

目录 1、核心思想 2、实现方式 2.1 饿汉式 2.2 懒汉式 2.3 枚举(Enum) 3、关键注意事项 3.1 线程安全 3.2 反射攻击 3.3 序列化与反序列化 3.4 克隆保护 4、适用场景 1、核心思想 目的:确保一个类仅有一个实例 功能:…

副业小程序YUERGS,从开发到变现

文章目录 我为什么写这个小程序网站转小程序有什么坑有什么推广渠道个人开发者如何变现简单介绍YUERGS小程序给独立开发者一点小建议 我为什么写这个小程序 关注我的粉丝应该知道,我在硕士阶段就已经掌握了小程序开发技能,并写了一个名为“约球online”…

React路由(React学习笔记_09)

React路由 1,路由基础 现代的前端应用大多都是SPA(单页应用程序),也就是只有一个HTML页面的应用程序。因为它的用户体验更好、对服务器的压力更小,所以更受欢迎。为了有效的使用单个页面来管理原来多个页面的功能,前端路由应运而生。 1, 安装…

2009-2025计算机408统考真题及解析

整理2009-2025 年计算机408统考真题及解析PDF 目录树: └── 2025考研计算机408统考真题及答案(回忆版).pdf ├── 2009-2024计算机408真题解析 │ ├── 2009年计算机408统考真题解析.pdf │ ├── 2010年计算机408统考真题解析.pdf …

Mysql、Oracle、Sql Server、达梦之间sql的差异

1&#xff1a;分页查询 Sql Server&#xff1a; <bind name"startRow" value"(page - 1) * limit 1"/> <bind name"endRow" value"page * limit"/> SELECT *FROM (SELECT ROW_NUMBER() OVER (<if test"sortZd!…

SQL Server 常用函数

一、字符串处理函数 1. CONCAT&#xff1a;拼接字符串 语法&#xff1a;CONCAT(string1, string2, ..., stringN) 实例&#xff1a; SELECT CONCAT(Hello, , World) AS Result; 输出&#xff1a; Result ------------- Hello World 2. SUBSTRING&#xff1a;截取子字符串 …