프롬프트 설계 및 엔지니어링은 대형 언어 모델(LLM)에서 의미 있는 결과를 도출하는 데 있어 가장 접근하기 쉬운 방법 중 하나로 주목받습니다. 그러나 대형 언어 모델의 프롬프트 설계는 복잡한 미로를 탐색하는 것처럼 느껴질 수 있습니다.
프롬프트 설계는 탐구가 필요한 몇 가지 기법이 있는 비교적 새로운 분야입니다. 이에 대한 개념을 이해하려면 프롬프트 엔지니어링 가이드를 확인해 보세요. 그 밖에도, LLM에서 최상의 결과를 얻으려면 다양한 지시문과 예시를 조합하여 실험하면서 원하는 출력을 얻는 과정을 거쳐야 합니다. 그뿐만 아니라, 설령 이상적인 프롬프트 템플릿을 찾더라도 그 프롬프트가 다른 LLM에 대해서도 계속 동일한 성과를 낼 것이란 보장도 없습니다. 결과적으로, 모델 간에 프롬프트 템플릿을 이전하거나 변환하는 데 더 많은 시간을 쓰게 됩니다.
LLM 기반 애플리케이션 개발 중에 겪을 수 있는 '프롬프트 피로'를 덜어드리고자, 공개 미리보기에서 Vertex AI Prompt Optimizer를 발표합니다. 이 블로그에서는 Python용 Vertex AI SDK를 사용하여 Vertex AI Prompt Optimizer를 시작하는 방법을 알아봅니다. 이 기사를 다 읽어 보시면 Vertex AI Prompt Optimizer에 대해, 또한 이 최적화 도구가 어떻게 프롬프트 엔지니어링에 소요되는 시간과 노력을 줄이는 동시에 GenAI 애플리케이션에 적합한 고성능 프롬프트를 준비하는 데 도움이 되는지 더 잘 이해하시게 될 것입니다.
Vertex AI Prompt Optimizer는 사용자가 Vertex AI에서 선호하는 모델에 가장 적합한 최고의 프롬프트(지시문과 데모)를 찾는 데 도움이 되는 프롬프트 최적화 서비스입니다. 지시문에는 프롬프트 템플릿의 시스템 지시문, 컨텍스트, 작업이 포함되고 데모는 모델 응답에서 특정 스타일 또는 톤을 유도하기 위해 프롬프트에서 제공되는 퓨샷 예시입니다. Vertex AI Prompt Optimizer는 (NeurIPS 2024에서 승인된) 자동 프롬프트 최적화(APO) 방법에 대한 Google Research의 논문을 기반으로 합니다.
아래와 같이 수학 문제를 풀고 싶다고 생각해 보세요. 문제를 풀려면 명확한 지시문과 예시가 필요합니다. 지시문을 통해 문제 해결의 규칙(예: 음수 처리 방법)을 알 수 있고, 예시를 통해 규칙 적용 방식을 이해할 수 있습니다. 이것이 바로 Vertex AI Prompt Optimizer의 기본 개념입니다.
최상의 지시문과 예시를 찾기 위해 Vertex AI Prompt Optimizer는 반복적인 LLM 기반 최적화 알고리즘을 사용합니다. 이 알고리즘에서는 최적화 도구 모델과 평가자 모델이 함께 작동하여 후보 프롬프트를 생성 및 평가한 후 사용자가 최적화하려는 평가 측정항목을 기반으로 최상의 지시문과 데모를 선택합니다. 아래에서 Vertex AI Prompt Optimizer의 작동 방식을 그림으로 확인할 수 있습니다.
Vertex AI Prompt Optimizer는 라벨링 된 몇 가지 예시(입력값-실측 출력값 쌍)와 최적화 설정을 통해 대상 모델에 최상의 프롬프트(지시문과 데모)를 찾아 사용자가 들이는 시간과 노력을 크게 절약해 줍니다. 궁극적으로 이 제품은 프롬프트 설계 및 엔지니어링 과정을 간소화하고 LLM 기반 애플리케이션의 전반적인 품질을 향상시킵니다. 이제 사용자는 Vertex AI에서 특정 작업에 대한 새 프롬프트를 만들거나 한 모델에서 다른 모델로 프롬프트를 손쉽게 변환할 수 있습니다.
이제 Vertex AI Prompt Optimizer의 작동 방식을 더 잘 이해하게 되었으므로, Vertex AI에서 Google 모델과 함께 사용할 수 있게 프롬프트를 향상시키는 방법을 살펴보겠습니다.
더 건강한 음식을 조리하는 방법을 추천하는 간단한 AI 요리 도우미를 개발한다고 상상해 보세요. 예를 들어, "설탕과 건강에 해로운 지방의 사용은 최소화하면서도 여전히 맛있고 만족스러운 건강 디저트를 만드는 방법은 무엇인가요?"라고 묻습니다. 그러면 AI 요리 도우미가 이렇게 답합니다. "레시피에서 설탕과 건강에 해로운 지방의 사용을 최소화하면서도 균형 잡힌 음식을 만들 수 있는 몇 가지 비결을 알려드리겠습니다." 아래는 생성된 답변의 예입니다.
AI 요리 도우미의 초기 버전에서는 다음과 같이 간단한 프롬프트 템플릿과 함께 LLM을 사용합니다.
맥락이 있는 질문을 받으면 질문에 대한 정답을 제시하세요. \ n질문: {{question}}\n맥락:{{context}}\n답변: {{target}}
수집한 Q&A 평가 데이터 세트와 Vertex AI GenAI Evaluation을 사용하여 계산한 Q&A 평가 측정항목을 기반으로, AI 요리 도우미의 초기 버전은 고품질의, 상황에 맞는 답변을 생성할 수 있습니다. 다음은 평가 측정항목 보고서를 요약한 것입니다.
나쁘진 않지만, 관련 질문에 대해 생성된 답변의 질적인 면에서는 개선의 여지가 있습니다. 요리 도우미를 위해 보다 효율적인 LLM으로 Gemini 1.5 Flash를 사용하고 싶지만 Gemini 1.5 Flash로 작업을 완료하기 위해 보다 성능이 뛰어난 프롬프트 템플릿을 찾을 수 있는 Gemini 모델 제품군을 이전에 사용해 본 경험이 없다고 가정해 보겠습니다. 바로 이런 경우에 Vertex AI Prompt Optimizer를 사용할 수 있습니다.
Vertex AI Prompt Optimizer를 사용하여 프롬프트 템플릿을 강화하려면 다음 단계를 따르세요.
우선, 최적화하려는 프롬프트 템플릿을 준비하세요. Vertex AI Prompt Optimizer가 필요로 하는 프롬프트는 주어진 작업에 대한 모든 쿼리에서 공유되는 프롬프트 템플릿의 고정된 부분인 지시문 템플릿과 작업을 기반으로 변경되는 프롬프트 템플릿의 동적 부분인 컨텍스트 및 작업 템플릿이 모두 포함된 프롬프트입니다. Q&A 작업에서 Vertex AI Prompt Optimizer와 함께 사용하기 위해 준비한 원본 템플릿이 아래에 있습니다.
INSTRUCTION_TEMPLATE = """
맥락이 있는 질문을 받으면 질문에 대한 정답을 제공하세요.
"""
CONTEXT_TASK_TEMPLATE = """
질문: {{question}}
답변: {{target}}
"""
다음으로, Vertex AI Prompt Optimizer는 최적화 과정에서 사용될 라벨링 된 샘플(입력값-실측 출력값 쌍)이 포함된 CSV 또는 JSONL 파일을 필요로 합니다. 이 사용 사례에서는 대상 모델이 어려움을 겪는 소스 모델의 예시에 레이블을 지정하는 것이 좋습니다. 이는 개선이 필요한 부분을 파악하는 데 도움이 됩니다. 아래에서 Google Cloud 버킷에 업로드하는 샘플의 예를 확인할 수 있습니다.
{"target":"Here\'s how to tackle those delicious red meats and pork while keeping things healthy:\\n\\n**Prioritize Low and Slow:**\\n\\n* **Braising and Stewing:** These techniques involve gently simmering meat in liquid over low heat for an extended period. This breaks down tough collagen, resulting in incredibly tender and flavorful meat. Plus, since the cooking temperature is lower, it minimizes the formation of potentially harmful compounds associated with high-heat cooking. \\n\\n* **Sous Vide:** This method involves sealing meat in a vacuum bag and immersing it in a precisely temperature-controlled water bath...","question":"What are some techniques for cooking red meat and pork that maximize flavor and tenderness while minimizing the formation of unhealthy compounds? \\n\\nnContext:\\nRed meat and pork should be cooked to an internal temperature of 145\\u00b0F (63\\u00b0C) to ensure safety. \\nMarinating meat in acidic ingredients like lemon juice or vinegar can help tenderize it by breaking down tough muscle fibers. \\nHigh-heat cooking methods like grilling and pan-searing can create delicious browning and caramelization, but it\'s important to avoid charring, which can produce harmful compounds. \\n"}
프롬프트 최적화 작업을 실행하려면 Vertex AI Prompt Optimizer도 최적화 설정을 구성해야 합니다. Vertex AI Prompt Optimizer 작업은 Vertex AI Training Custom Job으로 실행됩니다. Vertex LLM API에서 지원하는 모든 Google 모델과 광범위한 평가 측정항목, 계산 기반, LLM 기반 또는 심지어 사용자가 정의한 모델도 지원합니다. Vertex AI Prompt Optimizer가 Vertex Rapid Evaluation Service와 통합되어 있기 때문입니다. 이러한 구성을 전달하기 위해 Vertex AI Prompt Optimizer는 JSON 구성 파일의 Google Cloud Bucket 파일 경로 또는 인수 목록을 허용합니다. 다음은 Vertex AI Prompt Optimizer의 기본 구성을 보여주는 몇 가지 예입니다.
params = {
'num_steps': OPTIMIZATION_STEPS,
'system_instruction': SYSTEM_INSTRUCTION,
'prompt_template': PROMPT_TEMPLATE,
'target_model': TARGET_MODEL,
'eval_metrics_types': EVALUATION_METRICS,
'optimization_mode': OPTIMIZATION_MODE,
'num_template_eval_per_step': OPTIMIZATION_PROMPT_PER_STEPS,
'num_demo_set_candidates': DEMO_OPTIMIZATION_STEPS,
'demo_set_size': DEMO_OPTIMIZATION_PROMPT_PER_STEPS,
'input_data_path': INPUT_DATA_FILE_URI,
'output_data_path': OUTPUT_DATA_FILE_URI,
}
Vertex AI Prompt Optimizer를 사용하면 지시문만, 데모만 또는 둘 다 최적화하여(optimization_mode
) 프롬프트를 최적화할 수 있습니다. 또한 시스템 지시문, 최적화할 프롬프트 템플릿(system_instruction
, prompt_template
), 최적화하려는 모델(target_model
)을 설정한 후에는 평가 측정항목, 프롬프트 개선에 사용되는 반복 횟수 등을 설정하여 최적화 프로세스를 조정할 수 있습니다. 지원되는 최적화 매개변수에 대해 자세히 알아보려면 설명서를 확인하세요.
샘플 및 구성 관련 작업을 모두 마쳤으면 아래와 같이 Google Cloud 버킷에 업로드합니다.
from etils import epath
# 구성 업로드
with epath.Path(CONFIG_FILE_URI).open('w') as config_file:
json.dump(args, config_file)
config_file.close()
# 프롬프트 옵트 데이터 세트 업로드
prepared_prompt_df.to_json(INPUT_DATA_FILE_URI, orient="records", lines=True)
이제 Python용 Vertex AI SDK를 사용하여 첫 번째 Vertex AI Prompt Optimizer 작업을 실행할 모든 준비가 완료되었습니다.
WORKER_POOL_SPECS = [{
'machine_spec': {
'machine_type': 'n1-standard-4',
},
'replica_count': 1,
'container_spec': {
'image_uri' : APD_CONTAINER_URI,
'args': ["--config=" + CONFIG_FILE_URI]
}}]
custom_job = aiplatform.CustomJob(
display_name=PROMPT_OPTIMIZATION_JOB,
worker_pool_specs=WORKER_POOL_SPECS,
)
custom_job.run()
Vertex AI Prompt Optimizer가 Vertex AI Prompt Optimizer 컨테이너를 사용하여 Vertex AI Training Custom Job으로 실행되는 방식에 주목하세요. 이 서비스가 Vertex AI Training과 Vertex AI GenAI Evaluation을 모두 활용한다는 사실은 어떻게 Vertex AI가 GenAI 실행을 위한 플랫폼을 제공하는지를 보여주는 증거입니다. 이 경우에서처럼 직접적인 연구자들에게도 마찬가지입니다.
Vertex AI Prompt Optimizer 작업을 제출한 후 아래와 같이 Vertex AI Training 사용자 지정 작업 뷰에서 작업을 모니터링할 수 있습니다.
최적화 작업이 성공적으로 실행되면 출력 Cloud Storage 버킷에서 최적화된 지시문이나 데모 또는 둘 다 json 파일로 찾을 수 있습니다. 몇 가지 도우미 함수 덕분에, 정의한 측정항목에 따른 최상의 지시문을 얻을 때 최적화 단계를 나타내는 다음 출력을 얻을 수 있습니다.
최적화된 데모에 대해서도 동일한 결과가 나옵니다.
마지막으로, 최적화된 출력으로 새로운 응답을 생성할 수 있습니다. 아래는 최적화된 시스템 지시문 템플릿을 사용하여 생성된 응답의 예입니다.
이를 사용하여 Vertex AI GenAI Evaluation으로 새로운 평가를 실행하는 경우, 이전의 프롬프트 템플릿을 사용해 선택한 평가 측정항목에 대해 최적화된 프롬프트가 이전 모델을 능가하는 아래 예와 같은 출력을 얻을 수 있습니다.
프롬프트 엔지니어링은 LLM 기반 애플리케이션을 실용화하는 과정에서 가장 중요하고도 어려운 단계 중 하나입니다. 프롬프트 템플릿을 만드는 데 도움이 되도록 Vertex AI Prompt Optimizer는 Vertex AI에서 선호하는 모델에 최상의 프롬프트(지시문과 데모)를 찾습니다.
이 기사에서는 Python용 Vertex AI SDK로 Gemini 모델에 대한 프롬프트 템플릿을 향상시키기 위해 어떻게 Vertex AI Prompt Optimizer를 사용할 수 있는지 한 가지 예를 통해 알아보았습니다. 여기에서 UI 노트북을 통해 Vertex AI Prompt Optimizer를 사용할 수도 있습니다.
핵심만 말하자면, Vertex AI Prompt Optimizer는 프롬프트 엔지니어링에 드는 시간과 노력을 절감하는 동시에 GenAI 애플리케이션에 대한 고성능 프롬프트를 보장할 수 있습니다.
읽어주셔서 감사합니다!
Vertex AI Prompt Optimizer와 그 사용 방법에 대해 자세히 알고 싶으세요? 다음 리소스를 확인하세요.