ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ChatGPT 프롬프트 엔지니어링 #7. Chatbot (Isa Fulford, Andrew Ng)
    Data & ML & AI/LLM 2023. 5. 28. 02:52
    반응형

    LLM, ChatGPT를 이용해서 단순하게 우리가 원하는 정보, 답변을 얻어낼 수도 있겠지만,

     

    우리가 원하는 챗봇 서비스를 구현할 수도 있습니다.

    이게 우리가 알기를 진정 원하던 남이 만든 기술로 돈을 버는 방법 중 하나겠죠?

     

    우리가 원하는 특정한 형태로 답변하는 챗봇을 만들기 위해서는

    간단한 사전작업이 필요합니다.

     

     

    system vs assistant vs user

    위의 사진에서 messages는 연극 대본같은 느낌으로 설정되어있습니다.

    # 사전 세팅
    system    : "어시스턴트(= 모델, 챗봇)! 넌 이제부터 셰익스피어처럼 말하는 챗봇이야!"
    
    # 채팅 과정
    user      : "농담 하나 해봐"
    assistant : "왜 닭이 길을 건넜을까요?"
    user      : "모르겠는데?"

    그 다음 답변을 받기 위해,

    사전 세팅 내용과 전체적인 채팅 과정을 messages라는 변수에 모두 집어 넣어 주는겁니다.

    • role: system, assistant, user 3개 중 하나
    • content: 세팅 내용(system), 대화 내용(assistant, user)

     

    • system: 사전 세팅 및 설정
    • assistant: 챗봇 모델
    • user: 챗봇과 대화하는 유저

     

    나만의 챗봇 만들기

    ChatGPT는 너무나도 범용적입니다.

    내 서비스에 적용하기 위해서는 내 서비스의 성격에 맞는 답변을 하도록 세팅을 해주어야 합니다.

     

    강의에서는 셰익스피어처럼 말하는 챗봇을 셋팅했는데, 저는 중2병 챗봇을 셋팅해보겠습니다.

    import openai
    
    # openai.api_key  = 'OPENAI_API_KEY'
    openai.api_key  = "########"
    
    # (messages 입력 -> 챗봇 답변 출력) 함수
    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
        )
        return response.choices[0].message["content"]
    
    
    messages =  [  
    {'role':'system', 
     'content':"""넌 다크판타지에 빠진 중2병처럼 말하는 어시스턴트야. 
      유저의 모든 말에 대해 중2병 같은 말투로 답변해."""},    
    {'role':'user',
     'content':'안녕, 너 이름이 뭐니?'},
    ]
    
    response = get_completion_from_messages(messages)
    print(response)

    본인을 어둠의 마법사라 칭하는 챗봇이 만들어졌습니다!

    주의할 점

    모든 대화 내용을 계속해서 누적해 나가야 합니다.

     

    (messages에 이전 설정, 대화를 누적하지 않은 경우)

    바로 전에 했던 대화를 기억하지 못합니다.

     

    (messages에 이전 설정과 대화를 누적한 경우)

     

    번외1

    챗봇서비스를 굳이 주피터노트북에서 배포하지는 않겠지만,

    panel라이브러리를 이용해서 구현하는건 가능합니다.

    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)

    messages 대신 context라는 변수를 사용했습니다.(변수명 차이이므로 상관 없습니다.)

    이제 챗봇과 대화를 할 때마다, user와 assistant의 대화 내용이 context에 append 될겁니다.

    import panel as pn  # GUI
    pn.extension()
    
    panels = [] # collect display 
    
    context = [  
    {'role':'system', 
     'content':"""넌 다크판타지에 빠진 중2병처럼 말하는 어시스턴트야. 
      유저의 모든 말에 대해 중2병 같은 말투로 답변해."""},    
    ]  # 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

    별로라고 하자마자 본인이 중2병처럼 말하고 있다고 성토합니다.

     

    번외2

    system에 필요한 정보를 모두 때려박고, 비즈니스용 챗봇을 만들 수도 있습니다.

    강의에서는 레스토랑 주문대응 챗봇을 만들었습니다.

    import panel as pn  # GUI
    pn.extension()
    
    panels = [] # collect display 
    
    context = [ {'role':'system', 'content':"""
    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 \
    """} ]  # 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

    하지만 여기서도 포인트를 잘못잡아 답변해주고 있네요

     

     

    ChatGPT 프롬프트 엔지니어링 강의 목록

    반응형

    댓글

Designed by Tistory.