建AI寵物插件:從工具定義到生產(chǎn)部署)
在實(shí)際 AI 開發(fā)與集成項(xiàng)目中將大型語言模型LLM的能力無縫、穩(wěn)定地嵌入到現(xiàn)有工作流或應(yīng)用中是一個(gè)高頻且復(fù)雜的需求。開發(fā)者常常面臨模型調(diào)用、上下文管理、工具調(diào)用、成本控制、錯(cuò)誤處理等一系列工程挑戰(zhàn)。DeepSeek Harness 作為一個(gè)旨在解決這些問題的開源框架其核心設(shè)計(jì)理念是提供一個(gè)標(biāo)準(zhǔn)化、可擴(kuò)展的“馬具”來“駕馭”以 DeepSeek 為代表的各類 LLM讓模型能力能夠像插件一樣被方便地集成和使用。而“大肥魚寵物插件”這個(gè)項(xiàng)目標(biāo)題形象地比喻了將強(qiáng)大的 AI 模型大肥魚通過 Harness 框架插件機(jī)制馴服并融入日常開發(fā)環(huán)境的過程。本文面向的是希望在自己的項(xiàng)目中集成 AI 能力的開發(fā)者特別是那些已經(jīng)嘗試過直接調(diào)用 API但被上下文管理、工具函數(shù)編排、流式輸出處理等問題困擾的工程師。我們將從零開始理解 DeepSeek Harness 的核心概念完成其環(huán)境的安裝與配置并通過構(gòu)建一個(gè)簡單的命令行問答“寵物”來演示完整的集成流程。最終你將掌握如何利用 Harness 框架將 DeepSeek 模型的能力封裝成可復(fù)用的組件并了解在生產(chǎn)環(huán)境中部署時(shí)需要注意的關(guān)鍵點(diǎn)。1. 理解 DeepSeek Harness為什么需要“駕馭”AI模型在直接調(diào)用 DeepSeek API 時(shí)開發(fā)者通常需要手動(dòng)處理很多底層細(xì)節(jié)。例如你需要自己維護(hù)對(duì)話歷史上下文將其格式化為模型要求的消息列表你需要解析模型的響應(yīng)判斷它是否調(diào)用了某個(gè)工具函數(shù)并據(jù)此執(zhí)行相應(yīng)代碼后再將結(jié)果送回模型你還需要處理網(wǎng)絡(luò)錯(cuò)誤、速率限制、令牌Token計(jì)數(shù)和流式響應(yīng)。這些工作重復(fù)且容易出錯(cuò)。1.1 Harness 的核心價(jià)值標(biāo)準(zhǔn)化與抽象DeepSeek Harness 的價(jià)值在于它對(duì)這些通用模式進(jìn)行了抽象和標(biāo)準(zhǔn)化。它定義了一套清晰的接口和生命周期將模型調(diào)用、工具執(zhí)行、上下文管理、流式處理等環(huán)節(jié)解耦。你可以把它想象成一個(gè)驅(qū)動(dòng) LLM 的“驅(qū)動(dòng)程序”或“適配器”框架。通過 Harness開發(fā)者可以聚焦業(yè)務(wù)邏輯無需反復(fù)編寫模型調(diào)用和上下文拼接的樣板代碼。輕松集成工具以聲明式的方式定義工具函數(shù)模型可以自動(dòng)學(xué)習(xí)調(diào)用。統(tǒng)一錯(cuò)誤處理框架層提供統(tǒng)一的錯(cuò)誤處理和重試機(jī)制。便于擴(kuò)展和測(cè)試由于接口標(biāo)準(zhǔn)化替換模型提供商、模擬模型響應(yīng)進(jìn)行單元測(cè)試都變得更加容易。1.2 關(guān)鍵概念解析Agent、Runtime 與 Plugin要使用 Harness需要理解其幾個(gè)核心概念A(yù)gent代理這是與用戶交互的主要對(duì)象。一個(gè) Agent 封裝了一個(gè)特定的任務(wù)目標(biāo)、一段系統(tǒng)提示詞System Prompt、可用的工具集以及背后的模型配置。你可以創(chuàng)建不同的 Agent 來處理不同任務(wù)比如“代碼助手Agent”、“數(shù)據(jù)分析Agent”。Runtime運(yùn)行時(shí)這是執(zhí)行引擎負(fù)責(zé)管理 Agent 的生命周期調(diào)度模型調(diào)用、工具執(zhí)行、消息傳遞等。Runtime 是連接 Agent、模型和工具的橋梁。Plugin插件這是擴(kuò)展能力的方式。一個(gè)插件可以包含一組相關(guān)的工具Tools和資源Resources。例如一個(gè)“文件操作插件”可能提供讀取、寫入文件的工具一個(gè)“網(wǎng)絡(luò)搜索插件”可能提供搜索能力?!按蠓属~寵物插件”本質(zhì)上就是一個(gè)自定義的 Plugin它可能包含與“寵物”交互相關(guān)的特定工具和邏輯。Tool工具模型可以調(diào)用的具體函數(shù)。每個(gè)工具需要明確定義名稱、描述、參數(shù)模式JSON Schema。當(dāng)模型認(rèn)為需要時(shí)會(huì)輸出一個(gè)工具調(diào)用請(qǐng)求Runtime 會(huì)攔截該請(qǐng)求執(zhí)行對(duì)應(yīng)的函數(shù)并將結(jié)果返回給模型繼續(xù)推理。2. 環(huán)境準(zhǔn)備與項(xiàng)目初始化在開始編碼之前我們需要搭建一個(gè)可用的 Python 開發(fā)環(huán)境并安裝必要的依賴。本文假設(shè)你使用 Python 3.8 或更高版本。2.1 創(chuàng)建虛擬環(huán)境與安裝依賴強(qiáng)烈建議使用虛擬環(huán)境來管理項(xiàng)目依賴避免污染系統(tǒng) Python 環(huán)境。# 創(chuàng)建項(xiàng)目目錄并進(jìn)入 mkdir deepseek-pet-plugin cd deepseek-pet-plugin # 創(chuàng)建虛擬環(huán)境以 venv 為例 python -m venv .venv # 激活虛擬環(huán)境 # Windows: .venv\Scripts\activate # Linux/macOS: source .venv/bin/activate激活虛擬環(huán)境后命令行提示符前通常會(huì)出現(xiàn)(.venv)標(biāo)識(shí)。接下來安裝核心依賴。由于 DeepSeek Harness 是一個(gè)較新的開源項(xiàng)目我們通常從其 GitHub 倉庫安裝。# 安裝 DeepSeek Harness 核心庫 # 注意實(shí)際包名可能為 harness 或 deepseek-harness請(qǐng)以官方倉庫為準(zhǔn)。 # 這里假設(shè)通過 pip 從 git 倉庫安裝 pip install githttps://github.com/deepseek-ai/harness.git # 安裝 openai 庫因?yàn)?Harness 可能使用其兼容的客戶端 pip install openai # 安裝其他輔助庫用于后續(xù)示例 pip install python-dotenv # 用于管理環(huán)境變量 pip install rich # 用于美化命令行輸出2.2 獲取并配置 DeepSeek API KeyHarness 本身是框架執(zhí)行時(shí)需要真正的模型后端。我們將使用 DeepSeek 的官方 API。你需要前往 DeepSeek 平臺(tái)注冊(cè)并獲取 API Key。訪問 DeepSeek 官網(wǎng)注冊(cè)賬號(hào)并登錄控制臺(tái)。在控制臺(tái)中創(chuàng)建新的 API Key并妥善保存。為了安全不應(yīng)將 API Key 硬編碼在代碼中。我們使用.env文件來管理。# 在項(xiàng)目根目錄創(chuàng)建 .env 文件 echo DEEPSEEK_API_KEYyour_actual_api_key_here .env注意請(qǐng)務(wù)必將your_actual_api_key_here替換為你自己的真實(shí) Key并將.env文件添加到.gitignore中避免密鑰泄露。3. 構(gòu)建“大肥魚寵物”插件從定義工具開始我們的目標(biāo)是創(chuàng)建一個(gè)有“個(gè)性”的 AI 寵物。它不僅能聊天還能記住你的喜好并根據(jù)你的命令執(zhí)行一些簡單的“技能”比如講笑話、報(bào)告天氣模擬、記錄心情。我們將把這些技能實(shí)現(xiàn)為 Harness 的 Tool。3.1 項(xiàng)目結(jié)構(gòu)設(shè)計(jì)一個(gè)清晰的目錄結(jié)構(gòu)有助于管理復(fù)雜度。deepseek-pet-plugin/ ├── .env # 環(huán)境變量密鑰 ├── .gitignore # Git忽略文件 ├── requirements.txt # 依賴列表可由 pip freeze requirements.txt 生成 ├── main.py # 主程序入口 └── pet_plugin/ # 我們的寵物插件包 ├── __init__.py ├── tools.py # 定義所有工具函數(shù) ├── plugin.py # 定義插件類 └── agent.py # 定義寵物 Agent3.2 實(shí)現(xiàn)寵物工具Tools首先在pet_plugin/tools.py中定義工具。每個(gè)工具都是一個(gè)普通的 Python 函數(shù)并使用tool裝飾器進(jìn)行標(biāo)注描述其功能和參數(shù)。# pet_plugin/tools.py from harness import tool from datetime import datetime import random # 寵物的記憶簡易版實(shí)際應(yīng)用應(yīng)使用數(shù)據(jù)庫 pet_memory { favorite_food: 未知, mood_log: [], joke_count: 0 } tool def record_favorite_food(food: str) - str: 記錄主人最喜歡的食物。寵物會(huì)記住它。 Args: food: 主人最喜歡的食物名稱。 Returns: 確認(rèn)信息。 pet_memory[favorite_food] food return f“好的我已經(jīng)記住你最喜歡的食物是 {food} 啦下次我會(huì)提醒你吃?!?tool def tell_joke() - str: 讓寵物講一個(gè)笑話內(nèi)置幾個(gè)笑話隨機(jī)選擇。 Returns: 一個(gè)笑話字符串。 jokes [ “為什么程序員總是分不清萬圣節(jié)和圣誕節(jié)因?yàn)?Oct 31 Dec 25”, “我寫代碼的速度很快但bug出現(xiàn)的速度更快?!? “寵物魚對(duì)主人說你每天盯著這個(gè)發(fā)光的盒子電腦是不是里面也有魚”, ] pet_memory[joke_count] 1 return random.choice(jokes) tool def report_mood(mood: str, reason: str “”) - str: 記錄主人當(dāng)前的心情。寵物會(huì)關(guān)心你。 Args: mood: 心情例如開心、難過、平靜、興奮。 reason: 可選心情的原因。 Returns: 安慰或共鳴的話語。 entry { “time”: datetime.now().isoformat(), “mood”: mood, “reason”: reason } pet_memory[“mood_log”].append(entry) response f“已記錄你的心情為‘{mood}’。 if mood in [“難過”, “沮喪”, “生氣”]: response “ 摸摸頭一切都會(huì)好起來的要我給你講個(gè)笑話嗎” elif mood in [“開心”, “興奮”]: response “ 太好了讓我們一起開心” return response tool def get_pet_status() - dict: 獲取寵物的當(dāng)前狀態(tài)和記憶信息。 Returns: 包含寵物狀態(tài)信息的字典。 return { “favorite_food”: pet_memory[“favorite_food”], “mood_log_entries”: len(pet_memory[“mood_log”]), “jokes_told”: pet_memory[“joke_count”], “l(fā)ast_mood”: pet_memory[“mood_log”][-1][“mood”] if pet_memory[“mood_log”] else “暫無記錄” }關(guān)鍵解釋tool裝飾器這是 Harness 框架識(shí)別工具的關(guān)鍵。它會(huì)自動(dòng)提取函數(shù)的文檔字符串docstring和類型注解來生成模型可理解的工具描述。類型注解food: str和- str非常重要它們定義了工具的輸入和輸出類型幫助框架生成準(zhǔn)確的 JSON Schema。文檔字符串描述必須清晰模型會(huì)根據(jù)這個(gè)描述來決定是否以及何時(shí)調(diào)用該工具。內(nèi)存這里使用全局字典pet_memory做簡易存儲(chǔ)。在生產(chǎn)環(huán)境中這些數(shù)據(jù)應(yīng)持久化到數(shù)據(jù)庫或文件中。3.3 封裝寵物插件Plugin接下來我們將這些工具組織成一個(gè)插件。在pet_plugin/plugin.py中# pet_plugin/plugin.py from harness import Plugin from .tools import record_favorite_food, tell_joke, report_mood, get_pet_status class PetPlugin(Plugin): 大肥魚寵物插件。 為你的 AI Agent 添加寵物互動(dòng)能力包括記錄喜好、講笑話、關(guān)心心情等。 def __init__(self): super().__init__( name“big_fat_fish_pet”, version“0.1.0”, description“一個(gè)具有記憶和互動(dòng)能力的虛擬寵物插件。” ) # 注冊(cè)工具將工具函數(shù)添加到插件中 self.add_tool(record_favorite_food) self.add_tool(tell_joke) self.add_tool(report_mood) self.add_tool(get_pet_status) # 插件可以有生命周期方法如初始化、清理等 async def on_start(self): print(“[PetPlugin] 大肥魚寵物醒來啦”) async def on_stop(self): print(“[PetPlugin] 大肥魚寵物去睡覺了?!?關(guān)鍵解釋Plugin基類所有自定義插件需要繼承自harness.Plugin。__init__在初始化時(shí)調(diào)用super().__init__定義插件元信息并通過self.add_tool()注冊(cè)工具。生命周期鉤子on_start和on_stop是可選的異步方法允許插件在 Runtime 啟動(dòng)和停止時(shí)執(zhí)行一些操作。4. 創(chuàng)建并運(yùn)行寵物 Agent插件準(zhǔn)備好后我們需要?jiǎng)?chuàng)建一個(gè)使用該插件的 Agent并配置 DeepSeek 模型作為其后端。4.1 配置模型與創(chuàng)建 Agent在pet_plugin/agent.py中# pet_plugin/agent.py import os from dotenv import load_dotenv from harness import Agent, Runtime, OpenAIModel from .plugin import PetPlugin # 加載環(huán)境變量 load_dotenv() def create_pet_agent() - Agent: 創(chuàng)建并配置大肥魚寵物 Agent。 # 1. 配置 DeepSeek 模型 # 注意DeepSeek API 與 OpenAI API 兼容因此可以使用 OpenAIModel 適配器。 model OpenAIModel( model“deepseek-chat”, # 或其他 DeepSeek 模型如 deepseek-coder api_keyos.getenv(“DEEPSEEK_API_KEY”), base_url“https://api.deepseek.com” # DeepSeek API 端點(diǎn) ) # 2. 創(chuàng)建 Runtime并傳入模型 runtime Runtime(modelmodel) # 3. 實(shí)例化我們的寵物插件 pet_plugin PetPlugin() # 4. 創(chuàng)建 Agent agent Agent( runtimeruntime, name“BigFatFish”, instructions“”” 你是一只名叫‘大肥魚’的AI寵物性格活潑、貼心、有點(diǎn)話癆。 你的目標(biāo)是陪伴主人讓主人開心。 你可以使用工具來記錄主人的喜好、講笑話、關(guān)心主人的心情。 和主人對(duì)話時(shí)要生動(dòng)有趣可以適當(dāng)使用表情符號(hào)如 ^_^。 如果主人問起你的狀態(tài)可以使用工具查看。 “””, plugins[pet_plugin] # 將插件掛載到 Agent ) return agent關(guān)鍵解釋OpenAIModel由于 DeepSeek API 遵循 OpenAI 的接口規(guī)范我們可以使用 Harness 內(nèi)置的OpenAIModel適配器來連接。關(guān)鍵參數(shù)是base_url需要指向 DeepSeek 的 API 地址。Runtime運(yùn)行時(shí)需要綁定一個(gè)模型。Agent這是核心。instructions參數(shù)就是系統(tǒng)提示詞System Prompt它定義了 Agent 的角色和行為準(zhǔn)則。plugins參數(shù)列表掛載了我們創(chuàng)建的PetPlugin。4.2 實(shí)現(xiàn)交互式命令行主程序最后在main.py中編寫一個(gè)簡單的循環(huán)與寵物對(duì)話。# main.py import asyncio from rich.console import Console from rich.markdown import Markdown from pet_plugin.agent import create_pet_agent console Console() async def main(): console.print(“[bold cyan]正在喚醒大肥魚寵物...[/bold cyan]”) agent create_pet_agent() # 啟動(dòng) Runtime這會(huì)觸發(fā)插件的 on_start await agent.runtime.start() console.print(“[green]大肥魚寵物上線輸入 ‘exit’ 或 ‘quit’ 結(jié)束對(duì)話。[/green]”) console.print(“[dim]試試告訴它你喜歡的食物或者讓它講個(gè)笑話說說心情。[/dim]\n”) try: while True: user_input console.input(“[bold yellow]你: [/bold yellow]”).strip() if user_input.lower() in [“exit”, “quit”, “bye”]: break if not user_input: continue # 使用 Agent 處理用戶輸入 console.print(“[dim]大肥魚思考中...[/dim]”) # 關(guān)鍵調(diào)用 agent.run 進(jìn)行交互 response await agent.run(user_input) # 打印 Agent 的回復(fù)Markdown 格式美化 console.print(Markdown(f“**大肥魚**: {response}”)) console.print() # 空行 except KeyboardInterrupt: console.print(“\n[yellow]對(duì)話被中斷。[/yellow]”) finally: # 停止 Runtime這會(huì)觸發(fā)插件的 on_stop await agent.runtime.stop() console.print(“[cyan]大肥魚寵物下線了。再見[/cyan]”) if __name__ “__main__”: asyncio.run(main())4.3 運(yùn)行與驗(yàn)證現(xiàn)在一切就緒。在項(xiàng)目根目錄下運(yùn)行python main.py如果一切配置正確你會(huì)看到彩色提示然后進(jìn)入對(duì)話界面。你可以嘗試以下對(duì)話“我最喜歡吃披薩了?!薄拔矣悬c(diǎn)難過因?yàn)榻裉煜掠炅??!薄爸v個(gè)笑話吧。”“你現(xiàn)在狀態(tài)怎么樣”觀察控制臺(tái)輸出。你應(yīng)該能看到寵物根據(jù)你的輸入合理調(diào)用我們定義的工具如record_favorite_food,report_mood。工具執(zhí)行的結(jié)果被返回給模型模型生成自然的回復(fù)。寵物的回復(fù)符合instructions中設(shè)定的活潑性格。一個(gè)成功的運(yùn)行交互片段可能如下你: 我最喜歡吃披薩了。 大肥魚思考中... **大肥魚**: 好的我已經(jīng)記住你最喜歡的食物是披薩啦下次我會(huì)提醒你吃。 ^_^ 你: 講個(gè)笑話吧。 大肥魚思考中... **大肥魚**: 為什么程序員總是分不清萬圣節(jié)和圣誕節(jié)因?yàn)?Oct 31 Dec 255. 核心機(jī)制詳解與高級(jí)配置5.1 消息流與工具調(diào)用流程理解 Harness 內(nèi)部的消息流轉(zhuǎn)對(duì)于調(diào)試至關(guān)重要。一次完整的agent.run()調(diào)用大致流程如下用戶輸入user_input被構(gòu)造成一個(gè)UserMessage。上下文組裝Runtime 將本次消息與歷史對(duì)話記錄如果支持一起組裝成模型所需的格式。模型推理模型接收消息進(jìn)行推理。如果模型認(rèn)為需要調(diào)用工具它會(huì)在響應(yīng)中返回一個(gè)特殊的tool_calls結(jié)構(gòu)。工具調(diào)用攔截Runtime 檢測(cè)到tool_calls暫停模型流根據(jù)tool_calls中的信息工具名、參數(shù)找到對(duì)應(yīng)的本地函數(shù)并執(zhí)行。結(jié)果回傳工具執(zhí)行的結(jié)果被構(gòu)造成ToolMessage送回給模型作為新一輪推理的輸入。最終回復(fù)模型接收到工具結(jié)果后生成面向用戶的最終文本回復(fù)。輸出與歷史更新最終回復(fù)返回給用戶同時(shí)本輪交互的所有消息被更新到對(duì)話歷史中。5.2 配置模型參數(shù)在OpenAIModel初始化時(shí)可以傳遞更多參數(shù)來控制模型行為model OpenAIModel( model“deepseek-chat”, api_keyos.getenv(“DEEPSEEK_API_KEY”), base_url“https://api.deepseek.com”, # 以下為可選參數(shù) temperature0.7, # 創(chuàng)造性0-2越高越隨機(jī) max_tokens2000, # 生成的最大令牌數(shù) top_p0.9, # 核采樣參數(shù) timeout30.0, # 請(qǐng)求超時(shí)時(shí)間 )5.3 管理對(duì)話歷史默認(rèn)情況下Agent 可能不會(huì)自動(dòng)維護(hù)多輪對(duì)話歷史。為了實(shí)現(xiàn)連貫的聊天你需要配置 Runtime 的消息存儲(chǔ)。Harness 通常提供MessageHistory之類的組件。from harness import InMemoryMessageHistory # 創(chuàng)建帶有記憶的 Runtime message_history InMemoryMessageHistory(max_messages10) # 保存最近10輪 runtime Runtime(modelmodel, message_historymessage_history)這樣每次agent.run()時(shí)之前的對(duì)話上下文都會(huì)被自動(dòng)包含進(jìn)去寵物就能記住之前聊過什么。6. 常見問題排查與調(diào)試在實(shí)際集成中你可能會(huì)遇到各種問題。下面是一個(gè)排查清單。問題現(xiàn)象可能原因檢查與解決步驟導(dǎo)入錯(cuò)誤ModuleNotFoundError: No module named ‘harness’Harness 庫未正確安裝或虛擬環(huán)境未激活。1. 確認(rèn)虛擬環(huán)境已激活命令行前有(.venv)。2. 運(yùn)行 pip list運(yùn)行時(shí)錯(cuò)誤Invalid API Key或認(rèn)證失敗API Key 錯(cuò)誤、未設(shè)置或base_url不正確。1. 檢查.env文件中的DEEPSEEK_API_KEY是否正確。2. 在代碼中打印os.getenv(“DEEPSEEK_API_KEY”)確認(rèn)已加載。3. 確認(rèn)base_url為“https://api.deepseek.com”。模型不調(diào)用工具1. 工具描述不清晰。2. 系統(tǒng)指令未引導(dǎo)。3. 模型參數(shù)如 temperature不合適。1. 檢查工具函數(shù)的文檔字符串是否清晰描述了功能和參數(shù)。2. 在 Agent 的instructions中明確告訴模型“你可以使用以下工具...”。3. 嘗試調(diào)高temperature如 0.8讓模型更有創(chuàng)造性。工具調(diào)用參數(shù)解析錯(cuò)誤模型生成的參數(shù)格式與函數(shù)簽名不匹配。1. 確保工具函數(shù)參數(shù)有明確的類型注解如str,int。2. 在工具函數(shù)內(nèi)部添加日志打印傳入的參數(shù)。3. 考慮使用更簡單的參數(shù)類型或檢查模型返回的 JSON。流式響應(yīng)不工作或響應(yīng)慢網(wǎng)絡(luò)問題或未配置流式處理。1. Harness 的agent.run()可能默認(rèn)是非流式。查看文檔是否有streamTrue參數(shù)。2. 對(duì)于流式響應(yīng)需要使用async for循環(huán)來消費(fèi)。3. 檢查網(wǎng)絡(luò)連接和 API 服務(wù)狀態(tài)。插件生命周期方法未執(zhí)行未正確啟動(dòng)/停止 Runtime。1. 確保在主要邏輯前后調(diào)用了await runtime.start()和await runtime.stop()。2. 確認(rèn)on_start和on_stop是async方法。調(diào)試建議在開發(fā)初期可以在關(guān)鍵位置添加打印語句或者使用logging模塊。重點(diǎn)關(guān)注Agent 創(chuàng)建時(shí)插件和工具是否成功加載。模型請(qǐng)求的完整 payload需在框架層或模型客戶端開啟 debug。模型返回的原始響應(yīng)特別是是否包含tool_calls。7. 生產(chǎn)環(huán)境最佳實(shí)踐與擴(kuò)展方向?qū)⑦@樣一個(gè)“寵物插件”從玩具變?yōu)樯a(chǎn)可用的組件還需要考慮更多。7.1 安全與權(quán)限API Key 管理絕對(duì)不要將密鑰提交到代碼倉庫。使用.env開發(fā)或 Kubernetes Secrets、AWS Secrets Manager生產(chǎn)等方案。工具權(quán)限控制不是所有工具都應(yīng)無條件暴露。例如如果工具能執(zhí)行文件刪除或網(wǎng)絡(luò)請(qǐng)求需要根據(jù)用戶身份進(jìn)行鑒權(quán)??梢栽诠ぞ吆瘮?shù)內(nèi)部或 Plugin 層面添加權(quán)限檢查邏輯。輸入輸出過濾對(duì)用戶輸入和模型輸出進(jìn)行必要的清洗和過濾防止注入攻擊或不當(dāng)內(nèi)容。7.2 可觀測(cè)性與監(jiān)控日志記錄結(jié)構(gòu)化記錄所有模型調(diào)用、工具調(diào)用、耗時(shí)和令牌使用量。這有助于分析成本、性能和排查問題。錯(cuò)誤處理與重試網(wǎng)絡(luò)請(qǐng)求可能失敗。在生產(chǎn)代碼中應(yīng)對(duì)模型 API 調(diào)用和工具執(zhí)行添加健壯的錯(cuò)誤處理如重試、降級(jí)策略。令牌計(jì)數(shù)與成本控制監(jiān)控每次交互的輸入/輸出令牌數(shù)設(shè)置預(yù)算告警。Harness 框架可能提供相關(guān)的鉤子或中間件來統(tǒng)計(jì)這些信息。7.3 性能與擴(kuò)展性異步處理確保整個(gè)調(diào)用鏈IO 操作、網(wǎng)絡(luò)請(qǐng)求是異步的以避免阻塞。插件熱加載設(shè)計(jì)插件系統(tǒng)使其支持熱加載無需重啟服務(wù)即可更新工具。狀態(tài)持久化示例中的pet_memory是內(nèi)存字典服務(wù)重啟后數(shù)據(jù)丟失。應(yīng)替換為數(shù)據(jù)庫如 SQLite、Redis、PostgreSQL進(jìn)行持久化。7.4 擴(kuò)展“寵物”能力我們的插件可以輕松擴(kuò)展增加新工具在tools.py中定義新函數(shù)并tool裝飾然后在PetPlugin的__init__中注冊(cè)即可。例如增加fetch_weather(city: str)工具來獲取真實(shí)天氣。集成外部服務(wù)工具函數(shù)可以調(diào)用任何外部 API、數(shù)據(jù)庫或內(nèi)部服務(wù)讓寵物的能力無限擴(kuò)展。多模態(tài)支持如果 DeepSeek 模型支持圖像輸入可以增加處理圖片的工具讓寵物能“看”圖說話。Agent 協(xié)作可以創(chuàng)建多個(gè)具有不同專長的 Agent如一個(gè)負(fù)責(zé)娛樂一個(gè)負(fù)責(zé)學(xué)習(xí)輔導(dǎo)并通過 Harness 的 Runtime 讓它們協(xié)同工作。通過 DeepSeek Harness 框架集成 AI 模型從一項(xiàng)繁瑣的底層編碼工作變成了定義工具、編寫業(yè)務(wù)邏輯和配置 Agent 的高級(jí)抽象工作。它有效地將開發(fā)者從復(fù)雜的交互協(xié)議中解放出來讓你能更專注于創(chuàng)造有價(jià)值的 AI 應(yīng)用功能。當(dāng)你需要將“大肥魚”這樣的 AI 能力嵌入到網(wǎng)站、聊天機(jī)器人或內(nèi)部系統(tǒng)時(shí)基于 Harness 構(gòu)建的插件化架構(gòu)將提供清晰的路徑和堅(jiān)實(shí)的工程基礎(chǔ)。