OpenAI 개발 시리즈(11): 함수 호출 기능의 실제 적용 과정과 사례 분석

전문은 총 6,000단어 이상이며, 예상읽는시간은 15~25분정도 | 건조물품(코드케이스 포함)이 가득하니 모아두시는걸 추천드려요!

이 기사의 목표는 Chat Completions 모델의 함수 호출 매개변수 및 사용 방법을 소개하고 Chat 모델의 함수 호출 함수 사례를 완전히 구현하는 것입니다.

이미지-20230823170111509

코드 다운로드 주소

1. 소개

대형 모델이 인터넷에 연결될 수 있고 API를 통해 ChatGPT와 유사한 플러그인의 데이터 기능을 갖게 된다면 얼마나 강력해질지 상상할 수 있습니까?

우리 모두는 대형 모델의 지식 기반이 2021년 9월 현재라는 것을 알고 있습니다. 이는 창발 능력을 자극하여 특정 추론 능력을 부여할 수 있지만 이 날짜 이후의 지식에 대해서는 아무것도 모른다는 것을 의미하지만 고유한 지식은 나타날 수 없습니다. , 국내 오픈 소스 대형 모델 라이트 ChatGLM과 같은:

이미지-20230823084255658

따라서 대형 모델(LLM)이 매우 유능하고 매우 강력한 신흥 능력을 가지고 있음에도 불구하고 몇 가지 한계도 있음을 알 수 있습니다. 명백한 문제는 최신 정보와 데이터를 얻을 수 없으며 텍스트 제안만 제공할 수 있다는 것입니다 . 대형 모델에게 "오늘 날씨는 어때요?"라고 묻는 등 일부 문제를 직접 해결하는 것은 불가능합니다 . 이 간단한 장면은 수행할 수 없으므로 대형 언어 모델의 실제 적용 가치는 크게 제한됩니다.

그래서 2023년 4월 AutoGPT는 이러한 상황에 대응하여 다음과 같은 제안을 했습니다. **대규모 언어 모델에 외부 API를 호출할 수 있는 기능을 제공해야 합니다. **예를 들어 GPT 모델을 사용하여 Google Mail API(Gmail API)를 호출할 수 있는 경우 GPT 모델은 자동으로 이메일을 읽고 자동으로 회신할 수 있습니다. 이러한 맥락에서 OpenAI는 0613 업데이트에서 가장 진보된 채팅 완료 모델에 함수 호출을 추가했습니다.

이미지-20230823090934775

이 기능을 과소평가하지 마십시오. 개발자가 AI 모델과 상호 작용하는 방식을 완전히 변화시킵니다. 이 기능을 통해 개발자는 AI 모델에 기능을 설명할 수 있으며, 모델은 이러한 기능을 호출하기 위한 매개변수가 포함된 JSON 개체를 출력하도록 지능적으로 결정할 수 있습니다 . 대형 모델에 함수 호출(함수 호출) 기능이 없기 전에 개발자가 대형 모델을 기반으로 AI 응용 프로그램을 개발하는 프로세스는 다음과 같습니다.

삼

함수 호출의 본질은 외부 함수를 호출하는 대규모 언어 모델의 능력입니다. 즉, 채팅 완료 모델은 더 이상 자체 데이터베이스 지식을 기반으로만 응답할 수 없지만 추가 함수 라이브러리를 마운트한 다음 함수를 검색할 수 있습니다. 사용자 질문에 따라 라이브러리, 실제 필요에 따라 외부 함수를 호출하고 기능 실행 결과를 얻은 다음 기능 실행 결과에 따라 응답합니다. 기본 프로세스는 다음과 같습니다.

2

**간단한 이해는 비즈니스 시나리오에 따라 해당 기능을 자동으로 선택하고 출력 형식을 지정한다는 것입니다. **단순한 사용자 정의 함수일 수도 있고, Google Mail을 호출할 수 있는 함수, 날씨 정보를 얻을 수 있는 함수 등 외부 도구 API를 캡슐화하는 함수일 수도 있습니다. 마지막으로 비교 차트를 살펴보십시오.

4

2. 함수 호출 구현 과정

복잡해 보이지만 실제로는 매우 간단합니다. OpenAI가 이미 이를 수행했습니다. 외부 함수 라이브러리를 미리 정의하고 ChatCompletions.create() 함수에 해당 매개변수를 설정합니다 .

소위 외부 기능 라이브러리는 특정 애플리케이션을 개발할 때 사용해야 하는 중간 처리 로직 기능으로 이해될 수 있습니다.예를 들어 자동 메일 응답 프로그램을 개발하려면 다음을 정의해야 합니다.

  • 메일을 받는 기능
  • 메일을 보내는 기능

채팅 완성 모델이 함수 호출 기능을 구현하면 대형 모델의 의미 이해 능력을 최대한 발휘하고 사용자 입력을 분석한 후 함수 라이브러리에서 가장 적합한 함수를 자동으로 선택하여 실행하고 질문에 대한 답변을 제공할 수 있습니다. . 수동 개입이 필요합니다.

2.1 외부 함수 라이브러리를 올바르게 구축하는 방법

채팅 완료 모델에는 함수 호출(Function Calling) 기능이 있지만 함수에 대한 이해는 기존 프로그래밍 환경의 함수와 동일하지 않습니다 . 대화 상자의 효과적인 프롬프트 디자인과 유사하게 함수 호출의 형식과 구조를 최적화하면 모델 실행의 정확성이 크게 향상될 수 있습니다. 따라서 적절한 데이터 입력 형식을 지정하는 것이 핵심 단계가 되며, 데이터 형식이 올바르게 설계되어야 모델이 작업을 보다 정확하게 이해하고 수행할 수 있습니다.

우선, 들어오는 데이터 형식을 살펴보세요.

2.1.1 입력 데이터 형식

2.1.1.1 DataFrame/String 데이터 형식

Pandas 라이브러리에는 두 가지 주요 데이터 구조가 있고 DataFrame대부분 Series데이터 처리 작업에 DataFrame 구조를 사용하므로 DataFrame 데이터 예제를 생성하여 대형 모델이 이 데이터 형식을 이해할 수 있는지 테스트할 수 있습니다.

  • 데이터 준비
# 创建一个稍微复杂的DataFrame,包含多种数据类型
df_complex = pd.DataFrame({
    
    
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Salary': [50000.0, 100000.5, 150000.75],
    'IsMarried': [True, False, True]
})

출력은 다음과 같습니다.

이미지-20230823102325480

  • 확인하다

모델이 데이터를 해석할 수 있는지 확인하려면 대형 모델을 전달합니다.

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo-16k-0613",
  messages=[
    {
    
    "role": "system", "content": "你是一位优秀的数据分析师,现在有这样一份数据集:'%s'" % df_complex},
    {
    
    "role": "user", "content": "请解释一下这个数据集的分布情况"}
  ]
)

출력은 다음과 같습니다.

response.choices[0].message['content']

이미지-20230823103338024

모델이 DataFrame 형식의 데이터 분포를 정확하게 이해할 수 있음을 알 수 있으며, 나아가 좀 더 일반적인 데이터 형식을 원할 경우 .to_string을 사용하여 문자열로 변환하여 전달해 볼 수도 있으며, 올바른 해석을 얻을 수 있습니다.

# 转化为字符串类型
df_complex_string = df_complex.to_string()

다음과 같이 형식화됩니다.

이미지-20230823103609271

2.1.1.2 JSON 데이터 형식

OpenAI에서 공식적으로 권장하는 데이터 상호 작용 형식은 JSON 입니다 . 위의 예에서도 대형 모델이 DataFrame/문자열 유형의 데이터를 올바르게 해석할 수 있지만 데이터의 가독성이 좋지 않음을 알 수 있습니다.

이미지-20230823103609271

동시에 프로그램 테스트 중에 데이터가 클 경우 대형 모델이 문자열 개체를 DataFrame 개체 유형으로 정확하게 식별하지 못할 수도 있다는 사실도 발견되었습니다. 그리고 교차 함수로서의 JSON

따라서 보다 일반적인 접근 방식은 JSON 형식을 사용하여 기능과 프로그래밍 환경 간에 통신하는 것입니다.

JSON(JavaScript Object Notation)은 단순하고 유연하며 구문 분석이 쉽기 때문에 다국어 환경에서 널리 사용됩니다. 거의 모든 최신 프로그래밍 언어는 JSON을 지원하므로 진정한 크로스 플랫폼 및 크로스 언어 데이터 형식이 됩니다. 가볍고 텍스트 전용 특성으로 인해 네트워크 전송에도 매우 효율적입니다.

  • 데이터 준비

Python의 pandas 라이브러리에서는 DataFrame을 JSON 형식으로 변환하는 것이 매우 간단합니다. DataFrame객체의 메소드를 사용하여 직접 to_json수행하십시오 .

# 将DataFrame转换为JSON格式,orient='split'参数将数据、索引和列分开存储
df_complex_json = df_complex.to_json(orient='split')

print(df_complex_json)

출력 데이터 형식은 다음과 같습니다.

이미지-20230823104901148

  • 확인하다
response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo-16k-0613",
  messages=[
    {
    
    "role": "system", "content": "你是一位优秀的数据分析师,现在有这样一份数据集:'%s'" % df_complex_json},
    {
    
    "role": "user", "content": "请解释一下这个数据集的分布情况"}
  ]
)

모델 분석 상황을 살펴보십시오.

이미지-20230823105217517

모델은 일반적으로 JSON 객체 유형을 식별할 수 있으며, 많은 테스트를 거친 후 JSON의 데이터 형식이 더 명확하게 해석될 수 있고 JSON 객체 자체의 가독성이 더 강하다는 것을 발견했습니다.

2.1.2 기능 사양 작성

채팅 완료 모델과 상호 작용하기 위해 함수 호출(함수 호출)을 사용할 때 키 입력 데이터 형식이 선택되면 함수 작성 사양도 마찬가지로 중요합니다 . 최소한 다음은 충족해야 합니다.

  1. 함수 이름 지우기 : 명확하고 설명이 포함된 함수 이름을 선택합니다.
  2. 매개변수 순서 및 이름 지정 : 매개변수는 논리적 순서를 갖고 설명적인 이름을 사용해야 합니다.
  3. 상세한 기능 설명 : 기능의 기능과 설정된 매개변수 변수에 대한 명확한 설명이 필요합니다.
  • 1단계: 데이터 준비

다음 데이터 세트를 예로 들어 보겠습니다.

# 示例DataFrame
df_complex = pd.DataFrame({
    
    
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Salary': [50000.0, 100000.5, 150000.75],
    'IsMarried': [True, False, True]
})

# 将DataFrame转换为JSON格式(按'split'方向)
df_complex_json = df_complex.to_json(orient='split')

입력 데이터 형식을 살펴보십시오.

이미지-20230823130656787

  • 2단계: 요구사항 설정

이제 다음과 같은 요구 사항이 있다고 가정합니다. 대규모 모델이 이 데이터 세트에 있는 모든 사람의 연령 합계를 계산하도록 합니다.

  • 3단계: 연령 합계를 계산하는 함수 작성

대형 모델에서 이해할 수 있는 명확한 기능은 다음과 같습니다.

def calculate_total_age_from_split_json(input_json):
    """
    从给定的JSON格式字符串(按'split'方向排列)中解析出DataFrame,计算所有人的年龄总和,并以JSON格式返回结果。

    参数:
    input_json (str): 包含个体数据的JSON格式字符串。

    返回:
    str: 所有人的年龄总和,以JSON格式返回。
    """

    # 将JSON字符串转换为DataFrame
    df = pd.read_json(input_json, orient='split')

    # 计算所有人的年龄总和
    total_age = df['Age'].sum()

    # 将结果转换为字符串形式,然后使用json.dumps()转换为JSON格式
    return json.dumps({
    
    "total_age": str(total_age)})
  • 4단계: 기능 테스트

주의할 점은 위에서 언급한 것처럼 대형 모델이 수신하는 최적의 데이터 형식은 JSON이므로 함수가 정상적으로 계산될 수 있는지 테스트하려면 JSON 형식을 전달해야 하며 코드는 다음과 같습니다.

# 使用函数计算年龄总和,并以JSON格式输出
result = calculate_total_age_from_split_json(df_complex_json)
print("The JSON output is:", result)

출력을 살펴보십시오.

이미지-20230823131141919

  • 5단계: 함수 라이브러리 정의

Chat 모델이 실제로 Function 호출 함수를 실행할 때 함수 라이브러리에서 적절한 함수를 선택하여 호출하게 되므로 함수 라이브러리를 준비해야 합니다. 가장 간단한 경우, 함수 라이브러리는 다음과 같이 하나의 함수만 포함할 수 있습니다.

function_repository = {
    
    
            "calculate_total_age_from_split_json": calculate_total_age_from_split_json,
        }

함수 라이브러리 객체는 사전이어야 하며 키-값 쌍은 함수를 나타냅니다. 여기서 Key는 함수 이름을 나타내는 문자열이고 값은 해당 함수를 나타냅니다. 따라서 위 프로세스는 간단히 다음과 같이 이해될 수 있습니다. 소위 외부 함수 라이브러리는 애플리케이션 시나리오에 필요한 모든 함수 정의를 저장하기 위해 큰 사전을 사용하는 것입니다.

2.2 외부 함수 정보를 전달하기 위해 함수 매개변수를 사용하는 방법

기능적 기능과 기능 웨어하우스를 작성한 후 다음으로 고려해야 할 사항은 이 기능과 관련된 정보를 채팅 완료 모델에 전달하는 방법입니다.

OpenAI 공식 홈페이지에는 ChatCompletion.create()의 함수 매개변수를 사용하여 모델에 호출할 수 있는 외부 함수의 콘텐츠 정보를 전달한다고 설명되어 있으며, 구체적인 매개변수에 대해서는 다음과 같이 설명하고 있습니다 .

이미지-20230724094533750

함수 매개변수는 메시지 매개변수와 매우 유사하며 둘 다 여러 사전 목록을 포함합니다. 메시지의 경우 각 사전은 메시지이고, 함수 매개변수의 경우 각 사전은 함수입니다. LLM(Large Language Model)이 실제로 질의 응답을 수행할 때, function 매개변수에서 제공하는 정보에 따라 각 함수를 검색합니다.

동시에, OpenAI 공식 홈페이지에는 함수 호출 기능을 지원하는 외부 함수가 대형 모델에 반환하는 결과 유형이 json 문자열 유형이어야 함 을 명확하게 규정하고 있습니다 .

이미지-20230724092119245

즉, 함수가 받아들이는 매개변수를 JSON Schema 객체의 형태로 기술한다고 공식적으로 규정되어 있습니다 . 따라서 먼저 JSON 스키마 개체가 무엇인지 이해해야 합니다.

2.2.1 JSON 스키마 객체

JSON 스키마는 JSON 데이터의 형식과 구조를 설명하기 위한 메타데이터 표준입니다. JSON 문서의 유효성을 검사하고 주석을 달고 조작하는 데 사용됩니다. JSON Schema 자체는 JSON 형식으로 표현되어 객체 속성의 유형, 배열 길이, 숫자 및 문자열의 값 범위 등을 포함하여 데이터의 구조를 유연하게 확인할 수 있는 방법을 제공합니다 .

간단히 말해서 JSON 개체가 있는 경우 JSON 스키마를 개체의 "템플릿" 또는 "정의"로 사용하여 JSON 개체가 미리 결정된 규칙 및 구조를 준수하는지 확인할 수 있습니다. 예를 들어, 다음과 같은 간단한 JSON 스키마 예제는 개인 정보를 설명하는 데 사용됩니다.

{
    
    
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    
    
    "Name": {
    
    
      "type": "string"
    },
    "Age": {
    
    
      "type": "integer",
      "minimum": 0
    },
    "Salary": {
    
    
      "type": "number"
    },
    "IsMarried": {
    
    
      "type": "boolean"
    }
  },
  "required": ["Name", "Age"]
}
  • $schema: 사용된 JSON 스키마 사양의 버전을 정의하는 JSON 스키마 메타데이터 필드입니다.
  • type: JSON 객체가 가져야 하는 데이터 유형을 지정합니다. 이 예에서는 하나입니다 object.
  • properties: JSON 객체의 내부 속성을 기술하기 위한 규칙입니다. 각 키는 설명할 속성 이름이고 각 값은 속성이 충족해야 하는 조건인 개체입니다.
  • required: 필수 필드를 나열하는 배열입니다. 이 예에서는 Name및 은 Age필수 필드입니다.

간단히 말하면, JSON 스키마 자체에는 객체의 특정 콘텐츠 정보가 포함되지 않고 특정 유형의 객체에 대한 형식 정보만 포함됩니다.

2.2.2 외부 함수의 JSON 스키마 설명 구성

따라서 외부 함수를 대규모 모델에 전달하는 첫 번째 단계는 작성된 각 기능 함수에 해당하는 JSON 스키마 설명을 정의하는 것입니다. **현재 연령 합계를 계산하기 위해 정의된 계산_total_age_from_split_json 함수에 대해 JSON 스키마 설명을 다음과 같이 작성합니다.

calculate_total_age_from_split_json = {
    
    "name": "calculate_total_age_from_split_json",
                                       "description": "计算年龄总和的函数,从给定的JSON格式字符串(按'split'方向排列)中解析出DataFrame,计算所有人的年龄总和,并以JSON格式返回结果。",
                                       "parameters": {
    
    "type": "object",
                                       "properties": {
    
    "input_json": {
    
    "type": "string",
                                                                     "description": "执行计算年龄总和的数据集"},
                                                   },
                                        "required": ["input_json"],
                                    },
                     }

이 JSON 스키마는 calculate_total_age_from_split_json함수와 해당 매개변수를 자세히 설명합니다. 다음은 필드에 대한 자세한 설명입니다.

이미지-20230823135158679

Calculate_total_age_from_split_json[“parameters”]를 작성해야 하는 이유는 Chat 모델이 대화 중일 때 들어오고 나가는 데이터 정보가 JSON과 같은 데이터 형식으로 전송되기 때문입니다.

이미지-20230823135352743

함수의 공식 매개변수 설명은 다음과 같습니다. 모델이 JSON 입력을 생성할 수 있는 함수 목록입니다. 이는 또한 모델이 데이터 전송에 JSON 형식을 사용한다는 것을 보여줍니다. 이 입력 및 출력 형식은 엄격하게 유지되어야 합니다.

이미지-20230724101211196

2.3 함수 호출 함수 로드 방법

외부 함수 웨어하우스, 함수 함수 및 함수 함수에 해당하는 JSON Schema 객체 설명을 정의하면 기본적으로 준비 작업이 완료됩니다. 다음으로 대규모 모델의 데이터와 상호작용할 수 있습니다. 특히 대화 매개변수를 기반으로 두 개의 추가 매개변수를 추가할 수 있습니다.

  • 함수 매개변수: 외부 함수 라이브러리 선언
  • function_call 매개변수: 함수 호출 함수 실행 여부를 제어합니다.

이미지-20230724094533750

해당 코드는 다음과 같습니다.

  • 공통 대화 호출 코드
response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-16k-0613",
        messages=messages,
    )
  • 함수 호출 늘리기
functions = [calculate_total_age_from_split_json]

response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-16k-0613",
        messages=messages,
        
        # 增加这两行
        functions=functions,
        function_call="auto",  
    )

3. 함수 호출 과정 실습

**일반적으로 대형 모델에 함수 호출 기능이 포함되도록 하려면 외부 함수 라이브러리 구축 -> 함수 매개변수를 사용하여 함수 정보 전송 -> 함수 호출 함수 로드의 세 단계를 거쳐야 합니다. **위에서 언급한 연령 합계 계산을 예로 사용하는 경우 전체 프로세스는 다음과 같습니다.

  • 1단계: 데이터 준비
# 示例DataFrame
df_complex = pd.DataFrame({
    
    
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Salary': [50000.0, 100000.5, 150000.75],
    'IsMarried': [True, False, True]
})

# 将DataFrame转换为JSON格式(按'split'方向)
df_complex_json = df_complex.to_json(orient='split')
  • 2단계: 요구사항 설정

빅 모델이 이 데이터 세트에 있는 모든 사람의 연령 합계를 계산하도록 합니다.

  • 3단계: 연령 합계를 계산하는 함수 작성
def calculate_total_age_from_split_json(input_json):
    """
    从给定的JSON格式字符串(按'split'方向排列)中解析出DataFrame,计算所有人的年龄总和,并以JSON格式返回结果。

    参数:
    input_json (str): 包含个体数据的JSON格式字符串。

    返回:
    str: 所有人的年龄总和,以JSON格式返回。
    """

    # 将JSON字符串转换为DataFrame
    df = pd.read_json(input_json, orient='split')

    # 计算所有人的年龄总和
    total_age = df['Age'].sum()

    # 将结果转换为字符串形式,然后使用json.dumps()转换为JSON格式
    return json.dumps({
    
    "total_age": str(total_age)})
  • 4단계: 기능 테스트
# 使用函数计算年龄总和,并以JSON格式输出
result = calculate_total_age_from_split_json(df_complex_json)
print("The JSON output is:", result)
  • 5단계: 함수 라이브러리 정의
function_repository = {
    
    
            "calculate_total_age_from_split_json": calculate_total_age_from_split_json,
        }
  • 6단계: 함수 함수의 JSON 스키마 생성
calculate_total_age_from_split_json = {
    
    "name": "calculate_total_age_from_split_json",
                      "description": "计算年龄总和的函数,从给定的JSON格式字符串(按'split'方向排列)中解析出DataFrame,计算所有人的年龄总和,并以JSON格式返回结果。",
                      "parameters": {
    
    "type": "object",
                                     "properties": {
    
    "input_json": {
    
    "type": "string",
                                                             "description": "执行计算年龄总和的数据集"},
                                                   },
                                     "required": ["input_json"],
                                    },
                     }
  • 7단계: 함수 목록 만들기

입력 모델의 message 매개변수가 여러 메시지를 포함하는 목록인 것과 유사하게 입력 모델의 함수도 여러 함수 설명을 포함하는 목록이지만 현재는 함수가 하나뿐이므로 함수에 사전도 하나만 있습니다. 목록에서 코드는 다음과 같습니다.

functions = [calculate_total_age_from_split_json]

출력을 살펴보십시오.

이미지-20230823141518124

  • 8단계: 메시지 작성
messages=[
    {
    
    "role": "system", "content": "你是一位优秀的数据分析师, 现在有这样一个数据集input_json:%s,数据集以JSON形式呈现" % df_complex_json},
    {
    
    "role": "user", "content": "请在数据集input_json上执行计算所有人年龄总和函数"}
]
  • 9단계: 모델을 전달하고 자동으로 함수를 선택하고 계산을 완료하도록 합니다.
response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-16k-0613",
        messages=messages,
        functions=functions,
        function_call="auto",  
    )

대형 모델의 계산 결과를 살펴보십시오.

이미지-20230823142401938

함수 호출 함수 매개변수가 추가되면 데이터 반환이 다음과 같이 변경됩니다.

  • 반환된 메시지의 내용은 null이 됩니다.
  • 두 개의 키-값 쌍을 포함하는 "function_call" 사전이 추가됩니다. 키가 "name"인 키-값 쌍은 대화 상자를 완료하기 위해 호출해야 하는 함수의 이름, 즉 계산_total_age_from_split_json을 나타냅니다. -키가 "인수"인 값 쌍은 함수에 전달되어야 하는 매개변수를 나타냅니다.

따라서 **대형 모델의 반환 결과에 function_call 키워드가 포함되어 있는 경우 이는 이 보조 메시지가 외부 함수를 호출해야 함을 의미합니다. **칠판을 두드리세요. 이해해야 합니다. 이 메시지는 여전히 어시스턴트의 메시지이지만 이 메시지에는 내용이 포함되어 있지 않지만 메시지 매개변수 1에 포함될 수 있는 대체 키워드이기도 한 function_call 키워드가 포함되어 있습니다. . _

함수 호출에는 두 가지 핵심 정보가 있습니다.

  • 함수_이름
  • 인수

이 두 가지 핵심 정보는 보존되어야 합니다 .

  • 10단계: 상호작용 중 주요 정보 저장
# 保存交互过程中的函数名称
function_name = response["choices"][0]["message"]["function_call"]["name"]

# 加载交互过程中的参数
function_args = json.loads(response["choices"][0]["message"]["function_call"]["arguments"])

저장된 정보는 다음과 같습니다.

이미지-20230823144133290

그 이유는 다음과 같습니다. 우선 수요 시나리오는 다음과 같아야 합니다. df_complex_json 데이터 세트의 경우 계산_total_age_from_split_json 함수를 사용하여 모든 사람의 연령 합계를 계산합니다.

대형 모델의 경우 외부 함수의 계산 프로세스가 로컬에서 실행되므로 모델에서 반환된 함수 및 함수 매개변수에 따라 로컬에서 함수 계산을 완료한 다음 계산 프로세스와 결과를 메시지를 메시지에 추가하고 Chat Completion 모델을 호출하여 함수의 계산 결과를 두 번째로 분석하고 최종적으로 함수 계산 결과에 따라 사용자의 질문에 대한 답변을 출력합니다.

  • 11단계: 함수 개체 저장
# 保存具体的函数对象
local_fuction_call = function_repository[function_name]

local_fuction_call 출력을 살펴보세요.

이미지-20230823150153411

  • 12단계: 모델 계산 완료

function_args 객체를 local_fuction_call에 직접 전달하여 모든 매개변수를 한 번에 전송하는 코드는 다음과 같습니다.

final_response = local_fuction_call(**function_args)

최종 계산 결과를 살펴보십시오.

이미지-20230823150406475

위의 12가지 과정을 거쳐 모델은 외부 함수를 호출하여 성공적으로 계산을 완료할 수 있습니다.

  • 최종 단계: 빌드 프로세스에 메시지 추가

위에서 언급한 바와 같이, 계산, 추론 및 기타 기능을 위해 외부 함수를 호출하는 대형 모델의 프로세스 는 모델이 반환한 함수 및 함수 매개변수에 따라 로컬에서 함수 계산이 완료되고 다음과 같이 이루어져야 한다는 점을 다시 강조합니다. 계산 과정 및 결과는 메시지에 첨부되며, 채팅 완료 모델 분석 함수의 계산 결과가 2차 호출되어 최종적으로 함수 계산 결과에 따라 사용자의 질문에 대한 답변이 출력됩니다.

따라서 이 프로세스를 기반으로 프로그램을 다음과 같이 변환할 수 있습니다.

  1. 메시지에 모델의 첫 번째 반환 결과를 추가합니다.
# 追加第一次模型返回结果消息
messages.append(response["choices"][0]["message"])
  1. 메시지에 모델의 두 번째 반환 결과, 즉 외부 함수의 계산 결과를 추가합니다.
# 追加function计算结果,注意:function message必须要输入关键词name
messages.append({
    
    "role": "function", "name": function_name, "content": final_response,})

따라서 이때 메시지 내용은 다음과 같아야 합니다.

이미지-20230823152228338

  1. 채팅 완료 모델에 다시 질문하기

이 시점에서는 더 이상 모델에 반복적으로 질문할 필요가 없고 준비된 메시지를 Chat 모델에 전달하기만 하면 됩니다. 코드는 다음과 같습니다.

last_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo-16k-0613",
            messages=messages,)

최종 출력을 살펴보십시오.

이미지-20230823152442700

모델은 결국 정답을 맞췄습니다. 따라서 함수 호출에는 전체 프로세스를 올바르게 실행하기 위해 두 번의 채팅 완료 모델 호출과 한 번의 로컬 함수 계산이 필요합니다 . 전체적인 흐름도는 다음과 같습니다.

5

4. 요약

이 문서에서는 채팅 완료 모델의 함수 호출 기능에 대한 배경 정보를 제공하고 함수 호출 구현 프로세스를 자세히 설명합니다. 여기에는 문자열 형식, Json 형식 및 함수 형식의 입력을 포함하여 Chat 외부 함수 라이브러리를 구축하는 방법이 포함되며, 외부 기능 구축을 위한 JSON 및 JSON 스키마 개체와 Json 스키마 설명을 포함하여 함수를 정의하는 방법도 설명합니다. 마지막으로 함수 호출의 구현을 자세히 소개하고 전체 프로세스를 요약하여 함수 호출 적용에 대한 포괄적이고 심층적인 이해와 지침을 제공합니다.

마지막으로, 이 글을 읽어주셔서 감사합니다! 뭔가 얻었다고 느끼신다면 잊지 말고 좋아요와 북마크, 팔로우를 해주세요. 이것이 제가 계속 창작을 할 수 있는 원동력이 됩니다. 질문이나 제안 사항이 있는 경우 댓글 영역에 메시지를 남겨주시면 최선을 다해 답변하고 피드백을 수용하겠습니다. 알고 싶은 특정 주제가 있는 경우 알려주시면 기꺼이 그에 관한 기사를 작성하겠습니다. 여러분의 지원에 감사드리며, 여러분과 함께 성장하길 기대합니다!

추천

출처blog.csdn.net/Lvbaby_/article/details/131892482