跳到内容

字典操作优化

本文档解释了 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_syncretry_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%

具体的提升取决于特定的用例和数据模式。

测试

创建了两种类型的测试以确保优化是安全的

  1. 验证测试 - 确保优化后的函数返回与之前相同的结果
  2. 基准测试 - 衡量并验证性能提升

这些测试有助于确保优化在不改变行为的情况下提升性能。

结论

字典操作优化是提高 Instructor 效率的关键部分,特别对于高吞吐量应用而言。通过仔细优化这些常见操作,我们可以在不改变库的 API 或行为的情况下提升性能。