资源感知优化使智能体能够在运行过程中动态监测和管理计算、时间和财务等资源。这不同于仅关注行动序列的简单规划。资源感知优化要求智能体就行动执行做出决策,以在指定的资源预算内实现目标或优化效率。这涉及在更准确但昂贵的模型与更快速、低成本的模型之间进行选择,或决定是分配更多算力以获得更精细的响应,还是返回更快速但细节较少的答案。
例如,考虑一个为金融分析师分析大型数据集的智能体。如果分析师需要立刻得到初步报告,智能体可能会使用更快、更经济的模型来快速总结关键趋势。然而,如果分析师需要为关键投资决策提供高度准确的预测,且拥有更大的预算和更充裕的时间,智能体就会分配更多资源,使用更强大、更慢但更精确的预测模型。该类别中的一个关键策略是回退机制,当首选模型因过载或限流而不可用时,它充当保护措施。为确保优雅降级,系统会自动切换到默认或更经济的模型,从而维持服务连续性,而不是完全失败。
实际应用与使用场景
- 成本优化的 LLM 使用: 智能体根据预算约束,决定在复杂任务中使用大型且昂贵的 LLM,或在简单查询中使用更小、更实惠的模型。
- 对延迟敏感的操作: 在实时系统中,智能体选择更快但可能不那么全面的推理路径,以确保及时响应。
- 能效优化: 对于部署在边缘设备或电力受限的智能体,优化其处理以节省电池电量。
- 为了服务可靠性的回退: 当主要选择不可用时,智能体自动切换到备用模型,确保服务连续性和优雅降级。
- 数据使用管理: 智能体选择摘要式数据检索,而非下载完整数据集,以节省带宽或存储空间。
- 自适应任务分配: 在多智能体系统中,智能体会根据其当前的计算负载或可用时间自行分配任务。
实战代码示例
一个用于回答用户问题的智能系统可以评估每个问题的难度。
- 对于简单查询,它使用具成本效益的语言模型,如 Gemini Flash。
- 对于复杂问题,则考虑使用更强大但更昂贵的语言模型(例如 Gemini Pro)。 是否使用更强大的模型还取决于资源可用性,尤其是预算和时间限制。该系统会动态选择合适的模型。
例如,考虑一个使用分层智能体构建的旅行规划器。高层规划涉及理解用户的复杂请求,将其拆分为多步骤行程,并进行逻辑决策,这部分将由像 Gemini Pro 这样复杂而更强大的 LLM 管理。这是需要深度理解上下文和推理能力的“规划者”智能体。
然而,一旦计划确定,计划中的各个子任务(如查询机票价格、检查酒店可订性或查找餐馆评价)本质上都是简单、重复的网页查询。这些“工具函数调用”可以由更快且更实惠的模型(如 Gemini Flash)来执行。更容易想象为何在这些直接的网页搜索中可以使用更实惠的模型,而复杂的规划阶段则需要更先进模型的更高智能,以确保旅行计划连贯且合乎逻辑。
Google 的 ADK 通过其多智能体架构支持这种方法,使应用具备模块化与可扩展性。不同智能体可以处理专门化任务。模型的灵活性能够直接使用多种 Gemini 模型,包括 Gemini Pro 和 Gemini Flash,或通过 LiteLLM 集成其他模型。ADK 的编排能力支持基于 LLM 的动态路由,实现自适应行为。内置评估功能允许系统化评估智能体性能,可用于系统优化(参见“评估与监控”章节)。
接下来,将定义两个设置相同但使用不同模型与成本的智能体。
# Conceptual Python-like structure, not runnable code
from google.adk.agents import Agent
# from google.adk.models.lite_llm import LiteLlm # If using models not directly supported by ADK's default Agent
# Agent using the more expensive Gemini Pro 2.5
gemini_pro_agent = Agent(
name="GeminiProAgent",
model="gemini-2.5-pro", # Placeholder for actual model name if different
description="A highly capable agent for complex queries.",
instruction="You are an expert assistant for complex problem-solving."
)
# Agent using the less expensive Gemini Flash 2.5
gemini_flash_agent = Agent(
name="GeminiFlashAgent",
model="gemini-2.5-flash", # Placeholder for actual model name if different
description="A fast and efficient agent for simple queries.",
instruction="You are a quick assistant for straightforward questions."
)
一个路由智能体可以基于简单指标(如查询长度)来引导请求:较短的查询发送到更便宜的模型,较长的查询发送到更强大的模型。然而,更复杂的路由智能体可以利用 LLM 或 ML 模型来分析查询的细微差别与复杂度。这个 LLM 路由器可以判断哪个下游语言模型最合适。例如,请求事实回忆的查询会路由到 Flash 模型,而需要深度分析的复杂查询会路由到 Pro 模型。
优化技术可以进一步提升 LLM 路由器的效果。提示调优通过精心设计提示来引导路由器 LLM 做出更佳的路由决策。在包含查询与其最优模型选择的数据集上微调该 LLM 路由器,可提高其准确性与效率。这种动态路由能力在响应质量与成本效益之间取得平衡。
# Conceptual Python-like structure, not runnable code
from google.adk.agents import Agent, BaseAgent
from google.adk.events import Event
from google.adk.agents.invocation_context import InvocationContext
import asyncio
class QueryRouterAgent(BaseAgent):
name: str = "QueryRouter"
description: str = "Routes user queries to the appropriate LLM agent based on complexity."
async def _run_async_impl(self, context: InvocationContext) -> AsyncGenerator[Event, None]:
user_query = context.current_message.text # Assuming text input
query_length = len(user_query.split()) # Simple metric: number of words
if query_length < 20: # Example threshold for simplicity vs. complexity
print(f"Routing to Gemini Flash Agent for short query (length: {query_length})")
# In a real ADK setup, you would 'transfer_to_agent' or directly invoke
# For demonstration, we'll simulate a call and yield its response
response = await gemini_flash_agent.run_async(context.current_message)
yield Event(author=self.name, content=f"Flash Agent processed: {response}")
else:
print(f"Routing to Gemini Pro Agent for long query (length: {query_length})")
response = await gemini_pro_agent.run_async(context.current_message)
yield Event(author=self.name, content=f"Pro Agent processed: {response}")
审查智能体会评估语言模型的回答,并提供反馈,发挥多重作用。对于自我纠错,它识别错误或不一致之处,促使回答智能体优化输出以提升质量。它还会系统地评估回答以进行性能监控,追踪准确性、相关性等指标,用于优化。
此外,其反馈还可用于触发强化学习或微调;例如,持续识别出 Flash 模型的回答不足时,可优化路由智能体的逻辑。虽然不直接管理预算,批评智能体通过识别次优路由选择(如将简单查询导向 Pro 模型或将复杂查询导向 Flash 模型而导致糟糕结果)来间接贡献于预算管理。这些信息会指导调整,从而改善资源分配并节省成本。
审查智能体可以配置为仅审查回答智能体生成的文本,或同时审查原始查询与生成文本,从而全面评估回答与初始问题的一致性。
CRITIC_SYSTEM_PROMPT = """
You are the **Critic Agent**, serving as the quality assurance arm of our collaborative research assistant system. Your primary function is to **meticulously review and challenge** information from the Researcher Agent, guaranteeing **accuracy, completeness, and unbiased presentation**.
Your duties encompass:
* **Assessing research findings** for factual correctness, thoroughness, and potential leanings.
* **Identifying any missing data** or inconsistencies in reasoning.
* **Raising critical questions** that could refine or expand the current understanding.
* **Offering constructive suggestions** for enhancement or exploring different angles.
* **Validating that the final output is comprehensive** and balanced.
All criticism must be constructive. Your goal is to fortify the research, not invalidate it. Structure your feedback clearly, drawing attention to specific points for revision. Your overarching aim is to ensure the final research product meets the highest possible quality standards.
"""
审查智能体基于预定义的系统提示运作,该提示明确其角色、职责与反馈方式。为该智能体精心设计的提示必须清晰确立其作为评估者的职能,指明关键关注领域,并强调提供建设性反馈而非简单否定。提示还应鼓励识别优点与不足,并指导智能体如何组织与呈现其反馈。
实战代码示例(OpenAI)
该系统采用资源感知的优化策略高效处理用户查询。它首先将每个查询归类为三种类别之一,以确定最合适且具性价比的处理路径。此方法避免在简单请求上浪费计算资源,同时确保复杂查询得到必要关注。三种类别为:
- simple:适用于可直接回答、无需复杂推理或外部数据的简单问题。
- reasoning:适用于需要逻辑推断或多步思考过程的查询,将其路由至更强大的模型。
- internet_search:适用于需要最新信息的问题,会自动触发 Google 搜索以提供最新答案。
代码采用 MIT 许可协议,并在 Github 上开源:(github.com/mahtabsyed/…
# MIT License
# Copyright (c) 2025 Mahtab Syed
# https://www.linkedin.com/in/mahtabsyed/
import os
import requests
import json
from dotenv import load_dotenv
from openai import OpenAI
# Load environment variables
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
GOOGLE_CUSTOM_SEARCH_API_KEY = os.getenv("GOOGLE_CUSTOM_SEARCH_API_KEY")
GOOGLE_CSE_ID = os.getenv("GOOGLE_CSE_ID")
if not OPENAI_API_KEY or not GOOGLE_CUSTOM_SEARCH_API_KEY or not GOOGLE_CSE_ID:
raise ValueError(
"Please set OPENAI_API_KEY, GOOGLE_CUSTOM_SEARCH_API_KEY, and GOOGLE_CSE_ID in your .env file."
)
client = OpenAI(api_key=OPENAI_API_KEY)
# --- Step 1: Classify the Prompt ---
def classify_prompt(prompt: str) -> dict:
system_message = {
"role": "system",
"content": (
"You are a classifier that analyzes user prompts and returns one of three categories ONLY:\n\n"
"- simple\n"
"- reasoning\n"
"- internet_search\n\n"
"Rules:\n"
"- Use 'simple' for direct factual questions that need no reasoning or current events.\n"
"- Use 'reasoning' for logic, math, or multi-step inference questions.\n"
"- Use 'internet_search' if the prompt refers to current events, recent data, or things not in your training data.\n\n"
"Respond ONLY with JSON like:\n"
'{ "classification": "simple" }'
),
}
user_message = {"role": "user", "content": prompt}
response = client.chat.completions.create(
model="gpt-4o", messages=[system_message, user_message], temperature=1
)
reply = response.choices[0].message.content
return json.loads(reply)
# --- Step 2: Google Search ---
def google_search(query: str, num_results=1) -> list:
url = "https://www.googleapis.com/customsearch/v1"
params = {
"key": GOOGLE_CUSTOM_SEARCH_API_KEY,
"cx": GOOGLE_CSE_ID,
"q": query,
"num": num_results,
}
try:
response = requests.get(url, params=params)
response.raise_for_status()
results = response.json()
if "items" in results and results["items"]:
return [
{
"title": item.get("title"),
"snippet": item.get("snippet"),
"link": item.get("link"),
}
for item in results["items"]
]
else:
return []
except requests.exceptions.RequestException as e:
return {"error": str(e)}
# --- Step 3: Generate Response ---
def generate_response(prompt: str, classification: str, search_results=None) -> str:
if classification == "simple":
model = "gpt-4o-mini"
full_prompt = prompt
elif classification == "reasoning":
model = "o4-mini"
full_prompt = prompt
elif classification == "internet_search":
model = "gpt-4o"
# Convert each search result dict to a readable string
if search_results:
search_context = "\n".join(
[
f"Title: {item.get('title')}\nSnippet: {item.get('snippet')}\nLink: {item.get('link')}"
for item in search_results
]
)
else:
search_context = "No search results found."
full_prompt = f"""Use the following web results to answer the user query:
{search_context}
Query: {prompt}"""
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": full_prompt}],
temperature=1,
)
return response.choices[0].message.content, model
# --- Step 4: Combined Router ---
def handle_prompt(prompt: str) -> dict:
classification_result = classify_prompt(prompt)
# Remove or comment out the next line to avoid duplicate printing
# print("\n🔍 Classification Result:", classification_result)
classification = classification_result["classification"]
search_results = None
if classification == "internet_search":
search_results = google_search(prompt)
# print("\n🔍 Search Results:", search_results)
answer, model = generate_response(prompt, classification, search_results)
return {"classification": classification, "response": answer, "model": model}
test_prompt = "What is the capital of Australia?"
# test_prompt = "Explain the impact of quantum computing on cryptography."
# test_prompt = "When does the Australian Open 2026 start, give me full date?"
result = handle_prompt(test_prompt)
print("🔍 Classification:", result["classification"])
print("🧠 Model Used:", result["model"])
print("🧠 Response:\n", result["response"])
这段 Python 代码实现了一个用于回答用户问题的提示路由系统。它首先从 .env 文件中加载 OpenAI 和 Google 自定义搜索所需的 API 密钥。核心功能在于将用户的提示分类为三类:simple、reasoning 或 internet search。一个专用函数使用 OpenAI 模型执行此分类步骤。如果提示需要当前信息,则通过 Google 自定义搜索 API 执行 Google 搜索。随后,另一个函数根据分类选择合适的 OpenAI 模型生成最终响应。对于 internet search 查询,搜索结果将作为上下文提供给模型。主函数 handle_prompt 协调整个流程,在生成响应前调用分类和(如需)搜索函数。它返回分类结果、所用模型以及生成的答案。该系统高效地将不同类型的查询导向优化的方法,以获得更佳的响应。
实战代码示例(OpenRouter)
OpenRouter 通过单一 API 端点为数百个 AI 模型提供统一接口。它提供自动故障转移与成本优化,并可通过你喜欢的 SDK 或框架轻松集成。
import requests
import json
response = requests.post(
url="https://openrouter.ai/api/v1/chat/completions",
headers={
"Authorization": "Bearer <OPENROUTER_API_KEY>",
"HTTP-Referer": "<YOUR_SITE_URL>", # Optional. Site URL for rankings on openrouter.ai.
"X-Title": "<YOUR_SITE_NAME>", # Optional. Site title for rankings on openrouter.ai.
},
data=json.dumps({
"model": "openai/gpt-4o", # Optional
"messages": [
{
"role": "user",
"content": "What is the meaning of life?"
}
]
})
)
此代码片段使用 requests 库与 OpenRouter API 交互。它向聊天补全端点发送包含用户消息的 POST 请求。请求包含带有 API 密钥的授权头和可选站点信息。目标是从指定的语言模型(此处为“openai/gpt-4o”)获取响应。
Openrouter 提供两种不同的方法来路由并确定用于处理请求的计算模型。
- 自动模型选择: 该功能会将请求路由到从一组精选可用模型中挑选出的优化模型。选择取决于用户提示的具体内容。最终处理请求的模型标识符会在响应的元数据中返回。
{ "model": "openrouter/auto", ... }
- 顺序模型回退: 该机制通过允许用户指定模型的分层列表来提供操作冗余。系统会首先尝试使用序列中指定的主模型处理请求。若主模型因服务不可用、限流或内容过滤等任一错误条件而无法响应,系统将自动将请求重新路由至序列中的下一个模型。该过程将持续,直到列表中的某个模型成功执行请求或列表耗尽。操作的最终成本和响应中返回的模型标识符将对应于成功完成计算的模型。
{ "models": ["anthropic/claude-3.5-sonnet", "gryphe/mythomax-l2-13b"], ... }
OpenRouter 提供详尽的排行榜(openrouter.ai/rankings),按… token 数对可用 AI 模型进行排名。它还提供来自不同提供商(ChatGPT、Gemini、Claude)的最新模型(见图 1)。
图 1:OpenRouter 网站(openrouter.ai/)
超越动态模型切换:智能体的资源优化光谱
资源感知优化对于开发在现实世界约束下高效运行的智能体系统至关重要。下面我们来看一些补充技术:
- 动态模型切换是一项关键技术,涉及根据手头任务的复杂性和可用计算资源,战略性地选择大语言模型。当面对简单查询时,可以部署轻量、具成本效益的 LLM;而复杂、涉及多方面的问题则需要使用更复杂且资源密集的模型。
- 自适应工具使用与选择确保智能体能够从一组工具中智能选择,对每个具体子任务挑选最合适、最高效的工具,并充分考虑 API 使用成本、延迟和执行时间等因素。这种动态工具选择通过优化对外部 API 与服务的使用来提升整体系统效率。
- 上下文裁剪与摘要在管理智能体处理的信息量方面发挥重要作用。通过智能摘要并有选择地仅保留交互历史中最相关的信息,策略性地减少提示令牌数量并降低推理成本,从而避免不必要的计算开销。
- 前瞻性资源预测通过预测未来的工作负载和系统需求来预判资源需求,从而实现资源的前置分配与管理,确保系统响应性并防止瓶颈。
- 成本敏感的探索在多智能体系统中将优化范围扩展到通信成本,除了传统的计算成本之外,还会影响智能体协作与信息共享的策略,目标是最小化整体资源消耗。
- 节能部署专为资源约束严格的环境而设计,旨在尽量降低智能体系统的能耗足迹,延长运行时间并减少总体运行成本。
- 并行化与分布式计算感知利用分布式资源来增强智能体的处理能力与吞吐量,将计算工作负载分布到多台机器或处理器上,以实现更高效率和更快的任务完成。
- 学习型资源分配策略引入学习机制,使智能体能够根据反馈与性能指标随时间进行适应与优化其资源分配策略,通过持续改进来提升效率。
- 优雅降级与回退机制确保智能体系统即使在资源约束严重时也能继续运行,尽管可能以降低的能力进行,通过优雅地降低性能并回退到替代策略来维持运作并提供基本功能。
回顾
是什么(What)
资源感知优化应对的是在智能系统中管理计算、时间和财务资源消耗的挑战。基于 LLM 的应用可能昂贵且缓慢,而为每项任务选择最佳模型或工具往往效率不高。这造成了系统输出质量与生成该输出所需资源之间的基本权衡。缺乏动态管理策略,系统就无法适应不同的任务复杂度或在预算与性能约束内运行。
为什么(Why)
标准化的解决方案是构建一种具备“智能体性”的系统,能够根据手头任务智能监控并分配资源。该模式通常使用“Router Agent”先对传入请求的复杂度进行分类。然后将请求转发给最合适的 LLM 或工具——对简单查询使用快速、低成本的模型,对复杂推理使用更强大的模型。“Critique Agent”还能通过评估响应质量来进一步优化流程,并随着时间推移为路由逻辑提供改进反馈。这种动态的多智能体方法确保系统高效运行,在响应质量与成本效益之间取得平衡。
经验法则(Rule of Thumb)
在以下情况下使用此模式:
- 对 API 调用或算力有严格预算约束时;
- 构建对延迟敏感、需要快速响应的应用;
- 在资源受限的硬件上部署智能体(例如电池寿命有限的边缘设备);
- 以编程方式平衡响应质量与运营成本之间的权衡;以及管理复杂的多步工作流(不同任务的资源需求各不相同)。
图示摘要
关键点
- 资源感知优化至关重要:智能体可以动态管理计算、时间与财务资源。关于模型使用和执行路径的决策基于实时约束与目标做出。
- 可扩展的多智能体架构:Google 的 ADK 提供多智能体框架,支持模块化设计。不同智能体(答复、路由、评估)各司其职。
- 动态、由 LLM 驱动的路由:Router Agent 基于查询复杂度和预算将请求定向到语言模型(简单用 Gemini Flash,复杂用 Gemini Pro)。这能优化成本与性能。
- 评审智能体的功能:专门的评审智能体提供用于自我纠错、性能监控和完善路由逻辑的反馈,增强系统效能。
- 通过反馈与灵活性实现优化:评估能力与模型集成的灵活性有助于形成自适应、自我改进的系统行为。
- 附加的资源感知优化:其他方法包括自适应工具使用与选择、上下文剪枝与摘要、前瞻性资源预测、多智能体系统中的成本敏感探索、能效部署、并行化与分布式计算感知、学习型资源分配策略、优雅降级与回退机制,以及关键任务优先级排序。
总结
资源感知优化对于智能体的开发至关重要,使其能够在真实世界约束下高效运行。通过管理计算、时间和财务资源,智能体可以实现最佳性能与成本效益。诸如动态模型切换、自适应工具使用与上下文剪枝等技术是实现这些效率的关键。包括学习型资源分配策略与优雅降级在内的高级策略,增强了智能体在不同条件下的适应性与韧性。将这些优化原则融入智能体设计,是构建可扩展、稳健且可持续 AI 系统的基础。
参考资料
- Google's Agent Development Kit (ADK): google.github.io/adk-docs/
- Gemini Flash 2.5 & Gemini 2.5 Pro: aistudio.google.com/
- OpenRouter: openrouter.ai/docs/quicks…