카테고리 보관물: 미분류

Azure OpenAI API로 GPT 사용하는 예제

Azure cloud (애저 클라우드, 이하 Azure)에서 지원하는 OpenAI API로 GPT를 사용하는 방법입니다.

OpenAI에서 제공하는 Python 클라이언트 패키지를 설치해서 똑같이 사용하면 됩니다.
별도의 패키지가 필요하지는 않습니다.
OpenAI의 Python 패키지에 이미 Azure를 지원하기 위한 코드가 들어 있습니다.
Microsoft가 OpenAI의 가장 큰 투자자이고 협력관계이기 때문인 것 같습니다.

단, openai의 API를 사용할 때와 다른 점은 다음과 같습니다.

  • openai를 처음 초기화 할 때 다른 Azure OpenAI에만 필요한 설정값 필요
  • completion을 생성할 때 파라미터가 조금 다름

자세한 내용은 애저(Azure)에서 제공하는 문서를 참고하면 됩니다.

예제는 아래의 소스 코드를 참고하세요.

import os
import openai
import toml
import base64


openai.api_key = "  ***** 본인의 API키 ***** "
openai.api_base = "https://instance-openai-0.openai.azure.com/"
openai.api_type = "azure"
openai.api_version = "2023-07-01-preview"
deployment_id: str = "deployment-gpt-4-32k"  # 본인의 배포 ID로 변경

instructions: list[dict] = [
    {"role": "system", "content": "you are an assistant for software engineers"},
]

messages: list[dict] = [
    # {"role": "user", "content": "What is ticket price for cruise ship"}, # for function_call
    {"role": "user", "content": "샌프란시스코의 관광명소를 알려주세요."},  # for normal reply
]

response: openai.ChatCompletion = openai.ChatCompletion.create(
    # model="gpt-4", # this is for the OpenAI API, not for the Azure API
    deployment_id=deployment_id, # this is for the Azure API, not for the OpenAI API
    # engine=deployment_id, # same as above
    messages=instructions + messages,
    functions=[
        {
            "name": "get_ticket_price",
            "description": "Get ticket price of cruise ship",
            "parameters": {
                "type": "object",
                "properties": {
                    "start_location": {
                        "type": "string",
                        "description": "Start location of the cruise ship",
                    },
                    "end_location": {
                        "type": "string",
                        "description": "End location of the cruise ship",
                    },
                },
            },
            "required": ["start_location", "end_location"],
        },
    ],
    function_call="auto",
    temperature=0.90,
    max_tokens=800,
    top_p=0.99,
    frequency_penalty=0,
    presence_penalty=0, 
    stop=None)

if len(response.choices) > 0:
    if response.choices[0].finish_reason == "function_call":
        print("=====================================")
        print("function_call is called")
        print(response.choices[0].message)
        print("=====================================")
    else:
        print("=====================================")
        print("reply is returned")
        print("role: ", response.choices[0].message.role)
        print("message: ", response.choices[0].message.content)
        print("=====================================")
else:
    print("No response.")

Github에도 소스를 올려놨으니 필요하면 편하게 가져가세요.

https://github.com/euriion/llm-materials/blob/main/azure-openai-api/azure-openai-api-test.ipynb

초거대 언어 모델이란? LLM

간단한 요약 정리 LLM

LLM : Large Language Model의 약어로 한국어로 초거대 언어 모델이라고 합니다.

Large라는 단어가 초거대라는 뜻은 아니지만 어느덧 그런 의미로 쓰게 되었으며 이제는 LLM을 다 묶어서 초거대언어모델이라고 하는 일반명사로 생각하는 것이 좋습니다.

LLM은 딥러닝(Deep Learning)으로 만든 파라미터가 약 1천억개가 넘는 언어 처리를 위한 모델을 말합니다.

언어 처리는 언어 번역, 요약, 생성, 문장 완성, 감성 분류, 키워드 추출, 개체명 인식 같은 것들입니다.

LLM에서 말하는 파라미터는 딥러닝에서 레이어로 데이터가 흘러 갈 때 곱셈을 해주는데 쓰는 실수형 가중치 값들을 말합니다.

파라미터가 약 1천억개가 넘어가게 되면 기존 언어모델은 보여주지 않았던 매우 창발적인 답을 하고 마치 인간인 것처럼 지능적으로 답을 하는 특성을 가집니다.

현재 시점으로 LLM으로 가장 유명한 것은 GPT, BERT, PALM이 있습니다.

모두 구조와 학습데이터가 다르고 성능도 다듭니다.

이 외에도 수 만개의 LLM 모델이 있으며 각기 따로 구조와 특징을 공부해야 합니다.

OpenAI API – GPT function calling 사용법

GPT function calling

OpenAI의 GPT API에서 얼마전부터 새롭게 제공하는 function calling 기능에 대한 설명입니다.

GPT function calling은 게임 체이저(Game changer)라고 블릴 만큼 굉장히 편하고 유용한 기능입니다. 이 기능을 이용하면 괜찮은 GPT 응용 애플리케이션을 매우 간단하게 만들 수 있습니다.

GPT function calling 설명

GPT function calling을 GPT에게 프롬프트와 함께 함수의 정의 목록을 함께 전달하면 GPT가 프롬프트를 보고 전달된 함수 중 하나를 호출해야 한다고 판단하면 그 중 하나를 호출해서 결과를 자신에게 전달해 달라고 하고 그 전달된 결과를 입력 받아 최종 메세지를 만드는 것을 말 합니다.

간단하게 플로우를 그려 보면 다음과 같습니다.

  1. GPT에게 프롬프트(질문)과 함께 함수 목록을 전달
  2. GPT가 프롬프트를 보고 함수를 실행 안해도 되면 그대로 메세지를 답변
  3. 만약 함수를 실행해서 그 결과가 필요하다면 함수를 실행해달라는 결과를 리턴
  4. GPT가 호출해달라고 한 함수를 사용자가 호출해서 결과값을 GPT에게 주고 다시 호출
  5. GPT가 이전의 프롬프트와 함수의 결과를 다 합쳐서 메세지를 만들어서 전달
  6. 만약 5에서 다시 다른 함수를 호출해야 한다면 3번으로 가게 됨

GPT function calling 예제 코드

아래 Python 코드를 살펴보시면 됩니다. 무척 쉽습니다.

중요한 점은 콘텍스트를 계속 유지해줘야 한다는 것입니다.

그래서 과거의 대화내역 뒤에 함수의 결과값을 다시 붙여줘야 제대로 대답합니다.

import openai
openai.api_key = "***** openai api key *****"

chat_completion: openai.ChatCompletion = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {
            "role": "system",
            "content": "your name is Ironman. you anser in Korean",
        },
        {
            "role": "user",
            "content": """What is the weather like today?""",
        }
    ],
    functions=[
        {
            "name": "get_wether",
            "description": "get wether information",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "city or nation name",
                    }
                },
                "required": ["location"],
            },
        }],
    function_call="auto",
)

if chat_completion.choices[0].finish_reason == "function_call":
    function_name = chat_completion.choices[0].message.function_call.name
    functoin_arguments = chat_completion.choices[0].message.function_call.arguments
    # 함수 실행 부분을 추가
    # function_result에는 함수를 실행하고 난 결과값을 넣어준다.
    function_result = "function result"

    messages = [
        {
            "role": "system",
            "content": "your name is Ironman. you anser in Korean",
        },
        {
            "role": "user",
            "content": """What is the weather like today?""",
        },
        {
            "role": "function",
            "name": function_name,
            "content": function_result
        }
    ]
    
    second_chat_completion: openai.ChatCompletion = openai.ChatCompletion.create(
        model="gpt-4",
        messages=messages,
    )
    result_message = second_chat_completion.choices[0].message.content
else:
    result_message = chat_completion.choices[0].message.content

print(result_message)

BigQuery로 KNN 최근접 이웃 계산하기

BigQuery로 Consine similarity를 계산해서 KNN 최근접 이웃을 계산하는 예제 코드입니다.

KNN = K Nearest Neighbor = 최근접 이웃
최근접 이웃은 기계학습에서 매우 오래된 기법입니다. 간단하지만 매우 정확한 시스템이지만 데이터프로세싱에 많은 자원이 소모되기 때문에 잘 사용되지는 않습니다.

Cosine Distance함수는 BigQuery에서 빠른 것을 제공을 해주기 때문에 따로 만들지 않고 제공하는 것을 그냥 쓰면 됩니다.

하지만 결국 BigQuery를 쓴다 해도 cross join을 해야합니다.

아무리 빅쿼리라고 해도 처리하는 데이터가 조금만 커도 cross join은 잘 실행되지 않습니다.
그래서 빅쿼리로 하는 KNN은 실용성이 있다고 보기는 어렵습니다.

작은 데이터에 대해서만 가능하기 때문에 그 점을 참고하시기 바랍니다.

WITH tbl_left AS (SELECT group_id, word AS word1, vector AS vector1
              FROM recsys.recsys_word2vec
              WHERE _PARTITIONTIME IS NOT NULL
              AND group_id = '12345'
              )
   , tbl_right AS (SELECT group_id, word AS word2, vector AS vector2
              FROM recsys.recsys_word2vec
              WHERE _PARTITIONTIME IS NOT NULL
              AND group_id = '12345'
              )
select a.group_id, a.word1
, ARRAY_AGG(b.word2 ORDER BY ML.DISTANCE(a.vector1, b.vector2, 'COSINE') DESC LIMIT 50) as nn50
FROM tbl_left a
               JOIN tbl_right b
                    ON a.group_id = b.group_id AND a.word1 != b.word2
GROUP BY a.group_id, a.word1
;

유용한 리눅스 커맨드 Linux Command List


리눅스 커맨드는 잘 배우면 간단한 작업을 즉시 하기에 매우 편리하고 좋지만

제대로 신경쓰지 않으면 좀처럼 익히기 쉽지 않습니다.

적응하기 어렵습니다. 그래서 시간 날 때 연습하고 연마해야 합니다.

배울 때는 고생스럽지만 배우고 나면 생산에 매우 큰 도움이 되는 도구가 됩니다.

능력있는 개발자, 엔지니어가 되려면 필수 명령어는 반드시 외워서 사용해야 합니다.

잘 정리된 문서가 있어 여기 링크를 올려 둡니다.

https://github.com/jlevy/the-art-of-command-line/blob/master/README-ko.md