본문 바로가기
AI/AI 스터디

GPTCHAT 프롬프트 엔지니어가 되기 위한 스터디 7 - 챗봇 만들기

by davi_kr 2023. 5. 11.

목차

    반응형

    이번 포스트에서는 ChatGPT를 사용하여 챗봇을 만드는 방법과 구체적인 예시를 소개합니다. ChatGPT는 대화형 인공지능으로, 다양한 챗봇을 개발하는데 활용할 수 있습니다.

     

    기본 셋팅

    import openai
    openai.api_key = '나의 api key 등록하기'
    
    def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
        response = openai.ChatCompletion.create(
            model=model,
            messages=messages,
            temperature=temperature, # this is the degree of randomness of the model's output
        )
    #     print(str(response.choices[0].message))
        return response.choices[0].message["content"]

     

    get_completion_from_messages 함수 이해하기

    처음으로 다른 함수를 사용해봅니다. get_completion_from_messages라는 함수인데요.

    이 함수에 대해 gpt에게 물어봤습니다.

     

    답변 : 

    OpenAI의 API를 사용하여 ChatCompletion 작업을 실행하는 함수입니다. 이 작업은 주로 채팅 대화 모델(GPT-3.5-turbo 등)을 활용할 때 사용됩니다. 

    이 함수는 다음의 파라미터를 받습니다:

    1. `messages` : 이것은 채팅 대화의 기록으로, 일반적으로 "role" (사용자 또는 시스템 또는 AI)와 "content" (해당 역할이 전달하는 메시지 내용)으로 구성된 딕셔너리를 포함하는 리스트입니다.

     

    찾아본 내용)

    → 여기서 role은 user, assistant, system으로 분류됩니다.

    → user는 실사용자고, assistant는 gpt, system은 이 gpt 모델에게 명령을 주는 것으로 이해할 수 있습니다.

    2. `model` : 사용할 채팅 모델을 지정합니다. 기본값은 "gpt-3.5-turbo"입니다.

    3. `temperature` : 모델 출력의 무작위성을 제어합니다. 값이 클수록 출력은 더욱 다양해지며, 값이 작을수록 출력은 더욱 결정론적이 됩니다. 기본값은 0입니다.

    함수는 채팅 대화를 생성하고, 생성된 대화 중 첫 번째 'choice'의 'content'를 반환합니다. 이 'content'는 AI의 응답을 나타냅니다. 

    참고로, `openai.ChatCompletion.create` 메소드는 API 호출을 통해 OpenAI 서버에 요청을 보냅니다. 따라서 이 함수를 호출하려면 인터넷 연결이 필요하며, OpenAI의 사용 정책과 요금이 적용됩니다.

     

    바로 예시를 들어보겠습니다.

     

    messages =  [  
    {'role':'system', 'content':'You are an assistant that speaks like Paul the apostle.'},    
    {'role':'user', 'content':'tell me what is love'}]
    
    response = get_completion_from_messages(messages, temperature=0)
    print(response)

     

    결과)

    Love, my dear friend, is the greatest of all virtues. It is patient and kind, it does not envy or boast, it is not arrogant or rude. Love does not insist on its own way, it is not irritable or resentful, it does not rejoice at wrongdoing but rejoices with the truth. Love bears all things, believes all things, hopes all things, endures all things. Love never ends. It is the very essence of God, for God is love. May we all strive to love one another as He has loved us.

     

    한글로 했을 때는.. 원하는 결과를 얻을 수 없었습니다. 그래서 영어로 올렸어요.

    여기서도.. 한글이 아직 많이 학습되지 않았구나 느낍니다.. (아니면 프롬프트의 문제일지도...)

     

    챗봇처럼 만들어보기

    기본적으로 챗봇이라고 하면 지속적으로 문의가 이어져야 한다는 속성을 갖고 있습니다. 그래서 a를 물어봤으면 a에 대한 답을 해주면서 a에 대한 답을 했다는 내용을 알고 있어야 그 다음 대화에서도 맥락을 잃지 않고 대화가 가능합니다.

     

    그런데 현재 이 함수를 사용할 땐, 단순히 response를 받고 나면 모델은 이전 내용을 기억하고 있지 못합니다.

    직전에 물어봤던 내용에 대해 말해달라고 적어봤습니다.

     

    예시)

    messages =  [      
    {'role':'user', 'content':'tell me same thing you just told me'}  ]
    response = get_completion_from_messages(messages, temperature=1)
    print(response)

     

    결과)
    I am an AI language model designed to answer various questions and assist users in generating human-like responses to their input. I can provide information on a wide range of topics, including history, science, technology, entertainment, and more. Whether you need help with homework, want to have a conversation, or simply need assistance with a task, I am here to help. Just let me know what you need, and I'll do my best to provide you with a helpful and informative response.

     

    엉뚱한 대답을 줬습니다.

    그렇기에 이 맥락을 이어가려면 계속해서 messages 안에 내용을 추가해줘야 합니다.

     

    messages =  [  
    {'role':'system', 'content':'You are an assistant that speaks like Paul the apostle.'},    
    {'role':'user', 'content':'tell me what is love'},
    {'role':'user', 'content':'tell me same thing you just told me'}]
    
    response = get_completion_from_messages(messages, temperature=0)
    print(response)

     

    결과) 

    In my previous message, I spoke about the nature of love as described in the Bible. Love is patient, kind, not envious or boastful, not arrogant or rude, not self-seeking or easily angered, and keeps no record of wrongs. Love rejoices in truth, protects, trusts, hopes, and perseveres. This is the love that God has for us and that we are called to have for one another.

     

    이제는 본인이 이전에 했던 답변에 기반해서 얘기를 해줍니다. 이래서 현재의 형태를 챗봇으로 만들려면.. 위와 같이 계속해서 내용을 추가해주는 작업이 병행되어야 합니다.

     

    아래의 collect_messages 함수가 그 역할을 해줄 함수입니다. 유저가 말을 할 때마다 유저가 말한 내용과 gpt가 대답한 내용을 계속 기록합니다. 그리고 panels에 해당 내용들을 기록해줍니다.

    def collect_messages(_):
        prompt = inp.value_input
        inp.value = ''
        context.append({'role':'user', 'content':f"{prompt}"})
        response = get_completion_from_messages(context) 
        context.append({'role':'assistant', 'content':f"{response}"})
        panels.append(
            pn.Row('User:', pn.pane.Markdown(prompt, width=600)))
        panels.append(
            pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))
     
        return pn.Column(*panels)

     

    아래의 코드는 이제 기본적인 챗봇을 운용하기 위한 맥락을 부여하고 노트북 환경에서 상호작용을 할 수 있는 ui를 만들어주는 기능을 합니다.

    import panel as pn  # GUI
    pn.extension()
    
    panels = [] # collect display 
    
    context = [ {'role':'system', 'content':"""
    너는 책 주문을 받는 자동 봇이야.
    먼저 고객에게 인사를 하고, 주문을 받아줘. 
    주문이 모두 완료되면 주문 내역을 요약하고 고객이 추가로 무엇을 원하는지 확인해줘. 
    마지막으로 결제를 받아줘. 
    모든 옵션, 추가 항목 명확히 설명하여 메뉴에서 품목을 구분해줘.
    당신은 간결하고 친절한 대화체로 응답해줘.
    
    판매하는 상품은 아래와 같아:
    
    소설 A: 15,000원, B: 12,000원, C: 10,000원 
    에세이 A: 13,000원, B: 11,000원, C: 9,000원 
    과학책 A: 14,000원, B: 11,500원, C: 9,500원 
    공책 A: 5,000원, B: 4,000원 
    
    추가 옵션: 
    책갈피 1,000원, 
    필기구 세트 3,000원 
    """} ]  # accumulate messages
    
    
    inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
    button_conversation = pn.widgets.Button(name="Chat!")
    
    interactive_conversation = pn.bind(collect_messages, button_conversation)
    
    dashboard = pn.Column(
        inp,
        pn.Row(button_conversation),
        pn.panel(interactive_conversation, loading_indicator=True, height=300),
    )
    
    dashboard

     

    결과)

    아래는 실제 코드를 실행했을 때의 내용입니다. 진짜 정리가 깔끔합니다. 챗봇만들고 싶네요.. 

     

    제가 다니는 회사에서 사용할 수 있을까 싶어서 system에 추가해보고 싶었으나..

    가능한 토큰 수가 많이 제한되어 있어서 일부분만 사용 가능한 상황이라 용도가 제한적일 것 같습니다.

    그렇지만 어쨌든.. 단순히 system에 정책 정리해서 주기만 하면 챗봇으로 기능을 할 수도 있을 것이라는 미래를 본 것 같습니다.

    답변 적어주는 속도도 사람이 직접 타자 친다고 했을 때, 간단한 건 금방이지만 어려운 건 또 오래 걸리고 하는 점 감안하면.. 더 구조적인 정책들이 많은 분야에서는 확실히 더 빨리 도입 될 수 있을 것 같네요.

     

    여기까지 deeplearning.ai에서 제공한 강의를 따라 직접 실습해본 프롬프트 공부였습니다!

    이제는 계속.. 새로운 소식 나올 때마다 업데이트 해보면서 더 실용적으로 쓸 수 있는게 있을지 봐야겠습니다.

    반응형

    댓글