【GPT入门】第11课 FunctionCall调用本地代码入门

【GPT入门】第11课 FunctionCall调用代码入门

1. 手撕FunctionCall

为了了解,funcationCall底层,手写一个functionCall多方法,并调用,体验

思路:
任务:让openai调用sum方法,对加法进行求和
1.定义sum方法,给openAi接口
2.让大模型自动识别用户问题,解释参数,获取调用方法id、方法名称、方法参数
3.把第二步的结果,给大模型,让大模型调用函数,并返回结果

2.代码

from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
import json

_ = load_dotenv(find_dotenv())

client = OpenAI()


def print_json(data):
    """
    打印参数。如果参数是有结构的(如字典或列表),则以格式化的 JSON 形式打印;
    否则,直接打印该值。
    """
    if hasattr(data, 'model_dump_json'):
        data = json.loads(data.model_dump_json())

    if (isinstance(data, (list))):
        for item in data:
            print_json(item)
    elif (isinstance(data, (dict))):
        print(json.dumps(
            data,
            indent=4,
            ensure_ascii=False
        ))
    else:
        print(data)


def get_completion(messages, model="gpt-4o-mini"):
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0.7,
        tools=[{  # 用 JSON 描述函数。可以定义多个。由大模型决定调用谁。也可能都不调用
            "type": "function",
            "function": {
                "name": "sum",
                "description": "加法器,计算一组数的和",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "numbers": {
                            "type": "array",
                            "items": {
                                "type": "number"
                            }
                        }
                    }
                }
            }
        }],
    )
    print("response:")
    print(response)
    return response.choices[0].message

from math import *

prompt = "Tell me the sum of 1,2,3,4,5,6,7,8,9,10"


messages = [
    {"role": "system", "content": "你是一个数学家"},
    {"role": "user", "content": prompt}
]



response = get_completion(messages)

# 把大模型的回复加入到对话历史中。必须有
messages.append(response)
print("------function call-----")
print(response)

if (response.tool_calls is not None):
    # 是否要调用 sum
    tool_call = response.tool_calls[0]
    if(tool_call.function.name == 'sum'):
        args = json.loads(tool_call.function.arguments)
        result = sum(args["numbers"])

        #把函数调用结果加入到对话历史中
        messages.append(
            {
                "tool_call_id":tool_call.id, #用于表示函数调用Id
                "role":"tool",
                "name":"sum",
                "content":str(result) #数值 result 必须转为字符串
             }
        )

        #再次调用大模型
        response = get_completion(messages)
        messages.append(response)
        print("-------最终 GPT 回复-------")
        print(response.content)

print("---------对话历史----------")
print_json(messages)

3.functionCall的结果

C:\ProgramData\anaconda3\envs\gptLearning\python.exe E:\workspace\gptLearning\gptLearning\les03\Lesson01_functionCalling.py 
response:
ChatCompletion(id='chatcmpl-B8xbekE9Xfke8t1AkftFpEzpcdtho', choices=[Choice(finish_reason='tool_calls', index=0, logprobs=None, message=ChatCompletionMessage(content=None, refusal=None, role='assistant', audio=None, function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_CcEYaIPwl1Ru63XmMm6qSGFD', function=Function(arguments='{"numbers":[1,2,3,4,5,6,7,8,9,10]}', name='sum'), type='function')]), content_filter_results={})], created=1741475450, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier=None, system_fingerprint='fp_b705f0c291', usage=CompletionUsage(completion_tokens=32, prompt_tokens=79, total_tokens=111, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)), prompt_filter_results=[{'prompt_index': 0, 'content_filter_results': {'hate': {'filtered': False, 'severity': 'safe'}, 'jailbreak': {'filtered': False, 'detected': False}, 'self_harm': {'filtered': False, 'severity': 'safe'}, 'sexual': {'filtered': False, 'severity': 'safe'}, 'violence': {'filtered': False, 'severity': 'safe'}}}])
------function call-----
ChatCompletionMessage(content=None, refusal=None, role='assistant', audio=None, function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_CcEYaIPwl1Ru63XmMm6qSGFD', function=Function(arguments='{"numbers":[1,2,3,4,5,6,7,8,9,10]}', name='sum'), type='function')])
response:
ChatCompletion(id='chatcmpl-B8xbfvdhavJ9RTAVxfAk3SmkIjVOT', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='The sum of the numbers 1 through 10 is 55.', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None))], created=1741475451, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier='default', system_fingerprint='fp_06737a9306', usage=CompletionUsage(completion_tokens=16, prompt_tokens=118, total_tokens=134, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))
-------最终 GPT 回复-------
The sum of the numbers 1 through 10 is 55.
---------对话历史----------
{
    "role": "system",
    "content": "你是一个数学家"
}
{
    "role": "user",
    "content": "Tell me the sum of 1,2,3,4,5,6,7,8,9,10"
}
{
    "content": null,
    "refusal": null,
    "role": "assistant",
    "audio": null,
    "function_call": null,
    "tool_calls": [
        {
            "id": "call_CcEYaIPwl1Ru63XmMm6qSGFD",
            "function": {
                "arguments": "{\"numbers\":[1,2,3,4,5,6,7,8,9,10]}",
                "name": "sum"
            },
            "type": "function"
        }
    ]
}
{
    "tool_call_id": "call_CcEYaIPwl1Ru63XmMm6qSGFD",
    "role": "tool",
    "name": "sum",
    "content": "55"
}
{
    "content": "The sum of the numbers 1 through 10 is 55.",
    "refusal": null,
    "role": "assistant",
    "audio": null,
    "function_call": null,
    "tool_calls": null
}

Process finished with exit code 0

### 使用 Python 调用本地 GPT-2 模型 要在 Python 中调用本地安装的 GPT-2 模型,通常会使用 Hugging Face 提供的 `transformers` 库。以下是实现这一目标的具体方法: #### 安装依赖库 首先需要确保已安装必要的 Python 库。可以通过以下命令安装所需的包: ```bash pip install transformers torch ``` #### 加载并使用 GPT-2 模型 下面是一个完整的代码示例,演示如何加载和使用本地存储的 GPT-2 模型。 ```python from transformers import GPT2LMHeadModel, GPT2Tokenizer # 初始化 tokenizer 和模型 tokenizer = GPT2Tokenizer.from_pretrained("gpt2") # 可替换为本地路径 model = GPT2LMHeadModel.from_pretrained("gpt2") # 可替换为本地路径 # 输入文本 input_text = "Hello, I am a language model," inputs = tokenizer(input_text, return_tensors="pt") # 获取模型生成的结果 outputs = model.generate(**inputs, max_length=50, num_return_sequences=1) # 解码输出 generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) print(generated_text) ``` 在此代码中: - `GPT2Tokenizer` 用于将输入文本转换为适合模型处理的形式。 - `GPT2LMHeadModel` 是预训练好的 GPT-2 模型,能够完成文本生成任务。 - 如果已经下载了本地版本的 GPT-2 模型文件,则可以用实际路径替代 `"gpt2"` 参数[^5]。 #### 关于性能优化 对于较大的数据集或复杂的推理场景,建议利用 GPU 来加速计算过程。这可通过 PyTorch 自动检测 CUDA 设备支持来实现。如果硬件条件允许,在初始化模型前加入如下配置可启用 GPU 支持: ```python import torch device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device) ``` 以上操作不仅提高了运行效率,还降低了 CPU 占用率[^6]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值