第7章:在LangChain中如何调用函数Tools (Function Calling)

本文主要阐述了如何通过LangChain框架基于大模型调用业务系统的接口,从而实现搜索增强,真正解决AI与业务系统集成的问题

主要介绍了LangChain4j中工具(Tools)的概念和使用方法。工具允许语言模型(LLM)在生成文本的同时,触发外部操作(如调用API、执行代码等)。

工具(函数调用)

一些语言模型(LLM)不仅可以生成文本,还可以触发操作。

注意: 支持工具的所有LLM可以在这里找到(查看“Tools”列)。

“工具”或“函数调用”的概念允许LLM在必要时调用一个或多个可用工具,这些工具通常由开发者定义。工具可以是任何东西:一个网络搜索、对外部API的调用,或者执行一段特定代码等。LLM本身无法直接调用工具;相反,它们会在响应中表达调用特定工具的意图(而不是以纯文本形式响应)。作为开发者,我们需要执行这个工具,并将工具执行的结果反馈给LLM。

例如,我们知道LLM本身不擅长数学计算。如果你的用例涉及偶尔的数学计算,你可能希望为LLM提供一个“数学工具”。通过在请求中声明一个或多个工具,LLM可以在认为合适的情况下决定调用其中一个工具。给定一个数学问题和一组数学工具,LLM可能会决定为了正确回答问题,它应该首先调用其中一个提供的数学工具。

让我们看看实际中的工作方式(有工具和没有工具的情况):

没有工具的消息交换示例:

请求:
- 消息:
    - UserMessage- 文本:475695037565的平方根是多少?

响应:
- AiMessage- 文本:475695037565的平方根大约是689710

接近,但不正确。
有工具的消息交换示例:

@Tool("计算两个给定数字的和")
double sum(double a, double b) {
   
    return a + b;
}

@Tool("返回给定数字的平方根")
double squareRoot(double x) {
   
    return Math.sqrt(x);
}
请求1- 消息:
    - UserMessage- 文本:475695037565的平方根是多少?
- 工具:
    - sum(double a, double b): 计算两个给定数字的和
    - squareRoot(double x): 返回给定数字的平方根

响应1- AiMessage- toolExecutionRequests:
        - squareRoot(475695037565)


... 在这里,我们执行带有“475695037565”参数的squareRoot方法,并得到“689706.486532”作为结果 ...

请求2- 消息:
    - UserMessage- 文本:475695037565的平方根是多少?
    - AiMessage- toolExecutionRequests:
            - squareRoot(475695037565)
    - ToolExecutionResultMessage- 文本:689706.486532

响应2- AiMessage- 文本:475695037565的平方根是689706.486532

正如你所看到的,当LLM可以访问工具时,它可以在适当的时候决定调用其中一个工具。

这是一个非常强大的功能。在这个简单的例子中,我们为LLM提供了基本的数学工具,但想象一下,如果我们给它提供了googleSearch和sendEmail工具,以及一个查询“我的朋友想了解人工智能领域的最新消息。请将简要总结发送到xxx@email.com”,那么它可以使用googleSearch工具查找最新消息,然后总结并使用sendEmail工具发送总结。

注意: 为了增加LLM调用正确工具及其正确参数的机会,我们应该提供清晰且无歧义的:

  • 工具的名称
  • 工具的功能描述以及何时使用
  • 每个工具参数的描述
    一个好的经验法则是:如果一个人能够理解工具的用途以及如何使用它,那么LLM很可能也能做到。

LLM被特别微调以检测何时调用工具以及如何调用它们。某些模型甚至可以同时调用多个工具,例如OpenAI。

注意: 并非所有模型都支持工具。要查看哪些模型支持工具,请参考此页面的“Tools”列。

注意: 工具/函数调用与JSON模式不是同一件事。

两个抽象层次

LangChain4j提供了两个抽象层次来使用工具:

  • 低级抽象:使用ChatLanguageModel和ToolSpecification API。
  • 高级抽象:使用AI服务和@Tool注解的Java方法。

在低级抽象中,你可以使用ChatLanguageModel的generate(List, List)方法。StreamingChatLanguageModel中也有类似的方法。

  • ToolSpecification是一个包含工具所有信息的对象,包括:
  • 工具的名称(name)
  • 工具的描述(description)
  • 工具的参数及其描述

建议尽可能多地提供工具信息:清晰的名称、全面的描述,以及每个参数的描述等。
创建ToolSpecification有两种方式:
手动创建

ToolSpecification toolSpecification = ToolSpecification.builder()
    .name("getWeather")
    .description("返回指定城市的天气预报")
    .parameters(JsonObjectSchema.builder()
        .addStringProperty("city", "返回天气预报的城市")
        .addEnumProperty("temperatureUnit", 
<think>好的,用户想了解函数调用Function Calling)及其工作原理。首先,我需要明确函数调用的定义,可能涉及编程中的基本概念,比如在程序中调用函数来执行特定任务。但根据提供的引用,特别是引用[3]和[4],用户可能更关注AI大模型中的函数调用机制,比如OpenAI的Function Calling功能。 首先,我应该从基础概念入手,解释函数调用在传统编程中的作用,即通过函数名和参数执行特定操作。然后,过渡到AI领域中的函数调用,这里需要结合引用中的内容,说明大模型如何生成函数参数,但不直接执行函数,而是由外部程序处理。这可能涉及到模型如何解析用户请求,判断是否需要调用函数,并生成正确的参数格式。 需要区分传统函数调用和大模型中的函数调用的不同之处,比如大模型不执行代码,仅提供参数。同时,结合引用中的步骤,如用户输入、模型判断是否需要函数、处理响应、调用外部函数等流程。可能需要用示例来说明,比如天气查询的场景,模型生成参数,开发调用天气API。 另外,要引用提供的资料,比如引用[3]提到的tools参数用于向模型提供函数定义,模型生成符合规范的参数。引用[4]讨论的AI大模型缺陷及函数调用如何补充其逻辑能力,赋予模型执行外部功能的能力。 要注意用户可能混淆传统编程和大模型中的函数调用,需要明确两者的区别和联系。同时,确保解释清晰,结构层次分明,分点说明定义、原理、流程、示例和意义。最后生成相关问题,帮助用户深入理解,比如应用场景、优势挑战、与传统调用的区别等。 总结步骤:定义函数调用,分传统和AI两部分;工作原理分步骤说明用户输入到函数执行的过程;举例说明;强调意义和优势;生成相关问题。</think>### 函数调用Function Calling)及其工作原理 #### 1. 函数调用的定义 **函数调用**在编程中通常指通过函数名和参数执行特定操作的过程。在传统编程中,开发者直接编写代码调用函数,例如: ```python result = add(3, 5) # 调用加法函数 ``` 在 **AI 大模型**场景中,函数调用特指模型根据用户需求生成调用外部工具或 API 所需的参数,而非直接执行代码[^3]。例如,用户询问天气时,模型生成 `{"location": "北京"}` 的参数,开发者再据此调用天气 API[^2]。 --- #### 2. AI 大模型中函数调用的工作原理 **核心流程**可分为以下步骤: 1. **用户输入解析** 模型接收自然语言请求(如“北京今天气温多少?”),分析意图。 2. **函数定义匹配** 开发者预先通过 `tools` 参数向模型描述可用的函数(如 `get_weather(location)`)。模型判断是否需要调用函数。 3. **参数生成** 若需要调用,模型生成符合函数定义的参数(如 `{"location": "北京"}`),但不会执行函数本身。 4. **外部执行与反馈** 开发者根据参数调用外部 API,将结果返回给模型,模型再生成最终回答(如“北京今天 25°C”)[^2]。 **关键特性**: - **逻辑赋能**:弥补大模型无法执行真实逻辑的缺陷(如计算、数据库查询),通过外部函数扩展能力[^4]。 - **安全隔离**:模型仅生成参数,实际执行由开发者控制,避免安全隐患。 --- #### 3. 示例:天气查询场景 ```text 用户输入 → 模型生成参数 → 调用天气 API → 返回结果 ``` - **用户输入**:“上海明天会下雨吗?” - **模型输出**:`{"location": "上海", "date": "2023-10-20"}` - **开发者**:调用天气 API 获取数据,反馈给模型生成回答[^2]。 --- #### 4. 意义与优势 - **动态扩展能力**:模型可通过函数调用集成实时数据(如股票、新闻)或专业工具(如数学计算)[^4]。 - **精准控制**:开发者可限制模型行为,确保输出符合业务规范。 - **成本优化**:减少模型处理复杂逻辑的负担,提升响应效率[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起学开源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值