[LLM] 프롬프트를 활용하며 느낀점 & 효과가 있던 방법 2편

2024. 8. 28. 22:36DL

지난번 소개드린 1편에 이어서 2편을 적어보려 합니다.
https://todaycodeplus.tistory.com/72

 

[LLM] 프롬프트를 활용하며 느낀점 & 효과가 있던 방법 1편

오늘은 프롬프트를 활용하며 느낀점을 한번 정리해보려고 합니다. 본격적으로 프롬프트를 활용해서 서비스를 개발하기 시작한것은 약 3개월 전 입니다. 그 당시 저는 프롬프트라곤 코드 작성

todaycodeplus.tistory.com

 

1. 구조화된 출력 (Structured output)

사실 지금은 크게 의미가 없을 수 있습니다. 왜냐하면 OpenAI에서 Structured Output을 지원하는 API를 제공하기 시작했기 때문이죠
https://platform.openai.com/docs/guides/structured-outputs

그러나 어떻게 하면 구조화된 출력을 만들수 있는지 알고 쓰는것과 모르고 딸깍하는것은 차이가 있다는 생각으로 글을 적어보도록 하겠습니다. 

우선 첫번째로 할 것은 바로 Few-Shot Eng입니다. 프롬프트에 여러 예시를 통해 질문의 답변을 제어할 수 있는데요, 이것을 통해서 input과 output에 대한 예시를 주어 LLM의 답변 방향을 결정 할 수 있습니다. 

1. Identify the language of the input question.
2. Determine if the question is requesting a translation.
3. The response must be in JSON format as shown in the examples.
4. If a translation is requested but no target language is specified, default to Korean.

Examples 1:
    Input: "안녕 반가워"
    Output:
    {{ 
    "language": "Korean",
    "translation_request": false,
    "translate_to": null 
    }}
Examples 2:
    Input: "hello hi"
    Output:
    {{ 
    "language": "English",
    "translation_request": false,
    "translate_to": null 
    }}
    
[your response here]

 

한가지 방법이 더 있는데요 구조화된 출력을 하기 위해서 답변부의 형식을 변경하는것 입니다. 위에서 보여드린 예제의 Your Response Here 부분을 수정하는 것 입니다.

# Example 1
{{ 
        "language": "[language]",
        "translation_request": [true/false],
        "translate_to": "[target language]"  // If translation is not requested, use null. If no target language is specified, default to Korean.
}}

# Example 2
{{ 
        "TEST_KEY": "[Your Response Here]"
}}

다음과 같이 JSON형식으로 작성하고 각각의 Dict Key값에 어떤것이 들어가야하는지 정의할 수 있습니다. 아니면 단일 답변인 경우에는 JSON구조의 Key를 적어주시고 Value에  Your Response Here을 적어 여기에 답을 하라는 표현을 전달합니다.

 

2. 데이터 추출을 위한 프롬프트 구조

우리는 데이터 추출을 하기위해서 LLM을 사용하기도 합니다. 예를 들어서 뉴스 기사에서 언급된 상표명만 추출 한다던가, 아니면 유저가 작성한 코맨트에서 언급된 상품만을 추출한다던가 하는 일등이 있죠, 이런 간단한 작업은 아주 성능이 낮은 모델 "ex) GPT-4o-mini" 에서도 아주 잘 추출을 하곤 합니다. 하지만 "더 잘" 추출하기 위해서는 프롬프트 엔지니어링이 필요합니다. 

 

저는 이런 추출형 프롬프트의 구조를 4단계로 나눕니다.

  1. 제공 정보
    이 부분에는 내가 제공할 정보 예를 들었던 기사, 코맨트 등등을 입력합니다.
  2. 추출 규칙
    내가 추출할 내용에서 뽑을 방법, 내용을 정의 합니다. 
    예를 들어서 ["추출 할 대상", "추출 된 항목에 대한 규칙", "추출 된 항목을 구조화하는 RE식" ...] 같은 것들이 들어가게 됩니다.
  3. 답변 규칙
    이제 구조화되어 추출된 데이터를 출력 할 수 있도록 구조화 해야합니다. (여기서 구조화는 Value값의 구조화가 아닌 출력 format을 의미합니다.) 구조화를 위한 규칙을 정합니다. 구조화에 대한 내용은 1번을 참고해 주세요
  4. 출력 시작

이런식으로 구성하면 다음과 같은 프롬프트를 만들 수 있습니다.

MILK_NAME_EXTRACT_PROMPT = PromptTemplate(
        input_variables=["news_main"],
        template=dedent("""
        당신은 정해진 규칙에 맞게 주어진 정보 속에서 데이터를 추출하는 AI데이터 추출기 입니다. 주어진 news_main 값에서 우유의 제조사(OEM)와 우유의 이름을 추출해야 합니다.
        1. 제공 정보
            {news_main}
        2. 추출 규칙
            - 추출 할 OEM이름 및 제조사 이름을 모두 영문(Eng)으로 작성해야 합니다. (ex. 서울우유 무균 흰우유 -> seoulmilk/sterile_white_milk)
            - 제조사(OEM)과 우유이름은 '/'로 구분해야 합니다.(ex. 서울우유 무균 흰우유 -> seoulmilk/sterile_white_milk)
            - 모든 문자는 소문자로 작성되어야 합니다. (ex. 서울우유 무균 흰우유 -> seoulmilk/sterile_white_milk)
            - 제조사(OEM) 및 우유이름에 들어가는 특수문자는 모두 제거합니다. (매일우유@무균@흰우유/ -> mailmilk/sterile_white_milk)
            - 작성된 이름의 띄어쓰기는 모두 '_'로 대체 합니다.

        3. 답변 규칙
            - 답변은 반드시 JSON구조로 이루어져야 합니다.
            - JSON 구조는 다음과 같습니다.
                {{"name" : ["milk_name1", "milk_name2:, ...]}}
            - JSON을 출력할 때 markdown 형식을 사용하지 않습니다. 
        
        지금부터 추출을 시작합니다.
        [your response here]
        """)
    )

 

 

오늘도 두개정도의 팁을 던지고 갑니다. 모두 프롬프트 작성하며 신나게 LLM과 놀기를 바랍니다. 

그래서 제가 만든  Prompt가 들어간 서비스는??

https://play.google.com/store/apps/details?id=com.autocrypt.evpedia&pcampaignid=web_share

 

EVPEDIA - AI 전기차 딜러 - Google Play 앱

나만을 위한 전기차 AI 딜러. 최신 전기차 뉴스, 충전소 위치, 구매 상담 등을 손쉽게 탐색해보세요.

play.google.com


짜잔 드디어 출시가 됐습니다. 모두 한번씩 사용해 보세요!!