大模型Agent

手撕 Agent

1、功能描述

在這里插入圖片描述

設計一個 Agent,自動選擇使用以下工具回答用戶的問題:

  • 查看目錄下的文件
  • 基于給定的文檔回答用戶問題
  • 查看與分析 Excel 文件
  • 撰寫文檔
  • 調用 Email 客戶端發郵件

2、演示用例

實驗中使用三個文檔演示 Agent 的能力

./data|__2023年8月-9月銷售記錄.xlsx|__供應商名錄.xlsx|__供應商資格要求.pdf

文檔內容示例
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
測試輸入舉例

  • 9 月份的銷售額是多少
  • 銷售總額最大的產品是什么
  • 幫我找最近一個月出銷售額不達標的供應商
  • 給對方發一封郵通知此事
  • 對比 8 月和 9 月銷售情況,寫一份報告

3、核心模塊流程圖

在這里插入圖片描述

4、「這」算不算 Agent?

吳恩達:“與其爭論哪些工作才算是真正的 Agent,不如承認系統可以具有不同程度的 Agentic 特性。”

核心在于將復雜任務分解成多個步驟,并通過循環迭代的方式逐步優化結果。這種工作方式更接近于人類解決問題的思維模式:

  • 目標設定: 明確任務目標;
  • 規劃分解: 將任務分解成多個子任務;
  • 迭代執行: 依次執行每個子任務,并根據反饋結果進行調整和優化,最終完成目標。

在這里插入圖片描述

5、Agent Prompt 編寫經驗總結

在這里插入圖片描述

  1. 善用思維鏈技巧
  2. 在重要的環節設置反思與糾偏機制
  3. 約定思維鏈中需要包含的要素,盡量詳細具體
  4. 不可能一遍成功,要學會通過測試的失敗例子優化提示詞的細節
  5. 要善于將問題總結成方法論型的提示詞(把 AI 當人看)
  6. 要善于綜合使用各種提示詞技巧,例如:舉例子、PoT、AoT 等等

代碼實現

先寫prompts模塊

有兩塊一個是agent的prompt還有一個工具的prompt
在這里插入圖片描述

  • 智能體prompt
你是強大的AI助手,可以使用工具與指令自動化解決問題。你的任務是:
{input}
如果此任務表達“沒有了”、“已完成”或類似意思,你直接輸出下述工具中的FINISH即可。你需要的所有文件資料都在以下目錄:
dir_path={work_dir}
訪問文件時請確保文件路徑完整。你可以使用以下工具或指令,它們又稱為動作或actions:
{tools}你必須遵循以下約束來完成任務。
1. 每次你的決策只使用一種工具,你可以使用任意多次。
2. 確保你調用的指令或使用的工具在給定的工具列表中, {tool_names}。
3. 確保你的回答不會包含違法或有侵犯性的信息。
4. 如果你已經完成所有任務,確保以"FINISH"指令結束。
5. 用中文思考和輸出。
6. 如果執行某個指令或工具失敗,嘗試改變參數或參數格式再次調用。
7. 已經得到的信息,不要反復查詢。
8. 生成一個自然語言查詢時,請在查詢中包含全部的已知信息。
9. 不要向用戶提問。當前的任務執行記錄:
<history>
{agent_scratchpad}
</history>輸出形式:
(1) 首先,根據以下格式說明,輸出你的思考過程:
**關鍵概念**: 任務中涉及的組合型概念或實體。已經明確獲得取值的關鍵概念,將其取值完整備注在概念后。
**概念拆解**: 將任務中的關鍵概念拆解為一系列待查詢的子要素。每個關鍵概念一行,后接這個概念的子要素,每個子要素一行,行前以' -'開始。已經明確獲得取值的子概念,將其取值完整備注在子概念后。
**反思**: 自我反思,觀察以前的執行記錄,一步步思考以下問題:A. 是否每一個的關鍵概念或要素的查詢都得到了準確的結果?B. 我已經得到哪個要素/概念? 得到的要素/概念取值是否正確?C. 從當前的信息中還不能得到哪些要素/概念。
**思考**: 觀察執行記錄和你的自我反思,并一步步思考下述問題:A. 分析要素間的依賴關系,請將待查詢的子要素帶入'X'和'Y'進行以下思考:- 我需要獲得要素X和Y的值- 是否需要先獲得X的值/定義,才能通過X來獲得Y?- 如果先獲得X,是否可以通過X篩選Y,減少窮舉每個Y的代價?- X和Y是否存在在同一數據源中,能否在獲取X的同時獲取Y?- 是否還有更高效或更聰明的辦法來查詢一個概念或要素?- 上一次嘗試查詢一個概念或要素時是否失敗了? 如果是,是否可以嘗試從另一個資源中再次查詢?- 反思,我是否有更合理的方法來查詢一個概念或要素?B. 根據以上分析,排列子要素間的查詢優先級C. 找出當前需要獲得取值的子要素D. 不可以使用“假設”:不要對要素的取值/定義做任何假設,確保你的信息全部來自明確的數據源!
**推理**: 根據你的反思與思考,一步步推理被選擇的子要素取值的獲取方式。如果前一次的計劃失敗了,請檢查輸入中是否包含每個概念/要素的明確定義,并嘗試細化你的查詢描述。
**計劃**: 詳細列出當前動作的執行計劃。只計劃一步的動作。PLAN ONE STEP ONLY!
**計劃校驗**: 按照一些步驟一步步分析A. 有哪些已知常量可以直接代入此次分析。B. 當前計劃是否涉及窮舉一個文件中的每條記錄?- 如果是,請給出一個更有效的方法,比如按某條件篩選,從而減少計算量;- 否則,請繼續下一步。C. 上述分析是否依賴某個要素的取值/定義,且該要素的取值/定義尚未獲得?如果是,重新規劃當前動作,確保所有依賴的要素的取值/定義都已經獲得。D. 當前計劃是否對要素的取值/定義做任何假設?如果是,請重新規劃當前動作,確保你的信息全部來自對給定的數據源的歷史分析,或嘗試重新從給定數據源中獲取相關信息。E. 如果全部子任務已完成,請用FINISH動作結束任務。
**計劃改進**:A. 如何計劃校驗中的某一步驟無法通過,請改進你的計劃;B. 如果你的計劃校驗全部通過,按(2)輸出你的計劃;C. 如果全部子任務已完成,請用FINISH動作結束任務。(2) 最后,輸出你選擇執行的動作/工具
{format_instructions}請確保每次選擇動作/工具前你都先以文字輸出了你的思考分析過程。
請確保你的動作/工具選擇(JSON)出現在輸出的最后一部分。
請確保你輸出的JSON代碼塊以```json\n\n```包裹。

從上面可以看出寫一個提示詞可以包含

  1. 輸入任務
  2. 參考資料目錄
  3. 可以用工具
  4. 遵循約束
  5. 任務執行記錄
  6. 輸出形式
    (1)關鍵概念
    (2)概念拆解
    (3)反思
    (4)思考
    (5)推理
    (6)計劃
    (7)計劃校驗
    (8)計劃改進
    (9)…
  • 工具prompt
你的任務是先分析,再生成代碼請根據用戶的輸入,一步步分析:
(1)用戶的輸入是否依賴某個條件,而這個條件沒有明確賦值?
(2)我是否需要對某個變量的值做假設?如果我需要對某個變量的值做假設,請直接輸出:
```python
print("我需要知道____的值,才能生成代碼。請完善你的查詢。") # 請將____替換為需要假設的的條件
^```否則,生成一段Python代碼,分析指定文件的內容。你可以使用的庫只包括:Pandas, re, math, datetime, openpyxl
確保你的代碼只使用上述庫,否則你的代碼將無法運行。給定文件為:
{filename}文件內容樣例:
{inspections}你輸出的Python代碼前后必須有markdown標識符,如下所示:
```python
# example code
print('hello world')
^```確保你的代碼是可以運行的,文件名直接寫死在代碼里即可。
你生成代碼中所有的常量都必須來自我給你的信息或來自文件本身。不要編造任何常量。
如果常量缺失,你的代碼將無法運行。你可以拒絕生成代碼,但是不要生成編造的代碼。
確保你生成的代碼最終以print的方式輸出結果(回答用戶的問題)。用戶輸入:
{query}
編寫agent

在這里插入圖片描述

  1. 編寫大模型輸出Action格式
from pydantic import BaseModel, Field
from typing import Optional, Dict, Anyclass Action(BaseModel):name: str = Field(description="Tool name")args: Optional[Dict[str, Any]] = Field(description="Tool input arguments, containing arguments names and values")def __str__(self):ret = f"Action(name={self.name}"if self.args:for k, v in self.args.items():ret += f", {k}={v}"ret += ")"return ret
  1. 智能體主流程
import re
from typing import List, Tuplefrom langchain_community.chat_message_histories.in_memory import ChatMessageHistory
from langchain_core.language_models.chat_models import BaseChatModel
from langchain.output_parsers import PydanticOutputParser, OutputFixingParser
from langchain.schema.output_parser import StrOutputParser
from langchain.tools.base import BaseTool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.tools import  render_text_description
from pydantic import ValidationError
from langchain_core.prompts import HumanMessagePromptTemplatefrom autogpt.Agent.Action import Action
from autogpt.Utils.CallbackHandlers import *
from autogpt.Utils.PrintUtils import THOUGHT_COLORclass ReActAgent:"""AutoGPT:基于Langchain實現"""@staticmethoddef __format_thought_observation(thought: str, action: Action, observation: str) -> str:# 將全部JSON代碼塊替換為空ret = re.sub(r'```json(.*?)```', '', thought, flags=re.DOTALL)ret += "\n" + str(action) + "\n返回結果:\n" + observationreturn ret@staticmethoddef __extract_json_action(text: str) -> str | None:# 匹配最后出現的JSON代碼塊json_pattern = re.compile(r'```json(.*?)```', re.DOTALL)matches = json_pattern.findall(text)if matches:last_json_str = matches[-1]return last_json_strreturn Nonedef __init__(self,llm: BaseChatModel,tools: List[BaseTool],work_dir: str,main_prompt_file: str,max_thought_steps: Optional[int] = 10,):self.llm = llmself.tools = toolsself.work_dir = work_dirself.max_thought_steps = max_thought_steps# OutputFixingParser: 如果輸出格式不正確,嘗試修復self.output_parser = PydanticOutputParser(pydantic_object=Action)self.robust_parser = OutputFixingParser.from_llm(parser=self.output_parser,llm=llm)self.main_prompt_file = main_prompt_fileself.__init_prompt_templates()self.__init_chains()self.verbose_handler = ColoredPrintHandler(color=THOUGHT_COLOR)def __init_prompt_templates(self):with open(self.main_prompt_file, 'r', encoding='utf-8') as f:self.prompt = ChatPromptTemplate.from_messages([MessagesPlaceholder(variable_name="chat_history"),HumanMessagePromptTemplate.from_template(f.read()),]).partial(work_dir=self.work_dir,tools=render_text_description(self.tools),tool_names=','.join([tool.name for tool in self.tools]),format_instructions=self.output_parser.get_format_instructions(),)def __init_chains(self):# 主流程的chainself.main_chain = (self.prompt | self.llm | StrOutputParser())def __find_tool(self, tool_name: str) -> Optional[BaseTool]:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907020.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907020.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907020.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

超臨界機組協調控制系統建模項目開發筆記

超臨界機組協調控制系統建模項目開發筆記 項目概述 本項目基于兩篇論文的方法&#xff0c;對超臨界機組協調控制系統進行數據驅動建模。主要使用LSTMTransformer混合架構&#xff0c;實現對主蒸汽壓力(Pst)、分離器蒸汽焓值(hm)和機組負荷(Ne)的預測。同時&#xff0c;通過消…

mysql安全管理

數據庫管理系統用于管理數據庫服務器的各種數據庫資源&#xff0c;MYSQL是一個支持多用戶的數據庫管理系統&#xff0c;實現多用戶下&#xff0c;各種數據庫資源的安全訪問控制&#xff0c;確保數據庫資源安全訪問成為了數據庫管理系統的核心功能。MYSQL安全管理是指允許合法賬…

QT中常用的類

Qt 是一個功能強大的跨平臺框架&#xff0c;提供了豐富的類庫來開發 GUI 和應用程序。以下是 ??Qt 中常用的核心類??&#xff0c;按模塊分類整理&#xff1a; ??1. GUI 和窗口管理?? 類名用途示例場景??QWidget??所有 GUI 控件的基類&#xff08;按鈕、窗口等&…

【Redis原理篇】五大基本數據類型的底層編碼方式

上文&#xff1a;redis底層數據結構 String底層結構 一、編碼方式 1.int編碼 **適用范圍&#xff1a;**64位整數&#xff08;long&#xff09; **實現&#xff1a;**直接將數據存儲在redisObject的ptr指針位置。 內存布局&#xff1a; 2.embstr編碼 **適用條件&#xf…

自動編碼器 潛在空間 Autoencoders 視頻截圖

【雙語】Autoencoders_嗶哩嗶哩_bilibili 【雙語】Autoencoders_嗶哩嗶哩_bilibili

ZLG USBCANFD python UDS刷寫腳本

文章目錄 概述python UDS 刷寫腳本UI交互界面概述 在實際工作中,有使用周立功的UDSCANFD設備,用來收發CAN數據和UDS on CAN的診斷測試或者UDS on CAN的ECU升級。上位機使用ZCANPro,軟件自帶ECU刷新界面,可以編輯UDS服務,加載升級文件等,能用是能用,但是仍不能滿足一些特…

線程安全問題的成因

前言 大家晚上好呀~~ 今天學習了線程不安全問題的成因。線程安全問題是十分重要的知識點&#xff0c;我想把我所學的與大家分享一波&#xff0c;希望可以幫助到有需要的人&#xff0c;同時加深自己對于線程安全問題的理解。 分析過程如下 結語 今天心情還不錯~ 要堅持持續…

C++可變參數宏定義語法筆記

1. 基礎語法 定義格式&#xff1a; #define MACRO_NAME(fixed_args, ...) macro_body#define LOG(fmt, ...) printf(fmt, __VA_ARGS__) LOG("Value: %d, Name: %s", 42, "Alice"); // 展開為 printf("Value: %d, Name: %s", 42, "Alice&q…

mongodb安裝啟動

這里寫自定義目錄標題 安裝包下載安裝后文件目錄列表bin目錄下 mongod 可以對mongodb 進行啟動等操作 環境變量配置創建數據目錄&#xff0c;日志目錄啟動參數配置啟動 mongodbweb頁面訪問&#xff0c;檢查服務啟動是否正常可視化工具連接mongodb創建 database創建collection查…

Leetcode 3562. Maximum Profit from Trading Stocks with Discounts

Leetcode 3562. Maximum Profit from Trading Stocks with Discounts 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3562. Maximum Profit from Trading Stocks with Discounts 1. 解題思路 這一題沒有搞定&#xff0c;思路上整體走偏了&#xff0c;看了一下別人的解答&…

【Redis】第2節|Redis基本數據類型

一、基礎數據結構 1. String&#xff08;字符串&#xff09; 特點&#xff1a;二進制安全&#xff0c;支持字符串、數值存儲&#xff0c;原子性操作。核心操作&#xff1a; SET key value # 存儲鍵值對 GET key # 獲取值 INCR key # 數值…

用matlab提取abaqus odb文件中的節點信息

在MATLAB中提取Abaqus ODB文件中的節點信息&#xff0c;可以通過以下幾種方法實現&#xff1a; 方法1&#xff1a;使用MATLAB的ABAQUS Interface工具箱 https://wenku.csdn.net/answer/77axwtqnys 可以參考這個 MATLAB的ABAQUS Interface工具箱提供了直接讀取ODB文件的功能。…

【Java】異常處理

1.異常的概念 在程序運行時&#xff0c;打斷正常程序流程的不正常情況分兩類: 1.錯誤(Error)&#xff1a;應用程序無法捕獲的嚴重問題(自己無法處理) 例&#xff1a; 虛擬機相關的問題&#xff0c;如虛擬機崩潰、動態鏈接失敗、低層資源錯誤等 總是不受編譯器檢查的&#xff0…

Linux(Centos 7.6)命令詳解:tar

1.命令作用 命令tar將許多文件一起保存到單個磁帶或磁盤存檔中&#xff0c;并且可以從存檔中恢復單個文件(GNU tar saves many files together into a single tape or disk archive, and can restore individual files from the archive.)。 2.命令語法 Usage: tar [OPTION.…

企業網絡綜合實訓

企業網絡綜合實訓 任務描述&#xff1a; 公司的中心機房、辦公區一和辦公區二位于同一園區。要求各大樓之間要互通&#xff0c;并且均能訪問Internet&#xff1b;同時公司業務需要對外拓展&#xff0c;需要在Internet數據中心機房部署一臺對外提供DNS和Web站點服務的服務器。…

8天Python從入門到精通【itheima】-41~44

目錄 41節-while循環的嵌套應用 1.學習目標 2.while循環的偽代碼和生活情境中的應用 3.圖片應用的代碼案例 4.代碼實例【Patrick自己親手寫的】&#xff1a; 5.whlie嵌套循環的注意點 6.小節總結 42節-while循環的嵌套案例-九九乘法表 1.補充知識-print的不換行 2.補充…

探索Linux互斥:線程安全與資源共享

個人主頁&#xff1a;chian-ocean 文章專欄-Linux 前言&#xff1a; 互斥是并發編程中避免競爭條件和保護共享資源的核心技術。通過使用鎖或信號量等機制&#xff0c;能夠確保多線程或多進程環境下對共享資源的安全訪問&#xff0c;避免數據不一致、死鎖等問題。 競爭條件 競…

《Stable Diffusion 3.0企業級落地指南》——技術賦能與商業價值的深度融合實踐

Stable Diffusion 3.0&#xff08;SD3&#xff09;作為當前多模態生成式AI技術的集大成者&#xff0c;憑借其創新的擴散Transformer架構&#xff08;DiT&#xff09;、流匹配&#xff08;Flow Matching&#xff09;技術以及超分辨率生成能力&#xff0c;正在重塑企業內容生產的…

基于本地模型+多級校驗設計的高效緩存,有效節省token數量(有點雞肋doge)。

前言 我是基于token有限而考慮的一個省錢方案&#xff0c;還能夠快速返回結果&#xff0c;但是劣勢也很明顯&#xff0c;設計不好容易出問題&#xff0c;就如下面所介紹的語義飄逸和緩存污染&#xff0c;我認為在自己學習大模型的過程用來省錢非常可以&#xff0c;再加上學習過…

網絡安全全知識圖譜:威脅、防護、管理與發展趨勢詳解

1 網絡安全基礎概念 1.1 什么是網絡安全 網絡安全是指通過技術、管理和法律等手段&#xff0c;保護計算機網絡系統中的硬件、軟件及其系統中的數據&#xff0c;不因偶然的或者惡意的原因而遭受到破壞、更改、泄露&#xff0c;確保系統連續可靠正常地運行&#xff0c;網絡服務不…