大模型function call(函数调用)理论+实战教程来啦!纯手搓GLM4+多种工具(论文查询、邮件发送功能)搭建AI助手!

前言

今天给大家分享一下什么是大模型的function call(函数调用)以及对应的运行原理,纯手搓GLM-4-9B(利用function call)+多种工具搭建AI助手;具有查询论文内容、数学计算、天气查询、发送邮箱、语音播报等多个功能并进行案例展示。下面进入今天的主题~

本文目录

  • 效果篇: 手搓glm4(function call)+多种工具搭建个人AI助手-效果展示

  • 普通问题-案例展示

  • 获得城市实时天气信息-案例展示

  • 计算数学表达式-案例展示

  • 获得arxiv论文信息-案例展示

  • 用户问题中包含子任务(需要依次调用多个工具)-案例效果展示

  • 理论篇: 基础大模型和function call介绍

  • 基础大模型的缺点

  • 有了大模型,为什么还需要function call?

  • function call的执行原理

  • glm-4-9B大模型介绍

  • 实战篇: 纯手搓glm4(function call)调用多种工具搭建智能体

  • 工具一: 获得实时天气信息

  • 工具二: wolframalpha-求解数学代数表达式的解

  • 工具三: arxiv论文搜索工具

  • 工具四: 自动发送邮件工具

效果篇: 手搓glm4(function call)+多种工具搭建个人AI助手-效果展示

下面是我利用glm-4-9b模型的function call(函数调用)+多种工具搭建的个人AI办公助手,具有查询论文内容信息、数学计算、天气查询、发送邮箱、语音播报等多个功能。效果展示如下:

普通问题-案例展示

输出的语音效果:

输出的语音效果:

获得城市实时天气信息-案例展示

输出的语音效果:

输出的语音效果:

计算数学表达式-案例展示

输出的语音效果:

输出的语音效果:

获得arxiv论文信息-案例展示

输出的语音效果:

用户问题中包含子任务(需要依次调用多个工具)-案例效果展示

对应邮件发送的内容和状态如下:

效果怎么样?实操下来,感觉glm4的function call功能还是非常强大,基本都能准确识别出是否需要使用工具以及正确输出对应的工具参数和名称。下面我将给大家详细介绍一下什么是大模型的function call(函数调用)以及对应的执行流程~

理论篇: 基础大模型和function call介绍

基础大模型的缺点

基础大模型LLM,虽然在多个领域展现出了强大的能力,但它们却存在下面的缺点和局限性:

  • 资源消耗:训练和运行大型模型需要大量的计算资源,包括高性能的GPU和TPU。这不仅增加了成本,也消耗了大量的能源。

  • 数据依赖性:大模型的性能在很大程度上依赖于训练数据的质量和多样性。如果训练数据存在偏差,模型的输出也可能带有偏见。

  • 可解释性差:大模型通常被视为“黑箱”,它们的决策过程不透明,难以解释。这在需要高度可解释性的领域(如医疗、法律)可能是一个问题。

  • 泛化能力限制:尽管大模型在特定任务上表现出色,但它们可能在未见过的新任务或领域上泛化能力不足。

  • 实时性问题:大模型通常不具备实时获取和处理信息的能力,因为它们的知识库是基于训练时的数据,而不是实时更新的。

  • 安全性和隐私问题:大模型可能无意中泄露训练数据中的敏感信息,或者在生成文本时创造出不当内容。

有了大模型,为什么还需要function call?

由于基础大模型具有很多缺点;通过llm+function call,只需要让基础大模型对用户提问的任务问题进行抽象总结对应的任务工具参数,送给对应的任务工具执行,比直接输出用户提问的内容更加具有可解释性和更准解决用户的意图。大模型在Function Call(函数调用)功能加持下可以让大模型能够提供更多的能力如下:

  • 增强能力:大模型通过Function Call可以调用外部工具或服务,从而扩展其自身的能力,执行它本身无法完成的任务,如实时数据检索、文件处理、数据库查询等。

  • 实时数据访问:大模型通常基于静态数据集训练,不具备实时信息。Function Call允许模型访问最新的数据,提供更准确、更及时的回答。

  • 提高准确性:在需要精确计算或特定领域知识时,大模型可以通过调用专门的函数来提高回答的准确性,例如调用数学计算函数、翻译服务或专业知识库。

  • 个性化服务:Function Call使得大模型能够根据用户的具体需求调用不同的服务,提供个性化的用户体验。

  • 操作复杂任务:有些任务过于复杂,无法仅靠模型的内置知识解决。Function Call允许模型将这些任务分解为可管理的子任务,并调用相应的函数来解决。

  • 交互式应用:在构建交互式应用时,如聊天机器人或虚拟助手,Function Call使得模型能够执行更复杂的交互,如预订服务、控制智能家居设备等。

  • 安全性和合规性:通过Function Call,可以在模型外部处理敏感数据,确保数据安全和合规性,而不是将所有信息都暴露给模型。

function call的执行原理

大模型function call(函数调用)的执行流程如上,具体步骤如下:

  1. 用户提出问题。

  2. 大型语言模型(LLM)根据用户的问题进行判断,是否需要使用工具来回答。

  3. 如果需要调用工具函数,模型将输出对应的函数调用参数,包括工具函数名称和所需参数。

  4. 通过第3步输出的结果调用对应的工具函数,并返回工具执行的结果。

  5. LLM根据第4步工具执行的结果,并结合第1步用户的问题,输出对应的答案。

  6. 如果第2步判断不需要调用工具函数,LLM将直接根据用户的问题进行对应的回复。

glm-4-9B大模型介绍

GLM-4-9B是智谱AI在24年6月5日推出的开源预训练模型。GLM4在语义理解、数学、推理、编程和知识等领域的测试中表现优异。GLM-4-9B-Chat是其人类偏好对齐版本,支持多轮对话、网页浏览、代码执行、自定义工具调用(function call)以及长文本推理(最大128K上下文)。该系列模型还支持26种语言,包括日语、韩语和德语,并推出了支持1M上下文长度(约200万中文字符)的版本。

接下来我将利用glm-4-9b-chat的function call功能+多种工具手搓AI助手;能查询论文内容信息、数学计算、天气查询、发送邮箱、语音播报等多个功能。

实战篇: 纯手搓glm4(function call)调用多种工具搭建智能体

工具一: 获得实时天气信息

import requests   import json   def get_weather(city_name):       api_key = "your api key "  # 替换为你自己的API Key       base_url = "http://api.openweathermap.org/data/2.5/weather"           # 构建请求参数       params = {           "q": city_name if '市' in city_name else city_name+"市" , # 城市名           "appid": api_key,       # API Key           "units": "metric"       # 温度单位为摄氏度       }           # 发送GET请求获取天气数据       response = requests.get(base_url, params=params)       data = json.loads(response.text)       # 解析返回的JSON数据       if data["cod"] == 200:           weather = data["weather"][0]["main"]           # 天气情况           description = data["weather"][0]["description"] # 天气描述           temperature = data["main"]["temp"]              # 温度           humidity = data["main"]["humidity"]             # 湿度           wind_speed = data["wind"]["speed"]              # 风速       else:           print("Failed to fetch weather data.")       return data   get_weather("重庆市")   

工具二: wolframalpha-求解数学代数表达式的解

import os    from langchain.utilities.wolfram_alpha import WolframAlphaAPIWrapper   from langchain.utilities import ArxivAPIWrapper   os.environ['WOLFRAM_ALPHA_APPID'] = 'your token'      def wolframalpha(query):       WolframAlpha = WolframAlphaAPIWrapper()       return WolframAlpha.run(query)   

工具三: arxiv论文搜索工具

def arxiv_tool(query):       arxiv = ArxivAPIWrapper()       return arxiv.run(query)   

工具四: 自动发送邮件工具

import smtplib   import email   from email.mime.multipart import MIMEMultipart   from email.mime.base import MIMEBase   from email.mime.text import MIMEText   from email.utils import COMMASPACE   from email import encoders      # 配置SMTP服务器和登录信息   smtp_server = 'smtp.163.com'   smtp_port = 25   username = 'xxxxxxxx@163.com'   password = 'xxxxxx'   sender_email = 'xxxxx@163.com'      def send_email(title, body, receiver_emails, filename=None):       # 创建MIMEMultipart对象以便容纳多部分邮件内容       msg = MIMEMultipart()       msg['From'] = sender_email       msg['To'] = COMMASPACE.join(receiver_emails)       msg['Subject'] = title       # 创建邮件正文       msg.attach(MIMEText(body))       # 打开并读取Excel文件        # 要发送的Excel文件路径       if filename !=None:           with open(filename, 'rb') as f:               attachment = MIMEBase('application', 'vnd.openxmlformats-officedocument.spreadsheetml.sheet')               attachment.set_payload(f.read())               encoders.encode_base64(attachment)  # 对附件内容进行base64编码               attachment.add_header('Content-Disposition', f'attachment; filename="{os.path.basename(filename)}"')               msg.attach(attachment)          # 连接SMTP服务器并发送邮件       try:           server = smtplib.SMTP(smtp_server, smtp_port)           server.starttls()  # 如果使用的是非安全端口,需要启用TLS加密           server.login(username, password)           server.sendmail(sender_email, receiver_emails, msg.as_string())           server.quit()           flag = "邮件发送成功"       except Exception as e:           flag = f'邮件发送失败,{e}'       return flag   
最终显存占用情况

一次执行多个工具-复杂案例展示

对应邮件发送的内容和状态如下:

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

### 函数调用在编程中的概念 函数调用是指程序控制权传递给某个特定子程序的过程,该过程允许代码重用并简化复杂问题的解决方法。当一个函数被调用时,会按照定义的方式处理传入的数据,并可能返回计算后的结果。 #### 解析函数调用请求 大模型在推理过程中,通过解析输入文本,识别出其中的函数调用请求,提取出函数名称和参数[^1]。这表明,在现代软件开发实践中,尤其是涉及自然语言处理的大规模预训练模型中,理解如何从非结构化数据中抽取可执行指令变得至关重要。 #### 实现函数调用的例子 下面是一个简单的Python例子来展示如何实现带有工具调用的消息构建: ```python message.append({ "role": "tool", "name": response_f.choices[0].message.tool_calls[0].function.name, "content": prompt + str(function_response), }) response_a = client.chat.completions.create( model="glm-4", # 填写需要调用的模型名称 messages=message, tools=tools, tool_choice=response_f.choices[0].message.tool_calls[0].function.name, ) print(response_a.choices[0].message.content) ``` 这段代码展示了如何向对话历史记录`message`列表添加一个新的条目,这个新条目的角色是作为辅助工具使用的函数名及其响应内容;随后创建了一个新的聊天完成实例`response_a`,指定了要使用的具体AI模型以及之前提到过的工具选项[^2]。 #### 关于函数元数的概念 函数元数指的是函数调用中所含有的参数数量。例如: - Nullary functions (零元函数): 不接受任何参数 `f() = 2` - Unary functions (一元函数): 接受单个参数 `f(x) = 2 * x` - Binary functions (二元函数): 接受两个参数 `f(x, y) = 2 * x * y` - N-ary functions (多元函数): 可以接收任意多个参数 `f(x_1, x_2,...,x_n) = 2 * x_1 * x_2 *...* x_n`[^4] 这些不同类型的函数反映了实际应用中对于灵活性的需求——有时只需要简单操作而无需额外输入,而在其他情况下则需提供更丰富的上下文信息以便更好地定制行为。 #### 微调与内置功能支持 可以在微调阶段将必要的functions嵌入到模型内部,从而减少对外部API依赖的可能性。这样做不仅能够提高系统的整体性能,还可以增强安全性,因为减少了网络通信带来的潜在风险[^3]。 #### GPT 大型语言模型缺乏内在逻辑推理能力 值得注意的是,尽管大型语言模型如GPT具有强大的模式匹配能力和生成逼真文本的能力,但在本质上它们并不具备真正的逻辑思维技能。为了弥补这一不足之处,“函数调用”机制赋予了这类模型“真实”的逻辑运算能力,使其能够在一定程度上模拟人类解决问题的方法[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值