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.pswp.cn/web/80412.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80412.shtml
英文地址,請注明出處:http://en.pswp.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;截取子字符串 …