AI 只能聊天、生成图片、生成视频吗?
比如我想让 AI 帮我发个邮件:
AI 你好,请帮我发一封邮箱给:
收件人:xx@xx.com
邮件主题:hi 李雷
邮件内容:I am 韩梅梅
AI 可以聊天,可以生成图片,可以生成视频,那它能发邮件吗?
一般来说互联网版本的 AI 可以帮我们拟邮件内容与标题,但不会给我们自动发邮件,毕竟这操作就和病毒一样有点可怕。当然如果是在自己本地的私有化 AI 来说这就是可以实现的功能。
如何给 AI 赋予发邮件的能力?
随着 OpenAI 推出的“Function Calling”功能,通过 Function Calling,大模型能够通过结构化输入连接到外部系统,比如通过 API 进行交互,从而实现与外部世界的连接。
通过Function Calling AI 可以与外部工具和服务连接起来,这样 AI 的能力就非常的广阔。这样可以打造更智能、更强大的人工智能。
Function Calling 技术的不断发展,我们相信它将在未来的 AI 应用中发挥越来越重要的作用。
下面我们来具体看看Function Calling:
一、Function Calling概述
故事的开端来源于 OpenAI 的这次升级,“Function calling and other API updates”。
对于AI 需求,我们远远不止于希望 AI 只能生成文本,也希望能 AI 可以执行具体的任务,比如查询数据库、发送邮件、生成表格等等。早期,我们通过“指令微调”(Instruction Tuning)让模型理解并执行特定指令,但这种方式存在一些局限。
为了解决这个问题, Function Calling(函数调用)出现了。Function Calling 允许我们将具体的功能以函数的形式定义出来,模型在生成文本时,可以主动调用这些函数,从而实现复杂任务的执行。
Function Calling 的核心思想是:模型生成的不仅是文本,还可能是对具体函数的调用,以及调用所需的参数。这种机制使得模型能够更灵活、更安全、更高效地执行各种任务。
二、Function Calling原理
Function Calling 的实现原理主要分为以下几个步骤:
- 定义函数:将具体的功能封装成函数,定义函数的名称、入参和返回值。
- 函数映射:将函数的信息(如名称、参数类型等)映射到模型可理解的 Json 格式。
- 模型生成函数调用:在与模型的交互中,提示模型生成函数调用的 JSON 对象,而不是直接生成结果。
- 解析并执行函数调用:解析模型生成的 JSON 对象,调用相应的函数,并将函数的返回结果反馈给模型。
- 模型根据函数返回结果生成最终答案:模型根据函数的执行结果,生成最终的回复或继续进行交互。
其实Function Calling 的本质还是很简单的,就是和 AI 聊天,AI 解析聊天内容,触发生成调用函数的对象,程序根据 AI 生成的参数判断调用函数。本质上还是自己的程序在调用函数,不过中间有 AI 的交互。
如 AI 给我们生成邮件内容,然后告诉我们可以用这个去调用我们发邮件的函数或接口了。感觉是对智能体能力的扩展。
官方也给出了示例,也是非常简单的。
三、实战LLaMA实现自动发邮件
接下来,我们将基于LLaMA 3.2-1B 模型,实现一个简单的自动发邮件功能。我们将使用 Function Calling 的机制,让模型在需要发送邮件时,调用我们定义的 send_email 函数。
3.1 环境配置
首先,本地得安装以下依赖:
transformers
: Hugging Face 的 Transformers 库,用于加载和使用预训练模型。datasets
: Hugging Face 的 Datasets 库,用于加载数据集。smtplib
: Python 内置库,用于发送邮件。
你可以使用以下命令安装所需的库:
pip install transformers datasets
3.2 加载模型和分词器
使用 Hugging Face 的 AutoModelForCausalLM
和 AutoTokenizer
来加载 LLaMA 模型和分词器。
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "llama-3.2-1b"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
3.3 定义send_email
定义一个 send_email 函数,用于发送邮件。这个函数接受收件人、主题和正文作为参数。
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email(to, subject, body):
# 请替换为你的邮件服务器配置
smtp_server = "smtp.qq.com"
smtp_port = 587
smtp_username = "xx"
smtp_password = "xx"
msg = MIMEMultipart()
msg["From"] = smtp_username
msg["To"] = to
msg["Subject"] = subject
msg.attach(MIMEText(body, "plain"))
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(smtp_username, smtp_password)
server.sendmail(smtp_username, to, msg.as_string())
return f"邮件已成功发送至 {to}"
3.4 构建 Function Calling 对话
构建一个对话系统,模拟用户与模型的交互。在这个对话中,模型可以根据用户的指令,调用 send_email 函数发送邮件。
def main():
functions = [
{
"name": "send_email",
"description": "发送一封邮件",
"parameters": {
"type": "object",
"properties": {
"to": {
"type": "string",
"description": "收件人邮箱地址",
},
"subject": {
"type": "string",
"description": "邮件主题",
},
"body": {
"type": "string",
"description": "邮件正文",
},
},
"required": ["to", "subject", "body"],
},
},
]
messages = [
{"role": "system", "content": "你是一个可以帮助用户发送邮件的助手。"},
]
while True:
user_input = input("你: ")
messages.append({"role": "user", "content": user_input})
# 将 messages 转换为模型可接受的输入格式
prompt = ""
for message in messages:
if message["role"] == "system":
prompt += f"<system>{message['content']}</system>\n"
elif message["role"] == "user":
prompt += f"<user>{message['content']}</user>\n"
elif message["role"] == "assistant":
prompt += f"<assistant>{message['content']}</assistant>\n"
# 生成模型回复
inputs = tokenizer.encode(prompt, return_tensors="pt")
outputs = model.generate(inputs, max_length=512)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 提取模型生成的函数调用
if "send_email" in response:
# 这里我们简化处理,直接提取参数
to = input("请输入收件人邮箱地址: ")
subject = input("请输入邮件主题: ")
body = input("请输入邮件正文: ")
result = send_email(to, subject, body)
print(f"助手: {result}")
messages.append({"role": "assistant", "content": result})
else:
print(f"助手: {response}")
messages.append({"role": "assistant", "content": response})
3.5 运行程序
运行程序后,你可以输入一些指令,看看模型是否会调用 send_email 函数发送邮件。
例如:
你: 帮我发送一封邮件给 xx@xx.com,主题是“测试邮件”,内容是一封感谢信,具体内容你帮我写。
程序会提示你输入收件人邮箱地址、主题和正文,然后发送邮件并返回结果。
我是栈江湖,如果你喜欢此文章,不要忘记点赞+关注!