Azure OpenAI GPT API 의 민감정보 필터링 정보

GPT API중 completion 결과 중에 hate, self_harm, sexual, violence 이 4가지에 대한 민검정보 필터링에 대환 결과 여부와 등급이 보이는 것을 볼 수 있습니다.

이 정보를 활용하면 민감한 정보에 대한 답 자체를 보여주지 않거나 할 수 있습니다.

{
    "index": 0,
    "finish_reason": "stop",
    "message": {
        "role": "assistant",
        "content": "...",
    },
    "content_filter_results": {
        "hate": {"filtered": false, "severity": "safe"},
        "self_harm": {"filtered": false, "severity": "safe"},
        "sexual": {"filtered": false, "severity": "safe"},
        "violence": {"filtered": false, "severity": "safe"},
    },
}

한국어 형태소 분석기 – Bareun 바른

새로운 한국어 형태소분석기 바른입니다. 이런 한국어 NLP툴킷의 공개는 상업적이던 비상업적이던 늘 환영할 만한 것입니다. 우리나라의 NLP에 대한 기술은 국제적으로 매우 뒤쳐저 있기 때문입니다.

바른형태소분석기는 바른팀(바이칼에이아이, 한국언론진흥재단 공동)에서 제작한 것이라고 되어 있습니다.

간단하게 테스트해 보니 은전한닢(MeCabKR, 메카부 한국어 버전)과 비슷한 성능으로 보입니다.

사용성이 좋아 보여서 다음번에 테스트를 더 해본 후에 사용할 일이 있으면 해보려고 합니다.

하지만 요즘 LLM의 발전속도가 너무 빨라서 쓸일이 없을 것 같기도 합니다만.

https://bareun.ai/

Adsense의 GDPR 메세지 생성 요청

블로그에 애드센스를 붙이긴 했지만 수입이 거의 없기 때문에 접속을 자주 안합니다.

오랜만에 접속했더니 아래와 같은 경고 메세지가 보입니다.

내용은 아래에 있습니다.

2024년 1월 16일부터 EEA 및 영국 사용자에게 광고를 게재하는 모든 게시자는 Google에서 인증한 동의 관리 플랫폼(CMP)을 사용해야 합니다. Google의 자체 동의 관리 솔루션을 포함하여 Google에서 인증한 CMP 이면 어떤 것이든 이 목적으로 사용할 수 있습니다. Google의 동의 관리 솔루션을 사용하는 데 관심이 있으면 먼저 GDPR 메시지를 설정하세요.

GDPR 메시지 만들기를 진형하면 생성 화면과 함께 메세지 만들기에 들어가는데 이 작업을 하고 나면 이제 GDPR 메세지가 접속자에게 보이게 됩니다.

GDPR을 준수하면 개인을 추적할 수 없습니다.
GDPR을 준수하지 않으면 애드센스의 리타겟팅 추적 광고는 보이지 않게 됩니다.
GDPR메세지가 보이면 접속자는 자신을 추적하게 허용할지 아닐지를 결정할 수 있고 추적을 허용하지 않게 하면 사이트에서 강제로 이탈되거나 정보의 일부만 볼 수도 있습니다.

그리고 개인을 추적하지 않아도 광고는 계속 내보냅니다.
아무 광고나 보이게 된다는 점의 차이만 있을 뿐입니다.

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)