본문으로 건너뛰기

© 2026 Molayo

LangChain헤드라인2026. 05. 21. 03:45

AI를 활용한 사용 가능한 텍스트 생성

요약

이 글은 대규모 언어 모델(LLMs)을 활용한 텍스트 생성 과정에서 발생하는 도전 과제와 이를 해결하기 위한 프롬프트 엔지니어링의 기초 개념을 다룹니다. 프롬프트의 구조화된 설계와 퓨샷 프롬프팅(few-shot prompting), 단계별 추론(step-by-step reasoning)과 같은 핵심 기술을 통해 모델의 성능을 최적화하는 방법을 소개합니다.

핵심 포인트

  • 프롬프트는 LLM이 특정 작업을 수행하도록 안내하는 구조화된 사용자 입력입니다.
  • 프롬프트 엔지니어링은 모델의 이해 방식에 맞춰 입력을 최적화하여 성능을 높이는 기술입니다.
  • 퓨샷 프롬프팅(few-shot prompting)은 예시를 제공하여 분류 및 질의응답 성능을 향상시킵니다.
  • 단계별 추론(step-by-step reasoning)은 모델의 자기회귀적 특성을 활용하여 복잡한 문제 해결을 돕습니다.

편집자 주: 이 포스트는 LangChain의 파트너 프로그램을 통해 Mutt Data가 작성했습니다.

서론

개요

이전 논의에서 우리는 일반적인 생성형 AI (Generative AI) 애플리케이션을 구현할 때 발생하는 문제점들을 깊이 있게 다루었을 뿐만 아니라, 이미지 생성 문제에 대한 효과적인 완화 전략도 탐구했습니다. 이제 우리의 초점을 텍스트 생성 (generating text) 시 발생하는 독특한 문제 세트로 전환할 차례입니다.

이 블로그 포스트에서는 **대규모 언어 모델 (LLMs)**을 활용한 우리의 경험에서 얻은 몇 가지 **통찰 (insights)**을 공유하는 동시에, 이러한 **도전 과제 (challenges)**에 대한 간결한 개요를 제공합니다. 탐구를 위한 기초를 다지기 위해, 먼저 프롬프트 (prompts) 및 **프롬프트 엔지니어링 (prompt engineering)**과 같은 몇 가지 기본 개념을 소개하겠습니다. 바로 시작해 봅시다!

프롬프트 (Prompts)

지난 몇 달 동안 생성형 AI 세계에 참여해 보셨다면, 아마 **프롬프트 (prompts)**에 대해 들어보셨을 것입니다. 프롬프트는 주어진 **작업 (task)**에 맞춰 적절한 응답을 생성하도록 LLM을 **안내 (guide)**하는 특정 **사용자 제공 입력 (user-provided inputs)**입니다.

우리가 발표 자료의 섹션(서론, 논의, 해결책, 결론)에서 일정한 질서를 기대하는 것처럼, LLM도 우리가 프롬프트에 일정한 **구조 (structure)**를 따를 때 훨씬 더 잘 작동합니다. 더욱이, 이 구조는 우리가 수행하고자 하는 작업에 따라 크게 달라질 수 있습니다. 예를 들어, LLM이 지원하는 몇 가지 일반적인 작업에는 분류 (classification), 질의응답 (question-answer), 요약 (summarization), 코드 생성 (code generation) 및 추론 (reasoning)이 포함됩니다. 이러한 다양한 작업을 위한 프롬프트를 **작성 (crafting)**할 때는 각 작업 유형의 특정 요구 사항과 특이성에 맞춰 구조를 조정하는 것이 필수적입니다.

프롬프트 엔지니어링 (Prompt Engineering)

LLM을 효과적으로 사용하기 위해 적절한 단어, 구절, 문장, 구두점 및 구분자 문자를 선택하여 입력 프롬프트를 최적화하는 관행을 **프롬프트 엔지니어링 (prompt engineering)**이라고 합니다. 다시 말해, 프롬프트 엔지니어링은 LLM의 기대되는 이해 방식에 부합하고 성능을 향상시키는 방식으로 LLM과 소통하는 기술입니다.

요약 (Summarization)의 경우, 잘 구성된 프롬프트 (well formed prompt)의 예시가 아래에 첨부되어 있습니다.

잘 구성된 프롬프트 예시. docs.aws.amazon.com에서 추출함

반면에 사용 사례가 분류 (Classification)인 경우, 문맥 정보 (contextual information) 뒤에 각 카테고리에 대한 몇 가지 예시 (examples) (입력-응답 쌍)를 포함하는 것이 매우 도움이 될 수 있습니다. 이는 **퓨샷 프롬프팅 (few-shot prompting)**으로 알려져 있으며, 질의응답 (Question-answer)과 같은 더 복잡한 작업에도 적용될 수 있습니다. 하지만 작업이 더 복잡할수록 성능을 향상시키기 위해 더 많은 예시가 필요합니다.

또 다른 강력한 기술은 LLM에게 최종 답변을 내놓기 전에 **추론 (reason)**하고 **설명 (explain)**하도록 요청하는 것이며, 이는 또한 “단계별 (step by step)” 추론으로도 알려져 있습니다. 이 이면에 있는 핵심 개념은 이러한 모델들의 자기회귀 (autoregressive) 특성에 기반하며, 이는 예측된 각 단어가 시퀀스의 다음 요소 생성에 영향을 미친다는 것을 의미합니다. 이에 대한 자세한 내용은 여기에서 확인하십시오.

마지막으로, 입력 데이터에 대한 세부 정보를 포함하거나, 출력 형식 (output format)을 지정하거나, 단순히 프롬프트 끝에서 LLM을 격려하는 것과 같은 **수식어 (modifiers)**를 사용하여 프롬프트를 개선하는 것을 고려할 수 있습니다. Amazon Web Services에서 이에 대한 더 자세한 정보를 제공합니다.

도전 과제와 해결책 탐색

1) 적을수록 좋다 (Less is More)

도전 과제: LLM을 사용할 때 우리는 인간이 아닌 프로그램과 대화하고 있는 것입니다.

우리가 다소 두서없이 말하거나 스스로를 수정할 수 있는 인간의 대화와 달리, LLM에 복잡하거나 논란의 여지가 있는 지침을 제공하면 일관적이지 않고 부정확한 응답으로 이어질 수 있습니다. LLM이 관련 정보에 집중하고 정확한 결과를 생성하도록 돕기 위해서는 명확하고 직설적인 지침이 매우 중요합니다.

해결책: 명확하고, 간결하며, 스마트한 프롬프팅.

프롬프트를 작성할 때 가능한 한 명확하게 하십시오. 프롬프트 엔지니어링 (prompt engineering)으로도 알려진, 명확하고 간결한 지침을 위해 정확한 단어와 구절을 선택하는 것이 핵심입니다. 또한 유사한 사용 사례에 대한 프롬프트 템플릿 (prompt templates)을 탐색하여 특정 작업에 효과적인 구조를 발견할 수도 있습니다.

예시 (Example): 긴 제품 설명을 패키징용의 간결한 제목과 캡션 (caption)으로 요약하기 위한 두 가지 프롬프트 (prompt)를 고려해 보겠습니다.

프롬프트 1: 이 식품 제품에 대해 제공된 성분, 효능, 사용법, 고객 리뷰를 포함한 광범위한 세부 정보를 분석해 주세요. 영양가, 맛, 사용자 경험, 전반적인 시장 트렌드와 같은 다양한 측면을 고려하여 가장 중요한 정보를 추출하세요. 간결함과 제품의 다면적인 특성을 포착하는 것 사이의 균형을 맞추어 제품 패키징에 적합한 간결한 요약을 작성하세요. 또한, 요약이 다양한 소비자 선호도를 충족하고 현재 산업 표준과 일치하도록 하세요. 숙련된 음식 애호가와 요리 경험이 새로운 사람들 모두의 기대치를 충족할 수 있을 만큼 다재다능해야 합니다. 추가로, 식품 과학 및 기술의 주목할 만한 발전 사항을 포함하여 제품의 혁신적인 특징을 강조하세요.

프롬프트 2: 식품 제품의 필수 세부 정보를 요약하되, 성분, 효능 및 사용자 경험을 강조하세요. 광범위한 청중에게 매력을 줄 수 있도록 보장하고 혁신적인 특징을 강조하면서, 제품 패키징에 적합한 짧지만 설득력 있는 제목과 캡션을 작성하세요. 음식 애호가들의 다양한 선호도와 경험을 고려하여 요약의 명확성과 간결함을 강조하세요.

어느 쪽이 작업을 더 명확하게 설명하고 있나요?

2) 분할 정복 (Divide & Conquer)

도전 과제 (Challenge): LLM (Large Language Models)은 특정 작업을 해결하는 데 뛰어나지만, 한꺼번에 너무 많은 작업을 요구하여 모델에 과부하를 주어서는 안 됩니다!

해결책 (Solution): 복잡한 작업을 단순한 프롬프트 (prompt)를 사용하여 더 간단한 작업들로 나누고, 그 결과를 모으세요.

예시 (Example): 사용자에게 긴 선택지 목록에서 영화를 추천할 때, 영화 목록을 한꺼번에 제공하는 대신 영화가 적합한지 하나씩 물어봄으로써 정확한 추천의 정확도가 크게 향상된다는 것을 발견했습니다. 다음 두 가지 프롬프트 (prompt)를 확인해 보세요:

프롬프트 1: 당신은 사용자의 선호도에 따라 웹 플랫폼의 영화 추천을 돕는 언어 모델 (language model)입니다. 당신의 목표는 영화를 매력적으로 제시하고 관련성 수준에 따라 정렬하는 것입니다. 아래는 사용 가능한 전체 영화 목록과 그 특징들입니다. 영화 제목부터 시작하여 이러한 속성들을 매력적인 방식으로 설명하세요. 전체 영화 목록은 다음과 같습니다:

[ { "Movie Title": "Daring Odyssey",

"Category": "Adventure",

"Description": "반전과 변화가 가득한 흥미진진한 여정을 시작하세요. 주인공들과 함께 숨 막히는 풍경을 가로지르고 스릴 넘치는 도전에 맞서보세요. 놓치고 싶지 않을 영화적 모험입니다!",
},

},, …(전체 목록)...]

프롬프트 2: 당신은 영화를 추천하는 언어 모델 (language model)입니다. 당신의 업무는 영화 카테고리 (category)와 설명 (description)이 사용자가 자유롭게 작성한 설명과 모두 적합한지 판단하는 것입니다:


사용자의 설명: {user_description}.

영화 카테고리: {movie_category}

영화 설명: {movie_description}


다음 형식의 JSON 객체로 응답하세요:

"reasoning": 사용자에게 당신의 추론 과정을 간략하게 설명하세요.

"match": "YES" | "NO"

어느 쪽이 더 단순한 작업일까요?

3) 코끼리의 힘을 가졌으나 벌의 기억력을 가진 존재

도전 과제 (Challenge): LLM (Large Language Models)은 광범위한 문제를 처리할 수 있지만, 특정 지침을 일관되게 *회상 (recalling)*하는 데 종종 어려움을 겪습니다. *컨텍스트 (context)*가 커질수록, 그러한 세부 사항을 유지하는 능력은 감소합니다.

해결책 (Solution): 애플리케이션 내에서 내부 상태 (internal states)를 관리함으로써 LLM의 기억에 대한 의존도를 줄이세요. 중간 단계들을 거치며 체크포인트 (checkpoints)와 조건들을 충족하도록 제어된 출력 (controlled outputs)을 생성하세요.

예시: 이러한 통찰은 의료 예약 스케줄링 앱을 개발한 경험에서 얻은 것입니다. 우리의 첫 번째 접근 방식은 모델이 환자가 지정한 모든 조건을 각 의사의 사용 가능한 전문 분야(specialties) 및 시간대(time slots) 목록과 대조하여 확인하도록 하는 것이었으며, 목록에 없는 전문 분야나 시간대를 추가하는 것은 금지된다는 점을 강조했습니다. 하지만 이 전략은 동일한 대화 내에서 이미 실수를 지적했음에도 불구하고, LLM이 목록에 없는 맞춤형 전문 분야와 예약 불가능한 시간대를 체계적으로 생성하는 결과로 이어졌습니다.

해결책으로서, 우리는 프로세스를 검증된 단계(states)로 오케스트레이션(orchestrating)하여 접근 방식을 개선했습니다. 먼저 LLM을 활용하여 상담 사유 및 가능한 날짜와 같은 환자 정보를 수집했습니다. 검증 후에 LLM은 상담 사유와 각 가능한 전문 분야 간의 개별 매칭을 수행했습니다. 그 후, 우리는 전통적인 데이터베이스 프로세스를 사용하여 해당 전문 분야 및 원하는 날짜의 가용성에 따라 의사를 필터링했습니다. 이 단계는 존재하지 않는 옵션을 만들어내는 문제를 극복할 수 있게 해주었습니다. 마지막으로, LLM은 예약이 확정될 때까지 환자에게 가능한 예약 시간을 제시했습니다.

의료 예약 스케줄링 애플리케이션을 위한 상태(states, 연한 파란색)의 단순화된 다이어그램. 먼저 사용자 정보 학습을 관리한 다음, 적절한 전문 분야를 매칭하고 데이터베이스에서 가능한 의사와 시간대를 필터링합니다.

4) 성능 평가

과제 (Challenge): 텍스트 생성 품질에 대한 성능을 측정하고 편향되지 않은 지표(unbiased metrics)를 얻는 것.

해결책 (Solution): LLM을 테스트하고 평가하기 위한 표준화된 도구(standardized tool)를 선택하는 것.

예시 (Example): 이는 우리가 의료 예약 스케줄링 애플리케이션을 구현할 때 직면했던 명확한 문제였습니다. 첫 번째 접근 방식으로는 일련의 주제에 대응하는 가능한 프롬프트(prompt)들의 테스트 스위트(test suite)를 구성했습니다. 예약을 잡아야 하는 상담, 해당 전문의의 부재로 인해 이행될 수 없는 상담, 그리고 마지막으로 악의적이라서 무시하거나 조절(moderate)해야 하는 메시지를 포함했습니다. 이 테스트 스위트를 평가하는 방식은 테스터 그룹이 수동으로 테스트를 수행하고 1에서 5 사이의 만족도 점수를 제공하게 하는 것이었습니다. 이는 시간이 많이 소요되었으며 주석 작성자(annotator)의 편향(bias)에 묶여 있었습니다.

우리는 이것이 프로덕션 환경(production environment)을 위한 올바른 접근 방식이 아니라는 것을 이해했고, 유용한 도구인 LangSmith를 발견할 때까지 추가적인 조사를 진행했습니다. LangSmith는 프로덕션 환경을 지향하는 LLM 애플리케이션 개발을 지원하는 플랫폼입니다. 이는 테스트 및 평가 프로세스를 용이하게 하고 특정 지표(metrics)에 대한 표준을 제공합니다. 또한, 애플리케이션의 모니터링(monitoring)과 디버깅(debugging)을 지원하여 전체 앱 라이프사이클(app lifecycle)을 훨씬 더 효율적으로 만들어 줍니다.

우리의 사용 사례(use case)의 예로, 사용자에게 도움을 주는 성공적인 메시지에 환자의 이름, 설명된 문제, 의사의 이름과 같은 특정 정보가 포함되어 있는지 확인하는 것이 가치 있다는 것을 발견했습니다.

LangSmith는 이 기능을 구현하기 위한 사용자 친화적이고 직관적인 접근 방식을 제공하며, 점수와 실행 시간의 평균(mean), 표준 편차(standard deviation), 백분위수(percentiles)를 포함하여 데이터셋 실행에 대한 포괄적인 지표를 제공합니다. 이 사례에서는 LangChain Custom Evaluator 섹션에 설명된 예시에서 영감을 얻어, 응답 내에 지정된 입력 값이 존재하는지 확인하기 위해 LLM을 활용하는 "Criteria" 평가기(evaluator)를 개발했습니다. 단 50줄의 Python 코드만으로 우리는 진행할 준비를 마쳤습니다!

예시를 설명하기 위해, 다음과 같은 LLM 작업을 고려해 봅시다…

이제 우리의 테스트를 위한 기준 평가기 (criteria evaluator)를 구현해 보겠습니다:

마지막으로 LangSmith 클라이언트를 사용하여 데이터셋의 각 샘플에 대해 테스트를 실행해 봅시다:

LangSmith의 Web UI가 특정 샘플에 대한 실행 트레이스 (trace)를 어떻게 기록하는지 확인해 보겠습니다:

놀랍습니다! 이런 방식으로 우리는 단 몇 줄의 코드만으로 커스텀 기준 (custom criteria)을 사용하여 특정 데이터셋에 대한 독립적인 테스트를 실행할 수 있으며, 우리 기능의 성능에 대한 실제 지표 (metrics)를 얻을 수 있습니다.

5) 보안 리스크 (Security Risks)

과제 (Challenge): 잠재적인 법적 문제를 완화하기 위해 애플리케이션의 신뢰성을 보장하는 것.

해결책 (Solution): 애플리케이션 내의 입력 (input)과 출력 (output) 모두에 대해 엄격한 제어를 유지하십시오. 사용자 입력에 응답하기 위해 LLM을 직접적으로 활용하는 것을 피하십시오. 대신, 프로세스를 독립적인 작업 (tasks) 또는 상태 (states)로 분해하고, LLM으로부터 필요한 특정 기능만을 활용할 수 있도록 제어된 프롬프트 (controlled prompts)를 사용하십시오.

예시 (Example): 우리는 사용자 입력을 검증하고 분류하기 위해 입력 필터 (input filter)를 지속적으로 통합합니다. 만약 사용자의 의도가 애플리케이션의 의도된 목적에서 벗어날 경우, 우리는 사용자에게 앱의 지정된 용도를 부드럽게 상기시킵니다. 이러한 접근 방식은 아래 첨부된 유명한 예시에서 보여주는 것처럼 잠재적인 함정을 피하는 데 도움이 됩니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 LangChain Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0