Qwen-Agent框架的文件相關操作:從Assistant到BasicDocQA

在前面的幾篇文章如《針對Qwen-Agent框架的Function Call及ReAct的源碼閱讀與解析:Agent基類篇》 、《基于Qwen-Agent框架的Function Call及ReAct方式調用自定義工具》、
《針對Qwen-Agent框架的源碼閱讀與解析:FnCallAgent與ReActChat篇》中,我們已經理解了Agent的具體運作機制與原理,這里我們再以文件相關操作為例,學習一下Agent的實際應用。

事實上,Qwen-Agent是一個強大的智能助手框架,它集成了RAG(檢索增強生成)能力和函數調用能力,能夠處理各種復雜任務。本文將深入探討Qwen-Agent框架中的文件相關操作,特別是從Assistant類到BasicDocQA類的實現,分析代碼結構、工作原理以及各個組件的功能。

文章目錄

  • 2. Assistant類分析
    • 2.1 類定義與初始化
    • 2.2 知識格式化函數
    • 2.3 核心運行方法
    • 2.4 知識提示預處理
    • 2.5 輔助函數
  • 3. BasicDocQA類分析
    • 3.1 類定義與初始化
    • 3.2 提示模板
    • 3.3 核心運行方法
  • 4. 兩個類的比較
    • 4.1 相同點
    • 4.2 區別點
  • 5. 工作流程分析
    • 5.1 Assistant類工作流程
    • 5.2 BasicDocQA類工作流程
  • 6. 實際應用場景
    • 6.1 Assistant類適用場景
    • 6.2 BasicDocQA類適用場景
  • 7. 總結


🎉進入大模型應用與實戰專欄 | 🚀查看更多專欄內容


2. Assistant類分析

2.1 類定義與初始化

Assistant類是Qwen-Agent框架中的一個核心類,它繼承自FnCallAgent,集成了RAG能力和函數調用能力。

class Assistant(FnCallAgent):"""This is a widely applicable agent integrated with RAG capabilities and function call ability."""def __init__(self,function_list: Optional[List[Union[str, Dict, BaseTool]]] = None,llm: Optional[Union[Dict, BaseChatModel]] = None,system_message: Optional[str] = DEFAULT_SYSTEM_MESSAGE,name: Optional[str] = None,description: Optional[str] = None,files: Optional[List[str]] = None,rag_cfg: Optional[Dict] = None):super().__init__(function_list=function_list,llm=llm,system_message=system_message,name=name,description=description,files=files,rag_cfg=rag_cfg)

初始化參數包括:

  • function_list:可調用的函數列表
  • llm:語言模型實例
  • system_message:系統消息
  • namedescription:Agent的名稱和描述
  • files:文件列表
  • rag_cfg:RAG配置

2.2 知識格式化函數

format_knowledge_to_source_and_content函數用于將檢索結果格式化為源和內容的標準格式:

def format_knowledge_to_source_and_content(result: Union[str, List[dict]]) -> List[dict]:knowledge = []if isinstance(result, str):# 字符串格式處理result = f'{result}'.strip()try:docs = json5.loads(result)except Exception:print_traceback()knowledge.append({'source': '上傳的文檔', 'content': result})return knowledgeelse:docs = resulttry:# 文檔列表格式處理_tmp_knowledge = []assert isinstance(docs, list)for doc in docs:url, snippets = doc['url'], doc['text']assert isinstance(snippets, list)_tmp_knowledge.append({'source': f'[文件]({get_basename_from_url(url)})','content': '\n\n...\n\n'.join(snippets)})knowledge.extend(_tmp_knowledge)except Exception:print_traceback()knowledge.append({'source': '上傳的文檔', 'content': result})return knowledge

該函數支持兩種輸入格式:

  1. 字符串格式:嘗試解析為JSON,失敗則作為整體內容
  2. 文檔列表格式:包含URL和文本片段的字典列表

輸出為統一的[{'source': '來源', 'content': '內容'}, ...]格式。

2.3 核心運行方法

_run方法是Assistant類的核心方法,負責處理用戶查詢:

def _run(self,messages: List[Message],lang: Literal['en', 'zh'] = 'en',knowledge: str = '',**kwargs) -> Iterator[List[Message]]:"""Q&A with RAG and tool use abilities."""new_messages = self._prepend_knowledge_prompt(messages=messages, lang=lang, knowledge=knowledge, **kwargs)return super()._run(messages=new_messages, lang=lang, **kwargs)

該方法首先調用_prepend_knowledge_prompt方法添加知識提示,然后調用父類的_run方法處理消息。

2.4 知識提示預處理

_prepend_knowledge_prompt方法用于在消息前添加知識提示:

def _prepend_knowledge_prompt(self,messages: List[Message],lang: Literal['en', 'zh'] = 'en',knowledge: str = '',**kwargs) -> List[Message]:messages = copy.deepcopy(messages)if not knowledge:# 從文件中檢索知識*_, last = self.mem.run(messages=messages, lang=lang, **kwargs)knowledge = last[-1][CONTENT]logger.debug(f'Retrieved knowledge of type `{type(knowledge).__name__}`:\n{knowledge}')if knowledge:knowledge = format_knowledge_to_source_and_content(knowledge)logger.debug(f'Formatted knowledge into type `{type(knowledge).__name__}`:\n{knowledge}')else:knowledge = []snippets = []for k in knowledge:snippets.append(KNOWLEDGE_SNIPPET[lang].format(source=k['source'], content=k['content']))knowledge_prompt = ''if snippets:knowledge_prompt = KNOWLEDGE_TEMPLATE[lang].format(knowledge='\n\n'.join(snippets))if knowledge_prompt:if messages[0][ROLE] == SYSTEM:messages[0][CONTENT] += '\n\n' + knowledge_promptelse:messages = [Message(role=SYSTEM, content=knowledge_prompt)] + messagesreturn messages

處理流程:

  1. 如果未提供知識,則從文件中檢索
  2. 格式化知識為標準格式
  3. 將知識片段格式化為多語言模板
  4. 將格式化的知識添加到系統消息中

2.5 輔助函數

get_current_date_str函數用于獲取當前日期的字符串表示:

def get_current_date_str(lang: Literal['en', 'zh'] = 'en',hours_from_utc: Optional[int] = None,
) -> str:# 獲取當前時間if hours_from_utc is None:cur_time = datetime.datetime.now()else:cur_time = datetime.datetime.utcnow() + datetime.timedelta(hours=hours_from_utc)# 根據語言格式化日期字符串if lang == 'en':date_str = 'Current date: ' + cur_time.strftime('%A, %B %d, %Y')elif lang == 'zh':cur_time = cur_time.timetuple()date_str = f'當前時間:{cur_time.tm_year}{cur_time.tm_mon}{cur_time.tm_mday}日,星期'date_str += ['一', '二', '三', '四', '五', '六', '日'][cur_time.tm_wday]date_str += '。'else:raise NotImplementedErrorreturn date_str

該函數支持中英文兩種格式,可以指定UTC時差。

3. BasicDocQA類分析

3.1 類定義與初始化

BasicDocQA類繼承自Assistant類,專門用于文檔問答:

class BasicDocQA(Assistant):"""This is an agent for doc QA."""def __init__(self,function_list: Optional[List[Union[str, Dict, BaseTool]]] = None,llm: Optional[Union[Dict, BaseChatModel]] = None,system_message: Optional[str] = DEFAULT_SYSTEM_MESSAGE,name: Optional[str] = DEFAULT_NAME,description: Optional[str] = DEFAULT_DESC,files: Optional[List[str]] = None,rag_cfg: Optional[Dict] = None):super().__init__(function_list=function_list,llm=llm,system_message=system_message,name=name,description=description,files=files,rag_cfg=rag_cfg)

默認名稱和描述:

  • DEFAULT_NAME = 'Basic DocQA'
  • DEFAULT_DESC = '可以根據問題,檢索出知識庫中的某個相關細節來回答。適用于需要定位到具體位置的問題,例如"介紹表1"等類型的問題'

3.2 提示模板

BasicDocQA類使用特定的提示模板,支持中英文:

PROMPT_TEMPLATE_ZH = """請充分理解以下參考資料內容,組織出滿足用戶提問的條理清晰的回復。
#參考資料:
{ref_doc}"""PROMPT_TEMPLATE_EN = """Please fully understand the content of the following reference materials and organize a clear response that meets the user's questions.
# Reference materials:
{ref_doc}"""PROMPT_TEMPLATE = {'zh': PROMPT_TEMPLATE_ZH,'en': PROMPT_TEMPLATE_EN,
}

3.3 核心運行方法

BasicDocQA類重寫了_run方法,使用不同的文檔問答提示:

def _run(self, messages: List[Message], lang: str = 'en', **kwargs) -> Iterator[List[Message]]:"""This agent using different doc qa prompt with Assistant"""# 使用Memory agent進行數據管理*_, last = self.mem.run(messages=messages, **kwargs)knowledge = last[-1][CONTENT]messages = copy.deepcopy(messages)system_prompt = PROMPT_TEMPLATE[lang].format(ref_doc=knowledge)if messages[0][ROLE] == SYSTEM:messages[0][CONTENT] += '\n\n' + system_promptelse:messages.insert(0, Message(SYSTEM, system_prompt))response = self._call_llm(messages=messages)return response

處理流程:

  1. 使用mem.run檢索相關知識
  2. 使用特定的文檔問答提示模板
  3. 將格式化的提示添加到系統消息中
  4. 調用語言模型生成回復

4. 兩個類的比較

4.1 相同點

  1. 都繼承自Agent基類,具備Agent的基本能力
  2. 都集成了RAG能力,可以檢索知識庫
  3. 都支持中英文兩種語言
  4. 都通過添加系統提示來引導模型回答

4.2 區別點

  1. 用途不同

    • Assistant類是通用助手,集成了RAG和函數調用能力
    • BasicDocQA類專注于文檔問答,適用于需要定位具體細節的問題
  2. 提示模板不同

    • Assistant類使用知識庫模板,強調知識來源
    • BasicDocQA類使用參考資料模板,強調對參考資料的理解和組織
  3. 處理流程不同

    • Assistant類先格式化知識,再添加到系統消息
    • BasicDocQA類直接將知識作為參考資料添加到系統消息

5. 工作流程分析

5.1 Assistant類工作流程

  1. 初始化Assistant實例,配置參數
  2. 接收用戶消息
  3. 如果未提供知識,從文件中檢索相關知識
  4. 格式化知識為標準格式(源和內容)
  5. 將格式化的知識添加到系統消息中
  6. 調用語言模型生成回復

5.2 BasicDocQA類工作流程

  1. 初始化BasicDocQA實例,配置參數
  2. 接收用戶消息
  3. 從文件中檢索相關知識
  4. 使用特定的文檔問答提示模板
  5. 將格式化的提示添加到系統消息中
  6. 調用語言模型生成回復

6. 實際應用場景

6.1 Assistant類適用場景

  • 通用問答系統
  • 需要調用外部函數的場景
  • 多種知識源集成的場景
  • 需要展示知識來源的場景

6.2 BasicDocQA類適用場景

  • 特定文檔問答
  • 需要定位文檔中具體細節的場景
  • 專注于文檔內容理解和組織的場景
  • 例如:“介紹表1”、"第三章說了什么"等具體位置問題

7. 總結

Qwen-Agent框架中的Assistant類和BasicDocQA類展示了框架在文件相關操作中的靈活性和強大能力。Assistant類作為通用助手,集成了RAG能力和函數調用能力,可以處理各種復雜任務;而BasicDocQA類專注于文檔問答,適用于需要定位具體細節的問題。

兩個類都通過添加系統提示來引導模型回答,但使用了不同的提示模板和處理流程。這種設計使得框架可以根據不同場景靈活配置,提供最適合的回答。

在實際應用中,開發者可以根據具體需求選擇合適的類,或者基于這些類進行擴展,構建更加專業和高效的智能助手系統。

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

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

相關文章

RSSI定位程序,N個錨點、三維空間,使用CKF對軌跡進行濾波,附MATLAB代碼的下載鏈接

本文所述的程序實現三維空間中基于RSSI信號的多錨點定位,并采用容積卡爾曼濾波(CKF)對動態軌跡進行降噪優化。代碼包含完整的定位仿真流程,涵蓋環境建模、信號強度模擬、定位解算、軌跡濾波及可視化分析模塊 文章目錄 程序介紹概述…

開源軟件與自由軟件:一場理念與實踐的交鋒

在科技的世界里,“開源軟件”和“自由軟件”這兩個詞幾乎無人不知。很多人或許都聽說過,它們的代碼是公開的,可以供所有人查看、修改和使用。然而,若要細究它們之間的區別,恐怕不少朋友會覺得云里霧里。今天&#xff0…

C++ - 頭文件基礎(常用標準庫頭文件、自定義頭文件、頭文件引入方式、防止頭文件重復包含機制)

一、頭文件 在 C 中&#xff0c;頭文件&#xff08;.h&#xff09;用于函數聲明、類定義、宏定義等等 在 Visual Studio 中&#xff0c;頭文件通常放在頭文件目錄中&#xff0c;頭文件實現通常放在源文件目錄中 二、常用標準庫頭文件 1、輸入輸出 <iostream> 標準輸入…

CSS 背景屬性學習筆記

一、CSS 背景屬性概述 CSS 背景屬性用于定義 HTML 元素的背景效果&#xff0c;主要包括以下幾種屬性&#xff1a; background-color&#xff1a;定義元素的背景顏色。 background-image&#xff1a;定義元素的背景圖像。 background-repeat&#xff1a;定義背景圖像如何重復…

Qt實現鼠標拖動窗口

Qt實現鼠標拖動窗口 1、設置窗口無邊框2、重寫鼠標點擊&#xff0c;移動函數2.1添加頭文件2.2 重寫函數2.3 添加定義 3、定義一個偏移值4、判斷鼠標左鍵是否按下并計算偏移值5、移動窗口6、.h文件和.cpp文件6.1 .h文件6.2 .cpp文件 7、總結 1、設置窗口無邊框 this->setWin…

MDX語言的數論算法

MDX語言的數論算法探討 引言 數論作為數學的一個重要分支&#xff0c;主要研究整數及其性質。在計算機科學和信息技術領域&#xff0c;數論算法被廣泛應用于密碼學、算法設計、數據加密等領域。MDX&#xff08;Multi-Dimensional Expressions&#xff09;語言&#xff0c;雖然…

【學Rust寫CAD】34 精確 Alpha 混合函數(argb.rs補充方法)

源碼 #[inline]pub fn over_exact(self, dst: Argb) -> Argb {let a 255 - self.alpha32();let t dst.rb() * a 0x80_00_80;let mut rb (t ((t >> 8) & Argb::MASK)) >> 8;rb & Argb::MASK;rb self.rb();// saturaterb | 0x1000100 - ((rb >&…

2025-04-06 NO.2 Quest3 基礎配置與打包

文章目錄 1 場景配置1.1 開啟手勢支持1.2 創建 OVRCameraRig1.3 創建可交互 Cube 2 打包配置 環境&#xff1a; Windows 11Unity6000.0.42f1 Quest3 開發環境配置見 2025-03-17 NO.1 Quest3 開發環境配置教程_quest3 unity 開發流程-CSDN博客。 1 場景配置 1.1 開啟手勢支持 …

LabVIEW提升程序響應速度

LabVIEW 程序在不同計算機上的響應速度可能存在較大差異&#xff0c;這通常由兩方面因素決定&#xff1a;計算機硬件性能和程序本身的優化程度。本文將分別從硬件配置對程序運行的影響以及代碼優化方法進行詳細分析&#xff0c;幫助提升 LabVIEW 程序的執行效率。 一、計算機硬…

Matlab:三維繪圖

目錄 1.三維曲線繪圖命令&#xff1a;plot3 實例——繪制空間直線 實例——繪制三角曲線 2.三維曲線繪圖命令&#xff1a;explot3 3.三維網格命令&#xff1a;mesh 實例——繪制網格面 實例——繪制山峰曲面 實例——繪制函數曲線 1.三維曲線繪圖命令&#xff1a;plot3 …

微信小程序基于Canvas實現頭像圖片裁剪(上)

序言 嘿&#xff0c;打工人混跡職場這么久&#xff0c;圖片處理肯定都沒少碰。不過咱說實話&#xff0c;大部分時候都是直接 “抄近道”&#xff0c;用現成的三方組件&#x1f60f;。就像我&#xff0c;主打一個會用工具&#xff0c;畢竟善用工具可是咱人類的 “超能力”&…

[特殊字符] 使用 Handsontable 構建一個支持 Excel 公式計算的動態表格

在 Web 應用中&#xff0c;處理表格數據并提供 Excel 級的功能&#xff08;如公式計算、數據導入導出&#xff09;一直是個挑戰。今天&#xff0c;我將帶你使用 React Handsontable 搭建一個強大的 Excel 風格表格&#xff0c;支持 公式計算、Excel 文件導入導出&#xff0c;并…

0302useState-hooks-react-仿低代碼平臺項目

文章目錄 1 useState1.1 說明返回 1.2 示例1.3 數據類型 2 state2.1 概述2.2 state特點 3 state重構問卷4 immer結語 1 useState useState 是一個 React Hook&#xff0c;它允許你向組件添加一個 狀態變量。 1.1 說明 語法 const [state, setState] useState(initialState…

前端實現單點登錄(SSO)的方案

概念&#xff1a;單點登錄&#xff08;Single Sign-On, SSO&#xff09;主要是在多個系統、多個瀏覽器或多個標簽頁之間共享登錄狀態&#xff0c;保證用戶只需登錄一次&#xff0c;就能訪問多個關聯應用&#xff0c;而不需要重復登錄。 &#x1f4a1; 方案分類 1. 前端級別 SS…

zabbix監控網站(nginx、redis、mysql)

目錄 前提準備&#xff1a; zabbix-server主機配置&#xff1a; 1. 安裝數據庫 nginx主機配置&#xff1a; 1. 安裝nginx redis主機配置&#xff1a; 1. 安裝redis mysql主機配置&#xff1a; 1. 安裝數據庫 zabbix-server&#xff1a; 1. 安裝zabbix 2. 編輯配置文…

無人機等非合作目標公開數據集2025.4.3

一.無人機遙感數據概述 1.1 定義與特點 在遙感技術的不斷發展中&#xff0c;無人機遙感數據作為一種新興的數據源&#xff0c;正逐漸嶄露頭角。它是通過無人駕駛飛行器&#xff08;UAV&#xff09;搭載各種傳感器獲取的地理空間信息&#xff0c;具有 覆蓋范圍大、綜合精度高、…

大數據時代的隱私保護:區塊鏈技術的創新應用

一、引言 在當今數字化時代&#xff0c;大數據已經成為推動社會發展的關鍵力量。從商業決策到社會治理&#xff0c;從醫療健康到金融服務&#xff0c;數據的價值日益凸顯。然而&#xff0c;隨著數據的大量收集和廣泛使用&#xff0c;隱私保護問題也日益突出。如何在充分利用大…

LeetCode 2442:統計反轉后的不同整數數量

目錄 核心思想&#xff1a;數字的“拆分”與“重組” 分步拆解&#xff08;以輸入 123 為例&#xff09; 關鍵操作詳解 為什么能處理中間或末尾的0&#xff1f; 數學本質 總結 題目描述 解題思路 代碼實現 代碼解析 復雜度分析 示例演示 總結 核心思想&#xff1a;…

Python爬蟲第3節-會話、Cookies及代理的基本原理

目錄 一、會話和Cookies 1.1 靜態網頁和動態網頁 1.2 無狀態HTTP 1.3 常見誤區 二、代理的基本原理 2.1 基本原理 2.2 代理的作用 2.3 爬蟲代理 2.4 代理分類 2.5 常見代理設置 一、會話和Cookies 大家在瀏覽網站過程中&#xff0c;肯定經常遇到需要登錄的場景。有些…

Flutter項目之登錄注冊功能實現

目錄&#xff1a; 1、頁面效果2、登錄兩種狀態界面3、中間按鈕部分4、廣告區域5、最新資訊6、登錄注冊頁聯調6.1、網絡請求工具類6.2、注冊頁聯調6.3、登錄問題分析6.4、本地緩存6.5、共享token6.6、登錄頁聯調6.7、退出登錄 1、頁面效果 import package:flutter/material.dart…