Llama 3.2 是否支持函数调用?一份实用指南

Llama 3.2 是否支持函数调用?一份实用指南

关键亮点

是或否: Llama 3.2 3B 模型是一个轻量但功能强大的语言模型,** 支持函数调用**。

它能做什么: 函数调用允许模型与外部工具和 API 交互,从而扩展其超出基本文本生成的能力。

如何实现? 通过 Novita AI 的 “LLM Playground” 安装 API,然后使用 Langchain 框架实现。

在当前人工智能领域,许多人在积极讨论 Llama 3.2 3B 模型是否能实现函数调用能力。大量用户和开发者在论坛和社交媒体上分享他们使用 Llama 3.2 3B 进行函数调用的经验。一些用户报告在使用模型进行工具调用时取得了良好效果,成功率约为 80%。然而,也有用户反映在某些情况下模型可能误解上下文,导致函数调用不准确或失败。今天,我们将深入探讨 Llama 3.2 的函数调用特性。

Llama 3.2 是否支持函数调用?

是的!

Llama 3.2 模型(包括 3B 变体)支持函数调用。该能力使模型能够检测何时需要调用函数,并输出包含参数的 JSON 来调用该函数。这一功能是 Llama 3.2 系列的关键特性,模型针对它进行了微调。Llama 3.2 3B 模型因其轻量化设计特别适合设备端应用,同时仍然支持函数调用等强大功能。

llama3.2 functioncalling

什么是函数调用?

函数调用是一种使 LLM 能够 与外部系统、API 和工具交互 的方法。通过为 LLM 配备一组函数或工具,以及如何使用它们的详细信息,模型可以智能地选择并执行适当的函数来完成特定任务。这种能力将 LLM 的功能扩展到基本文本生成之外,使其能够执行操作、控制设备和访问数据库。

支持函数调用的模型

现在许多 LLM 和平台都支持函数调用。您可以通过 Novita AI 的 “LLM Playground” 页面安装 API,并通过 langchain 实现函数调用。

  • Llama 3.3: 700 亿参数版本在函数调用测试中表现强劲,能根据用户请求成功识别何时调用以及调用哪些函数。
  • Mistral: 如 Mistral-Large-2 等模型在 watsonx.ai 等环境中展示了成功的函数调用能力。
  • Gemini: Google 的 Gemini 模型也支持函数调用,并提供多种使用示例。

如果您想了解更多信息,可以查看这个网站!

the camparsion of different model about function calling

来源:Berkeley Function-Calling Leaderboard

函数调用是如何工作的?

函数调用通常包含两个步骤:

  1. 将用户提示映射 到正确的函数和输入参数。LLM 评估是否有任何可用工具与用户的查询相关。
  2. 处理函数的输出 以生成最终连贯的响应。如果适用,LLM 会构建一个格式化的请求来调用工具。
    • 然后分析工具的输出并将其整合到最终响应中。

函数调用的实际应用

使用 Llama 3.2 3B 模型进行函数调用有众多现实世界应用:

  • 客户支持聊天机器人:自动化需要计算或信息查找的响应。
  • 数据处理:与后端系统交互以获取或更新数据。
  • 虚拟助手:通过使助手能够执行调度或计算等操作来改善用户交互。
  • API 交互:将自然语言转换为 API 调用。
  • 数据库查询:创建将自然语言转换为有效数据库查询的应用程序。
  • 智能家居控制:通过使用自然语言命令设置温度或切换灯光来控制智能家居设备。
  • 对话式知识检索引擎:与知识库交互。
  • 电子商务平台:基于库存数据库提供实时产品建议、跟踪订单或管理客户支持工单。
  • 医疗保健:安排预约或检索患者信息。
  • 旅行:检索航班信息、预订或管理预订。
  • 金融:提供最新的账户余额和处理交易。

如何通过 Novita AI 使用 Llama 3.2 3B 函数调用

步骤 1:获取 API 密钥

进入 “Keys” 页面,您可以复制如图所示的 API 密钥

get api key

注册后,Novita AI 会提供 $0.5 的赠金让您开始使用!

如果免费赠金用完,您可以付费继续使用。

步骤 2:使用 Langchain 实现函数调用

我们将创建一个简单的数学应用程序,可以执行加法和乘法运算。

💡 虽然本指南为了便捷性使用了 LangChain,但实现函数调用并不需要任何特定的框架。关键在于设计合适的提示词,使模型理解并正确调用函数。这里使用 LangChain 只是为了简化实现过程。

前提条件

首先,安装所需的包:

pip install langchain-openai python-dotenv

设置环境

在项目根目录创建一个 .env 文件,并添加您的 Novita AI API 密钥:

NOVITA_API_KEY=your_api_key_here

实现步骤

1. 定义工具

首先,使用 LangChain 的 @tool 装饰器创建两个简单的数学工具:

from langchain_core.tools import tool

@tool
def multiply(x: float, y: float) -> float:
    """Multiply two numbers together."""
    return x * y

@tool
def add(x: int, y: int) -> int:
    """Add two numbers."""
    return x + y

tools = [multiply, add]

2. 创建工具执行函数

接下来,实现一个执行工具的函数:

from typing import Any, Dict, Optional, TypedDict
from langchain_core.runnables import RunnableConfig

class ToolCallRequest(TypedDict):
    name: str
    arguments: Dict[str, Any]

def invoke_tool(
    tool_call_request: ToolCallRequest, 
    config: Optional[RunnableConfig] = None
):
    """Execute the specified tool with given arguments."""
    tool_name_to_tool = {tool.name: tool for tool in tools}
    name = tool_call_request["name"]
    requested_tool = tool_name_to_tool[name]
    return requested_tool.invoke(tool_call_request["arguments"], config=config)

3. 设置 LangChain 管道

创建一个使用 Novita AI 的 LLM 来选择和准备工具调用的链:

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import render_text_description

def create_chain():
    """Create a chain that uses the specified LLM model to select and prepare tool calls."""
    model = ChatOpenAI(
        model="meta-llama/llama-3.3-70b-instruct",
        api_key=os.getenv("NOVITA_API_KEY"),
        base_url="https://api.novita.ai/v3/openai",
    )
    
    rendered_tools = render_text_description(tools)
    system_prompt = f"""\
    You are an assistant that has access to the following set of tools. 
    Here are the names and descriptions for each tool:

    {rendered_tools}

    Given the user input, return the name and input of the tool to use. 
    Return your response as a JSON blob with 'name' and 'arguments' keys.

    The `arguments` should be a dictionary, with keys corresponding 
    to the argument names and the values corresponding to the requested values.
    """

    prompt = ChatPromptTemplate.from_messages(
        [("system", system_prompt), ("user", "{input}")]
    )

    return prompt | model | JsonOutputParser()

4. 创建主处理函数

实现处理数学查询的主函数:

def process_math_query(query: str):
    """Process a mathematical query by using an LLM to select the appropriate tool and execute it."""
    chain = create_chain()
    message = chain.invoke({"input": query})
    result = invoke_tool(message, config=None)
    return message, result

5. 使用示例

以下是如何使用该实现的示例:

if __name__ == "__main__":
    message, result = process_math_query(
        "meta-llama/llama-3.2-3b-instruct", 
        "what's 3 plus 1132"
    )
    print(result)  # Output: 1135

常见问题与故障排除

函数调用中遇到的常见问题包括:

  • 函数调用错误:模型可能误解上下文,导致调用错误的函数。
  • 高延迟:响应缓慢,可能影响用户体验。
  • 无法识别的函数:模型可能无法识别有效的函数名称或参数,导致运行时错误。
  • 模型幻觉:模型可能生成错误的输出或参数,导致意外行为。
  • 参数传递不一致:参数可能以意外格式传递,导致函数执行期间出错。
  • 网络问题:外部 API 依赖可能会引入延迟或失败,如果网络连接不稳定。
  • 解析失败:模型的输出可能不符合预期格式(例如无效 JSON),导致解析错误。

优化函数调用的最佳实践

为了优化函数调用:

  • 解决函数调用错误:微调模型针对与函数调用相关的特定提示,增强上下文理解,减少函数调用中的错误。
  • 缓解高延迟:通过减少提示中的 token 数量或实现异步函数调用来优化响应时间,以提升性能。
  • 解决无法识别的函数:在调用函数之前验证函数名称和参数,确保它们被正确识别,从而防止运行时错误。
  • 管理模型幻觉:实施谨慎的错误处理策略来处理模型生成的不正确输出或参数,确保为意外结果提供回退机制。
  • 确保参数传递一致:为参数格式建立明确的指引,并执行严格的验证检查,以实现在函数执行过程中参数传递的一致性。
  • 处理网络问题:为与外部 API 交互时的网络相关问题开发稳健的错误处理策略,包括针对瞬时故障的重试机制。
  • 防止解析失败:利用输出验证技术确保模型输出符合预期格式(例如有效 JSON),并对解析错误实施错误处理以保持系统稳定性。

总之,函数调用能力代表了大型语言模型功能方面的重大进步,使它们能够有效地与外部工具和 API 交互。尽管存在常见挑战,如函数调用错误、高延迟、无法识别的函数和模型幻觉,但实施最佳实践和稳健的错误处理可以增强其可靠性和性能。随着开发者继续探索和完善这一特性,其在各个领域的潜在应用很可能会扩展,使 Llama 3.2 成为处理现实世界任务的多功能工具。

常见问题

为什么函数调用对 AI Agent 至关重要?

它使 AI Agent 能够自主执行需要外部数据或操作的任务,在动态环境中提高效率。

函数调用如何提升 LLM 性能?

它通过允许实时数据检索、任务执行以及通过外部工具做出明智决策来提高准确性。

Novita AI 是一个一体化云平台,助力您的 AI 雄心。集成 API、无服务器、GPU 实例 —— 你所需的低成本高效工具。无需基础设施,免费开始,让您的 AI 愿景成为现实。

推荐阅读