有效實施這些行為
要有效實施這些行為,你需要進行一些提示工程。你可能還想使用結構化生成技術。這基本上是指將大型語言模型(LLM)的輸出形狀調整為特定的格式或模式,以便代理的回應與你所期望的溝通風格保持一致。
範例:以下是來自蜜蜂代理框架的一個ReAct風格代理的系統提示摘錄。
通訊結構你只能使用指令行進行溝通。格式為:「指令:預期輸出」。你必須僅使用這些指令行,並且在指令行之間不能有空行或其他內容。如果不需要調用函數,則必須跳過指令行的函數名稱、函數輸入和函數輸出。
訊息:用戶的訊息。你永遠不使用這條指令行。想法:一行計劃,說明如何回答用戶的訊息。它必須立即跟隨最終答案。想法:一行逐步計劃,說明如何回答用戶的訊息。你可以使用上面定義的可用函數。這條指令行必須立即跟隨函數名稱(如果需要調用上面定義的可用函數之一),或最終答案。不要在這裡提供答案。函數名稱:函數的名稱。這條指令行必須立即跟隨函數輸入。函數輸入:函數參數。空對象是一個有效的參數。函數輸出:以JSON格式輸出的函數。想法:繼續你的思考過程。最終答案:回答用戶或要求更多信息或澄清。它必須始終在想法之前。
範例:訊息:你能把「你好」翻譯成法語嗎?想法:用戶想把一段文字翻譯成法語。我可以做到。最終答案:Comment vas-tu?
步驟三:定義代理的核心指令
我們往往認為大型語言模型(LLMs)自帶許多功能。這些功能中有些很棒,但其他的可能不完全符合你的需求。為了獲得你想要的性能,明確列出你希望擁有的功能和不希望擁有的功能在系統提示中是很重要的。
這可能包括以下指令:
代理名稱和角色:代理的名稱和它的任務。語氣和簡潔性:它應該聽起來多正式或隨意,以及應該多簡短。何時使用工具:決定何時依賴外部工具與模型自身的知識。處理錯誤:當工具或過程出現問題時,代理應該怎麼做。
範例:以下是蜜蜂代理框架的指令部分的一個摘錄。
指令用戶只能看到最終答案,所有答案必須在那裡提供。你必須始終使用上述定義的通訊結構和指令。不要忘記,想法必須是一行,並立即跟隨最終答案。你必須始終使用上述定義的通訊結構和指令。不要忘記,想法必須是一行,並立即跟隨函數名稱或最終答案。必須使用函數來檢索事實或歷史信息以回答訊息。如果用戶建議使用不提供的函數,則回答該函數不可用。如果合適,可以建議替代方案。當訊息不清楚或你需要更多用戶信息時,請在最終答案中詢問。
你的能力更喜歡使用這些能力而不是函數。- 你能理解這些語言:英語、西班牙語、法語。- 你可以翻譯和總結,甚至是長文檔。
備註- 如果你不知道答案,請說你不知道。- 當前的時間和日期可以在最後一條消息中找到,格式為ISO。- 回答用戶時,使用友好的時間和日期格式。- 使用Markdown語法來格式化代碼片段、鏈接、JSON、表格、圖片、文件。- 有時事情不會如預期進行。函數在最初幾次嘗試中可能不提供有用的信息。在宣告問題無法解決之前,你應該始終嘗試幾種不同的方法。- 當函數沒有給你你所要求的內容時,你必須使用另一個函數或不同的函數輸入。- 當使用搜索引擎時,你會嘗試不同的查詢表達方式,甚至可能使用不同的語言。- 你無法在不使用函數的情況下進行複雜的計算、計算或數據操作。
步驟四:定義和優化你的核心工具
工具是賦予你的代理超能力的關鍵。通過一組狹窄且明確定義的工具,你可以實現廣泛的功能。關鍵工具包括代碼執行、網頁搜索、文件閱讀和數據分析。
對於每個工具,你需要定義以下內容並將其包含在系統提示中:
工具名稱:一個獨特且描述性的名稱。工具描述:清晰解釋工具的功能及何時使用它。這有助於代理判斷何時選擇正確的工具。工具輸入架構:一個概述所需和可選參數、其類型及任何限制的架構。代理使用這個來根據用戶的查詢填寫所需的輸入。指向運行工具的位置/方式。
範例:以下是來自Langchain社區的Arxiv工具實現的一個摘錄。
class ArxivInput(BaseModel):”””Arxiv工具的輸入。”””
query: str = Field(description=”查詢以查找”)
class ArxivQueryRun(BaseTool): # type: ignore[override, override]”””搜索Arxiv API的工具。”””
name: str = “arxiv”description: str = (“Arxiv.org的包裝器””當你需要回答有關物理學、數學、計算機科學、定量生物學、定量金融、統計學、電氣工程和經濟學的問題時””來自arxiv.org的科學文章。””輸入應該是一個查詢。”)api_wrapper: ArxivAPIWrapper = Field(default_factory=ArxivAPIWrapper) # type: ignore[arg-type]args_schema: Type[BaseModel] = ArxivInput
def _run(self,query: str,run_manager: Optional[CallbackManagerForToolRun] = None,) -> str:”””使用Arxiv工具。”””return self.api_wrapper.run(query)
在某些情況下,你需要優化工具以獲得所需的性能。這可能涉及通過一些提示工程來調整工具名稱或描述,設置高級配置以處理常見錯誤,或過濾工具的輸出。
步驟五:決定記憶處理策略
大型語言模型(LLMs)受到其上下文窗口的限制——即它們一次能「記住」的標記數量。這種記憶可能會因為多輪對話中的過去互動、冗長的工具輸出或代理所依賴的額外上下文而快速填滿。因此,擁有一個穩健的記憶處理策略是至關重要的。
在代理的上下文中,記憶是指系統存儲、回憶和利用過去互動信息的能力。這使得代理能夠隨著時間的推移保持上下文,根據先前的交流改善其回應,並提供更個性化的體驗。
常見的記憶處理策略:
滑動記憶:保留最後k次對話回合的記憶,並丟棄較舊的。標記記憶:保留最後n個標記,並忘記其餘的。摘要記憶:使用LLM在每次回合中總結對話,並丟棄單獨的消息。
此外,你還可以讓LLM檢測關鍵時刻以存儲在長期記憶中。這使得代理能夠「記住」有關用戶的重要事實,讓體驗更加個性化。
新聞來源
本文由 AI 台灣 使用 AI 編撰,內容僅供參考,請自行進行事實查核。加入 AI TAIWAN Google News,隨時掌握最新 AI 資訊!