litellm函数调用支持:结构化输出与工具使用

【免费下载链接】litellm Call all LLM APIs using the OpenAI format. Use Bedrock, Azure, OpenAI, Cohere, Anthropic, Ollama, Sagemaker, HuggingFace, Replicate (100+ LLMs) 【免费下载链接】litellm 项目地址: https://gitcode.com/GitHub_Trending/li/litellm

你是否还在为不同大语言模型(LLM)的API调用格式不统一而烦恼?是否希望用一种标准化的方式实现函数调用和工具集成?本文将详细介绍如何使用litellm实现跨平台的函数调用,通过结构化输出轻松连接LLM与外部工具,解决多模型兼容难题。读完本文,你将掌握litellm函数调用的核心流程、参数配置和实际应用技巧,让LLM应用开发效率提升300%。

函数调用基础架构

litellm作为统一的LLM调用接口,其函数调用功能建立在OpenAI API规范基础上,同时兼容超过100种不同的LLM模型。核心实现位于litellm/types/completion.py中,定义了从消息结构到工具调用的完整类型系统。

核心数据结构

# 函数调用定义示例 [litellm/types/completion.py](https://link.gitcode.com/i/e097cbf6b4cfe74ca984742098d984cd)
class FunctionCall(TypedDict, total=False):
    arguments: Required[str]  # JSON格式的函数参数
    name: Required[str]       # 函数名称

class ChatCompletionAssistantMessageParam(TypedDict, total=False):
    role: Required[Literal["assistant"]]
    content: Optional[str]
    tool_calls: Iterable[ChatCompletionMessageToolCallParam]  # 工具调用列表

上述类型定义确保了不同LLM返回的函数调用结果能够被统一解析。通过标准化的FunctionCall结构,开发者无需关心底层模型差异,可直接提取函数名称和参数。

调用流程概览

litellm函数调用遵循"请求-决策-执行-反馈"四步循环:

mermaid

这一流程通过litellm/completion.py中的核心逻辑实现,自动处理不同模型的差异转换,让开发者专注于业务逻辑而非模型适配。

快速上手:天气查询示例

让我们通过一个获取天气信息的实例,快速掌握litellm函数调用的基本用法。完整示例代码可参考cookbooks/liteLLM_function_calling.ipynb

环境准备

首先安装litellm并配置API密钥:

pip install litellm
export OPENAI_API_KEY="your_api_key"  # 支持Azure、Anthropic等多种API密钥

定义函数与消息

import os
from litellm import completion

# 用户消息
messages = [{"role": "user", "content": "What is the weather like in Boston?"}]

# 定义天气查询函数
def get_current_weather(location):
    """获取指定地点的当前天气"""
    if location == "Boston, MA":
        return "The weather is 12F"

# 函数描述(符合OpenAPI规范)
functions = [
    {
        "name": "get_current_weather",
        "description": "Get the current weather in a given location",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state, e.g. San Francisco, CA"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"]
                }
            },
            "required": ["location"]
        }
    }
]

执行函数调用

# 调用GPT-3.5 Turbo进行决策
response = completion(
    model="gpt-3.5-turbo-0613",
    messages=messages,
    functions=functions
)
print(response)

返回结果将包含模型决策的函数调用信息:

{
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": null,
        "function_call": {
          "name": "get_current_weather",
          "arguments": "{\"location\": \"Boston, MA\"}"
        }
      },
      "finish_reason": "function_call"
    }
  ]
}

解析与执行

提取函数调用信息并执行相应函数:

import json

# 解析函数调用参数
function_call = response["choices"][0]["message"]["function_call"]
function_name = function_call["name"]
function_args = json.loads(function_call["arguments"])

# 执行函数
if function_name == "get_current_weather":
    result = get_current_weather(**function_args)
    print(result)  # 输出: The weather is 12F

生成最终回答

将函数执行结果反馈给模型,生成自然语言回答:

# 添加函数调用结果到对话历史
messages.append({
    "role": "assistant", 
    "content": None, 
    "function_call": function_call
})
messages.append({
    "role": "function", 
    "name": function_name, 
    "content": result
})

# 获取最终回答
final_response = completion(model="gpt-3.5-turbo-0613", messages=messages, functions=functions)
print(final_response["choices"][0]["message"]["content"])
# 输出: The current weather in Boston is 12 degrees Fahrenheit.

通过以上步骤,我们完成了一个完整的函数调用流程。这个示例展示了litellm如何简化跨模型的函数调用实现,使开发者能够轻松连接LLM与外部工具。

高级特性与最佳实践

litellm提供了丰富的高级特性,帮助开发者构建更健壮、高效的函数调用系统。这些功能通过litellm/router_utils/中的工具类实现,支持复杂场景下的函数调度和错误处理。

多模型兼容策略

litellm支持自动适配不同模型的函数调用格式。例如,Anthropic Claude使用<functioncall>标签,而OpenAI模型使用JSON结构。litellm会自动处理这些差异,确保统一的调用体验:

# 调用Anthropic Claude进行函数调用
response = completion(
    model="claude-2",
    messages=messages,
    functions=functions,
    anthropic_api_key=os.environ["ANTHROPIC_API_KEY"]
)

错误处理与重试机制

网络波动或函数执行失败时,litellm的重试机制可确保调用可靠性。通过litellm/router_utils/handle_error.py中的错误处理逻辑,可自定义重试策略:

from litellm.router_utils.handle_error import handle_llm_error

try:
    response = completion(model="gpt-3.5-turbo", messages=messages, functions=functions)
except Exception as e:
    # 自动重试或降级到其他模型
    response = handle_llm_error(e, model="claude-2", messages=messages, functions=functions)

函数调用缓存

对于频繁调用相同参数的函数,可启用缓存提高性能。litellm提供了基于Redis的分布式缓存实现,位于litellm/caching/

response = completion(
    model="gpt-3.5-turbo",
    messages=messages,
    functions=functions,
    cache=True,  # 启用缓存
    cache_ttl=3600  # 缓存有效期1小时
)

异步函数调用

对于I/O密集型任务,litellm的异步接口可显著提高并发性能。通过litellm/async_completion.py支持异步函数调用:

import asyncio
from litellm import async_completion

async def async_function_call():
    response = await async_completion(
        model="gpt-3.5-turbo",
        messages=messages,
        functions=functions
    )
    return response

loop = asyncio.get_event_loop()
response = loop.run_until_complete(async_function_call())

实际应用场景

litellm函数调用已在多个领域得到应用,从数据分析到自动化工作流,展现出强大的灵活性和扩展性。以下是几个典型应用场景:

数据分析自动化

通过函数调用连接Python数据分析库,让LLM能够直接操作数据:

def analyze_sales_data(start_date, end_date):
    """分析指定日期范围内的销售数据"""
    df = pd.read_csv("sales_data.csv")
    mask = (df["date"] >= start_date) & (df["date"] <= end_date)
    return df[mask].describe().to_json()

# 函数描述配置
functions = [{
    "name": "analyze_sales_data",
    "description": "Analyze sales data between two dates",
    "parameters": {
        "type": "object",
        "properties": {
            "start_date": {"type": "string", "format": "date"},
            "end_date": {"type": "string", "format": "date"}
        },
        "required": ["start_date", "end_date"]
    }
}]

智能工作流集成

结合任务调度工具,实现复杂业务流程的自动化:

def create_calendar_event(title, start_time, end_time, attendees):
    """创建日历事件并邀请参与者"""
    # 调用Google Calendar API或Outlook API
    pass

def send_email(to, subject, body):
    """发送电子邮件"""
    # 调用SMTP服务或Email API
    pass

# 多函数组合使用
functions = [create_calendar_event_schema, send_email_schema]

实时信息检索

连接搜索引擎或数据库,为LLM提供实时数据支持:

def search_news(keyword, date):
    """搜索指定日期的新闻"""
    # 调用新闻API获取最新信息
    pass

# 结合定时任务实现信息监控

常见问题与解决方案

在使用litellm函数调用过程中,开发者可能会遇到各种挑战。以下是一些常见问题的解决方案,更多最佳实践可参考CONTRIBUTING.md

参数解析错误

问题:模型返回的JSON参数格式不正确,导致解析失败。

解决方案:使用try-except块捕获解析错误,并添加参数验证:

try:
    function_args = json.loads(function_call["arguments"])
except json.JSONDecodeError:
    # 处理JSON解析错误
    function_args = {}
    # 可选:请求模型重新生成参数

# 参数验证
required_params = ["location"]
if not all(param in function_args for param in required_params):
    # 请求模型补充缺失参数

函数调用死循环

问题:模型反复调用相同函数,无法生成最终回答。

解决方案:设置最大调用次数限制,并优化系统提示:

MAX_FUNCTION_CALLS = 5
call_count = 0

while call_count < MAX_FUNCTION_CALLS:
    response = completion(model=model, messages=messages, functions=functions)
    if response["choices"][0]["finish_reason"] == "function_call":
        call_count += 1
        # 执行函数并更新消息...
    else:
        break  # 退出循环,返回结果

性能优化建议

  • 批处理请求:使用litellm/batch_completion/批量处理函数调用请求
  • 模型选择策略:简单函数调用使用轻量级模型(如gpt-3.5-turbo),复杂逻辑使用更强大模型
  • 本地缓存热点数据:减少重复函数调用,提高响应速度

总结与展望

litellm函数调用功能为LLM应用开发提供了强大支持,通过统一的API接口和丰富的工具集,显著降低了多模型函数调用的实现难度。无论是简单的工具集成还是复杂的工作流自动化,litellm都能提供一致、高效的开发体验。

随着LLM技术的不断发展,litellm将持续优化函数调用能力,未来计划支持:

  • 更智能的函数选择机制
  • 多轮函数调用的自动规划
  • 函数调用的可视化调试工具

如果你在使用过程中遇到问题或有功能建议,欢迎通过GitHub Issues参与贡献。点赞收藏本文,关注项目更新,第一时间获取litellm新功能教程!

【免费下载链接】litellm Call all LLM APIs using the OpenAI format. Use Bedrock, Azure, OpenAI, Cohere, Anthropic, Ollama, Sagemaker, HuggingFace, Replicate (100+ LLMs) 【免费下载链接】litellm 项目地址: https://gitcode.com/GitHub_Trending/li/litellm

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐