近年来大模型发展过程中面临的几个核心挑战:静态知识的局限性、执行能力的缺失、与外部系统的割裂。为了应对这些挑战,推动大模型从单纯的语言生成工具演变为真正的任务执行引擎,Function calling 诞生了,成为大模型一项不可或缺的核心能力。

概念 Function calling 和 Tool Calling 会混用

我们在做应用开发的时候,大部分时候尽量避免直接耦合到OpenAI,会使得程序兼容性不好,这时只要面向 LangChain 开发就可以了

LangChain 是一个灵活的框架,它提供了与多种大模型进行交互的能力

它的设计允许集成和使用来自不同源的多种模型,包括但不限于OpenAl、Cohere和 Hugging Face 等模型库中的模型。这样,你不必拘泥于某种模型,而是为自己的应用选择最合适的模型。对于Tool Calling能力来说,LangChain 也做了抽象

调用其他工具的 API(如:Database Tool) 通常需要特定的有效负载格式。可以使用 Tool Calling 来向模型请求与特定格式匹配的响应。随后可以使用这个响应作为负载去做“工具(Tool)实际的执行”

通俗来将就是:让大模型通过理解用户的提示词,来决定是否需要调用工具(如上图),

如果需要调用工具,会返回需要调用的工具名称和调用参数(不是直接执行工具),后续由代码去执行对应的工具(Tool)

如果不需要调用工具,那么就直接回复自然语言(如:How can I assist you?)

一、工具(Tool)

tool抽象 在 LangChain 中将 Python函数 与 定义“函数名称、描述和预期参数”的schema 关联起来。

工具(Tool) 可以传给支持 tool calling 的 聊天模型,允许模型使用特定输入执行特定函数

创建工具的推荐方法是使用@tool 装饰器。此装饰器旨在简化工具创建过程,在大多数情况下应使用它。定义函数后,可以使用@tool 对其进行装饰,以创建实现工具接口 的工具。

代码如:

from langchain_core.tools import tool

@tool
def multiply(a: int, b: int) -> int:
   """两个数字相乘."""
   return a * b

默认情况下,装饰器使用函数名称作为工具名称

装饰器将使用函数的文档字符串作为工具的描述 —— 因此必须提供文档字符串。

定义工具后,可以通过调用直接使用它

result = multiply.invoke({"a": 2, "b": 3})
print(result) 
# Output: 6

也能直接看到工具的具体信息

print(multiply.name)
print(multiply.description)
print(multiply.args)

# 输出
multiply
两个数字相乘.
{'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}

通过参数自定义工具

@tool("multiplication-tool", args_schema=CalculatorInput, return_direct=True)

在这里插入图片描述

代码如:

from pydantic import BaseModel, Field

class CalculatorInput(BaseModel):
   a: int = Field(description="第一个数字")
   b: int = Field(description="第二个数字")

# 通过参数自定义
@tool("multiplication-tool", args_schema=CalculatorInput, return_direct=True)
def multiply(a: int, b: int) -> int:
   """两个数字相乘."""
   return a * b

# 查看工具的具体信息
print(multiply.name)
print(multiply.description)
print(multiply.args)
print(multiply.return_direct)

输出:

# 输出
multiplication-tool
两个数字相乘.
{'a': {'description': '第一个数字', 'title': 'A', 'type': 'integer'}, 'b': {'description': '第二个数字', 'title': 'B', 'type': 'integer'}}
True

通过解析文档字符串配置定义工具

@tool 可以选择性地解析Google Style 文档字符串,并将文档字符串组件(例如参数描述)与工具schame的相关部分关联起来。使用这种方法,需要指定 parse_docstring

代码如:

@tool(parse_docstring=True)  # 解析文档字符串
def multiply(a: int, b: int) -> int:
   """两个数字相乘.

   Args:
      a: 第一个数字
      b: 第二个数字

   Returns:
      两个数字相乘的结果
   """
   return a * b

# 查看工具的具体信息
print(multiply.name)
print(multiply.description)
print(multiply.args)
print(multiply.return_direct)

结果:

# 输出
multiply
两个数字相乘.
{'a': {'description': '第一个数字', 'title': 'A', 'type': 'integer'}, 'b': {'description': '第二个数字', 'title': 'B', 'type': 'integer'}}
False

二、通过大模型的 Tool calling 调用工具

Tool calling 允许聊天模型通过“Tool calling”来响应给定的提示词。

虽然“Tool calling”这个名字暗示模型正在直接执行某些操作,但实际上并非如此!模型仅生成工具的参数,而是否运行工具(或不运行)取决于用户。

Tool calling 可以从模型生成结构化输出,即使您不打算调用任何工具,也可以使用它。该技术是从非结构化文本中提取信息

如下图,把用户输入的文本,通过大模型的Tool calling提取出了符合工具get_weather的信息

代码示例

第一步:定义工具
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

model = ChatOpenAI(
    api_key='hk-iwtb1e427',
    base_url='https://api.openai-hk.com/v1',
    temperature=0
)

print("第一步 :定义工具")
@tool
def multiply(a: int, b: int) -> int:
    """两个数字相乘."""
    return a * b

tools = [multiply]
第二步:把工具绑定到大模型
# Tool binding
print("第二步 :把工具绑定到大模型")
model_with_tools = model.bind_tools(tools)
第三步:大模型 Tool calling
# Tool calling
print("第三步 :大模型Tool calling")
query = "2乘以3"
messages = [HumanMessage(query)]
ai_msg = model_with_tools.invoke(messages)
print(ai_msg)
# 获取返回的response中工具名称和调用参数
print("大模型 Tool calling 返回结果 : ",ai_msg.tool_calls)
# [{'name': 'multiplication-tool', 'args': {'a': 2, 'b': 3}, 'id': 'call_2bJbBe74qhuDfg3ZGCu7p9e3', 'type': 'tool_call'}]
messages.append(ai_msg) 
第四步:工具的执行(Tool calling 返回需要执行的工具)
print("第四步 :工具的执行")
# 定义所有的工具字典
all_tools = {
    "multiply": multiply
}

for tool_call in ai_msg .tool_calls:
    selected_tool = all_tools[tool_call["name"].lower()]
    tool_msg = selected_tool.invoke(tool_call)
    print("工具的执行 返回结果 : ",tool_msg)
    messages.append(tool_msg)
    # content='6' name='multiply' tool_call_id='call_CTCJAFlibfN3zhM9jMMStBlp'
print("聊天上下文 :")
print(messages)
第五步:大模型处理工具的返回结果
print("第五步:大模型处理工具的返回结果")
response = model_with_tools.invoke(messages)
print("大模型返回 :",response.content)
# 大模型返回 : 2乘以3的结果是6。

用户输入 :2乘以3

大模型返回 : 2乘以3的结果是6。

日志:


三、如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2024行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐