본문 바로가기
Programming 개발은 구글로/기타 정보

[WEB+AI] 12일차 Chat AI + GPT

by 40대직장인 2024. 10. 29.

Chat AI + GPT

강사: 이숙번님

 

  - GPT

  : 확률높은 단어를 나열하여 문장을 생성하는 모델

 

1. Prompt Engineering

  • 분류(Text Classification): 어떤 카테고리인지 분류해줘
  • Q&A(Question Answering): 정답을 골라줘
  • 요약(summarization): 한 문장으로 요약해줘
  • 번역(Translation): 영어로 번역해줘
  • 생성(Text Generation): 글을 써줘

  - NLP(Natural Language Processing)

NLP의 Tasks들은 데이터 구성조차 다른 서로 별개의 Task인데, GPT 단일 모델이 모든 Task를 풀 수 있었고, 

심지어 그전의 모든 모델보다 성능이 뛰어났음.

-> 모든 NLP Task의 SOTA(State-of-the-Art, 최첨단) 달성

 

  - prompt로 json 파일로 변환하기

prompt = """
"괜찮은데", "생각보다 별로네", "그저그래", " 평범했어"
위 각각의 문장을 감정 분류를 해줘.
[{"괜찮은데" : "중립"}]
위의 샘플처럼 list of dictionary 로 만들어줘
"""

response = client.completions.create(
    model="gpt-3.5-turbo-instruct",
    prompt=prompt,
    temperature=1,
    max_tokens=512,    
)

response

# 줄넘김(\n)을 사용할 때
prompt = """

"""

 

# json 으로 변환
import json
result = json.loads(response.choices[0].text)
result

# 결과
[{'괜찮은데': '중립'}, {'생각보다 별로네': '부정'}, {'그저그래': '중립'}, {'평범했어': '중립'}]

# 참고
json.dump(): 파이썬 객체를 JSON 형식으로 저장할 때 사용
'[{'괜찮은데': '중립'}, {'생각보다 별로네': '부정'}, {'그저그래': '중립'}, {'평범했어': '중립'}]'

json.loads(): JSON 문자열을 파이썬 객체로 변환할 때 사용
[{'괜찮은데': '중립'}, {'생각보다 별로네': '부정'}, {'그저그래': '중립'}, {'평범했어': '중립'}]

 


JSON인코딩(Encoding)

  : JSON 인코딩은 파이썬 객체를 JSON 형식의 문자열로 변환하는 작업

 

JSON 디코딩(Decoding)

  : JSON 문자열을 파이썬 객체롤 변환하는 작업



  - gpt 사용

text = """
삼성 라이온즈 박진만 감독은 한국시리즈에서 아쉽게 준우승에 그쳤지만, 선수들에게 고마움을 표시했다.
"""

prompt = f"""{text}
--------
위 기사가 어떤 분류의 기사인지 알려줘. 아래 각 분류 중에 어떤 분류인지 0~1사이 확률로 알려줘.
["IT", "스포츠", "연애", "사회", "정치"]
결과 포맷:
{{"IT": 0.9, "스포츠": 0.1, "연애": 0, "사회": 0, "정치": 0}}
"""

response = client.completions.create(
    model="gpt-3.5-turbo-instruct",
    prompt=prompt,
    temperature=1,
    max_tokens=512,    
)

print(response.choices[0].text)

# 결과
{"IT" : 0, "스포츠": 0.9, "연애" :  0, "사회":0, "정치":0.1}

 

 


참고 글: Cognitive Prompting(인지적 프롬프팅) - 김창준

유튜브:  https://www.youtube.com/watch?v=CkCL8dV_mPk

 

 

발표자료: https://docs.google.com/presentation/d/1kayepoiTVT838Tetk02nxeqVmmS9BDc9O7n-4OzJdL8/edit#slide=id.p

 

 

너가 **을 하는 전문가라면 어떤 순서대로 이 문제를 해결할거야?, 그 순서에 맞게 내 문제를 해결해줘"

-> 출력을 한 다음에 해결하는 과정을 거쳐야 됨.


 

 

msg = [
        {"role": "system", "content": "매우 친절한 친구. 이름은 피티. 대답은 짧게"},
        {"role": "user", "content": "너에 대해 소개해줘."},     
        {"role": "assistant", "content": "안녕! 나는 피티야. 친절하게 질문에 답해줄게. 도움이 필요하면 말해줘!"},
        {"role": "user", "content": "너는 언제 만들어졌어?"}
]

completion = client.chat.completions.create(
    model="gpt-4o",
    messages=msg
)

print(completion.choices[0].message.content)

 

 

  - 챗봇

msg = [
        {"role": "system", "content": "매우 친절한 친구. 이름은 피티. 대답은 짧게"},
]

user_msg = input("user: ")
msg.append({"role" : "user", "content": user_msg})

completion = client.chat.completions.create(
    model="gpt-4o",
    messages=msg
)

print("bot: ", completion.choices[0].message.content)
msg.append({"role" : "assistant", "content": completion.choices[0].message.content})

user_msg = input("user: ")
msg.append({"role" : "user", "content": user_msg})

completion = client.chat.completions.create(
    model="gpt-4o",
    messages=msg
)

print("bot: ", completion.choices[0].message.content)
msg.append({"role" : "assistant", "content": completion.choices[0].message.content})

print(completion.choices[0].message.content)

 

 

  - 반복문 사용하기

msg = [
        {"role": "system", "content": "매우 친절한 친구. 이름은 피티. 대답은 짧게"},
]

while True:
    user_msg = input("user: ")
    msg.append({"role" : "user", "content": user_msg})

    if user_msg == "끝":
        break
        
    completion = client.chat.completions.create(
        model="gpt-4o",
        messages=msg
    )

    print("bot: ", completion.choices[0].message.content)
    msg.append({"role" : "assistant", "content": completion.choices[0].message.content})

 

  - 피자봇

prompt = """
You are OrderBot, an automated service to collect orders for a pizza restaurant.
You first greet the customer, then collects the order, and then asks if it's a pickup or delivery.
You wait to collect the entire order, then summarize it and check for a final time if the customer wants to add anything else.
If it's a delivery, you ask for an address. Finally you collect the payment.
Make sure to clarify all options, extras and sizes to uniquely identify the item from the menu.
You respond in a short, very conversational friendly style.

The menu includes
    pepperoni pizza  12.95, 10.00, 7.00
    cheese pizza   10.95, 9.25, 6.50
    eggplant pizza   11.95, 9.75, 6.75
    fries 4.50, 3.50
    greek salad 7.25
Toppings:
    extra cheese 2.00,
    mushrooms 1.50
    sausage 3.00
    canadian bacon 3.50
    AI sauce 1.50
    peppers 1.00
Drinks:
    coke 3.00, 2.00, 1.00
    sprite 3.00, 2.00, 1.00
    bottled water 5.00
"""

msg = [
        {"role": "system", "content": prompt},
        {"role": "assistant", "content": "안녕하세요. AI 피자입니다. 무엇을 도와드릴까요?"}
]

print("bot: 안녕하세요. AI피자입니다. 무엇을 도와드릴까요? ")

while True:
    user_msg = input("user: ")
    msg.append({"role" : "user", "content": user_msg})

    if user_msg == "끝":
        break

    completion = client.chat.completions.create(
        model="gpt-4o",
        messages=msg
    )

    print("bot: ", completion.choices[0].message.content)
    msg.append({"role" : "assistant", "content": completion.choices[0].message.content})

 

 


참고 영상: 제대로 알고 쓰면 약점이 거의 없다 (30년 개발자 박종천)

https://youtu.be/L8BPDWxd5K8?si=Z0Q3rFQNbL3l49lF&t=749


 

2. Function calling

: ChatGPT에게 내가 만든 함수를 설명하고, ChatGPT가 필요할 때 내가 만든 함수를 이용하는 것

 

https://platform.openai.com/docs/guides/function-calling

 

 

  - function calling을 이용하여 질문하기

 

# 두 개의 숫자를 더하는 함수 만들기
def add(a: int, b: int):
    return a + b

 

 

# ChatGPT에게 함수 설명하기
tools = [
    {
        "type": "function",
        "function": {       
            "name": "add",
            "description": "Add two numbers together",  
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {
                        "type": "integer",
                        "description": "The first number to add"
                    },                    
                    "b": {
                        "type": "integer",
                        "description": "The second number to add"
                    }
                },
                "required": ["a", "b"],
                "additionalProperties": False,
            }
        }
    }
]

msg = [
    {"role": "system", "content": "계산기"},
    {"role": "user", "content": "3-4=?"}
]

result = client.chat.completions.create(
    model="gpt-4o",
    messages=msg,
    tools=tools,        
)

result

 

 

tool_call = result.choices[0].message.tool_calls[0]
name = tool_call.function.arguments
argumnets = json.loads(tool_call.function.arguments)

print(name)
print(argumnets)

add(argumnets['a'], argumnets['b'])

 

※ 주의할 점: Object 전달된 문자열을 json.loads()로 파이썬에서 사용이 가능하도록 변환해줘야 됩니다.

 


출처: AI Hub 교육과정 - WEB+AI (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)

 

 

댓글