字典操作优化¶
本文档解释了 Instructor 中实现的字典操作优化。
概述¶
字典操作是 Instructor 代码库中最常见的操作之一,尤其是在处理不同 LLM 提供者之间的消息传递和管理配置参数时。优化这些操作可以带来显著的性能提升,特别是在高吞吐量应用中。
优化区域¶
消息提取¶
`retry.py` 中的 `extract_messages` 函数经过优化,使用直接键查找而非嵌套的 `get()` 调用,这减少了函数调用的开销并提升了性能。
之前
from typing import Any
def extract_messages(kwargs: dict[str, Any]) -> Any:
return kwargs.get(
"messages", kwargs.get("contents", kwargs.get("chat_history", []))
)
之后
from typing import Any
def extract_messages(kwargs: dict[str, Any]) -> Any:
if "messages" in kwargs:
return kwargs["messages"]
if "contents" in kwargs:
return kwargs["contents"]
if "chat_history" in kwargs:
return kwargs["chat_history"]
return []
重试函数¶
重试函数(retry_sync
和 retry_async
)经过优化以实现:1. 预先提取常用变量以避免重复的字典查找 2. 使用优化的 extract_messages
函数而非嵌套的 get 操作 3. 减少错误处理中冗余的字典操作
消息处理程序选择¶
`reask.py` 中的 `handle_reask_kwargs` 函数经过优化,使用直接条件检查而非创建大型映射字典,这减少了内存开销并提升了查找性能。
之前
def handle_reask_kwargs(kwargs, mode, response, exception):
kwargs = kwargs.copy()
functions = {
Mode.ANTHROPIC_TOOLS: reask_anthropic_tools,
Mode.ANTHROPIC_JSON: reask_anthropic_json,
# ... many more mappings
}
reask_function = functions.get(mode, reask_default)
return reask_function(kwargs=kwargs, response=response, exception=exception)
之后
def handle_reask_kwargs(kwargs, mode, response, exception):
kwargs_copy = kwargs.copy()
if mode in {Mode.ANTHROPIC_TOOLS, Mode.ANTHROPIC_REASONING_TOOLS}:
return reask_anthropic_tools(kwargs_copy, response, exception)
elif mode == Mode.ANTHROPIC_JSON:
return reask_anthropic_json(kwargs_copy, response, exception)
# ... optimized conditional checks with grouped modes
else:
return reask_default(kwargs_copy, response, exception)
系统消息处理¶
`utils.py` 中的 `combine_system_messages` 函数经过优化以实现:1. 缓存类型检查以避免重复调用 2. 使用更高效的列表操作以避免创建中间列表 3. 优化类型转换场景
基准测试¶
基准测试显示字典操作性能有显著提升
操作 | 之前 (毫秒) | 之后 (毫秒) | 提升 |
---|---|---|---|
extract_messages | ~0.08 | ~0.03 | ~62% |
handle_reask_kwargs | ~0.09 | ~0.05 | ~44% |
combine_system_messages | ~0.12 | ~0.07 | ~42% |
具体的提升取决于特定的用例和数据模式。
测试¶
创建了两种类型的测试以确保优化是安全的
- 验证测试 - 确保优化后的函数返回与之前相同的结果
- 基准测试 - 衡量并验证性能提升
这些测试有助于确保优化在不改变行为的情况下提升性能。
结论¶
字典操作优化是提高 Instructor 效率的关键部分,特别对于高吞吐量应用而言。通过仔细优化这些常见操作,我们可以在不改变库的 API 或行为的情况下提升性能。