你以为AI只能聊天吗?

AI 只能聊天、生成图片、生成视频吗?

比如我想让 AI 帮我发个邮件:

AI 你好,请帮我发一封邮箱给:

收件人:xx@xx.com

邮件主题:hi 李雷

邮件内容:I am 韩梅梅

AI 可以聊天,可以生成图片,可以生成视频,那它能发邮件吗?

 

83a12dcc09ee377bb8981dbe22c96dad.png

一般来说互联网版本的 AI 可以帮我们拟邮件内容与标题,但不会给我们自动发邮件,毕竟这操作就和病毒一样有点可怕。当然如果是在自己本地的私有化 AI 来说这就是可以实现的功能。

如何给 AI 赋予发邮件的能力?

随着 OpenAI 推出的“Function Calling”功能,通过 Function Calling,大模型能够通过结构化输入连接到外部系统,比如通过 API 进行交互,从而实现与外部世界的连接。

通过Function Calling AI 可以与外部工具和服务连接起来,这样 AI 的能力就非常的广阔。这样可以打造更智能、更强大的人工智能。
Function Calling 技术的不断发展,我们相信它将在未来的 AI 应用中发挥越来越重要的作用。

 

下面我们来具体看看Function Calling:

一、Function Calling概述

 

411ec934b257c6b250e0701be5c52ee4.png

故事的开端来源于 OpenAI 的这次升级,“Function calling and other API updates”。

对于AI 需求,我们远远不止于希望 AI 只能生成文本,也希望能 AI 可以执行具体的任务,比如查询数据库、发送邮件、生成表格等等。早期,我们通过“指令微调”(Instruction Tuning)让模型理解并执行特定指令,但这种方式存在一些局限。

为了解决这个问题, Function Calling(函数调用)出现了。Function Calling 允许我们将具体的功能以函数的形式定义出来,模型在生成文本时,可以主动调用这些函数,从而实现复杂任务的执行。

Function Calling 的核心思想是:模型生成的不仅是文本,还可能是对具体函数的调用,以及调用所需的参数。这种机制使得模型能够更灵活、更安全、更高效地执行各种任务。

二、Function Calling原理

 

d31e3e7493e4262234fa3971edb3d4a1.png

Function Calling 的实现原理主要分为以下几个步骤:

  1. 定义函数:将具体的功能封装成函数,定义函数的名称、入参和返回值。
  2. 函数映射:将函数的信息(如名称、参数类型等)映射到模型可理解的 Json 格式。
  3. 模型生成函数调用:在与模型的交互中,提示模型生成函数调用的 JSON 对象,而不是直接生成结果。
  4. 解析并执行函数调用:解析模型生成的 JSON 对象,调用相应的函数,并将函数的返回结果反馈给模型。
  5. 模型根据函数返回结果生成最终答案:模型根据函数的执行结果,生成最终的回复或继续进行交互。

其实Function Calling 的本质还是很简单的,就是和 AI 聊天,AI 解析聊天内容,触发生成调用函数的对象,程序根据 AI 生成的参数判断调用函数。本质上还是自己的程序在调用函数,不过中间有 AI 的交互。

如 AI 给我们生成邮件内容,然后告诉我们可以用这个去调用我们发邮件的函数或接口了。感觉是对智能体能力的扩展。

官方也给出了示例,也是非常简单的。

 

cd763dc03c1def15d35702d33c749d6f.png

三、实战LLaMA实现自动发邮件

 

8526717a29125c70e96ba4716049fc6b.png

接下来,我们将基于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 的 AutoModelForCausalLMAutoTokenizer 来加载 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,主题是“测试邮件”,内容是一封感谢信,具体内容你帮我写。

程序会提示你输入收件人邮箱地址、主题和正文,然后发送邮件并返回结果。

 

我是栈江湖,如果你喜欢此文章,不要忘记点赞+关注

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

栈江湖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值