LLM을 서비스에 적용하는 방법: 입찰 제출 서류 추출 자동화 개발기
클라이원트는 GPT를 포함한 LLM 모델을 서비스에 적극 활용하고 있습니다. 이번 글에서는 LLM 모델을 선택하고 적용하는 과정에서 얻은 경험과 노하우를 공유하여 팀원들에게 LLM 활용을 위한 가이드라인을 제공하고자 합니다. 더불어, 자사 서비스에 LLM을 도입하고자 하는 분들에게도 이 글이 참고가 되었으면 합니다.
또한, 낙후된 입찰 환경을 혁신할 열정적이고 재능 있는 (1) AI 엔지니어, (2) 백엔드 엔지니어를 모집합니다. 여러분의 지원을 손꼽아 기다리겠습니다. 🔥
(1) AI 엔지니어 - RAG 시스템
회사 소개:
클라이원트는 AI로 낙후된 입찰시장을 개척합니다. 하루에도 수천건씩 업로드되는 입찰 공고들의 RFP 문서를 AI와 Data로 분석해서 매칭, BI, 제안서 생성 시스템 등 다양한 솔루션을 개발하고 있습니다. 현재 국내 시장에서 입증된 성공을 바탕으로 글로벌 입찰 시장 진출을 목표로 하고 있으며, 이를 실현하기 위해 팀을 확장하고 있습니다.
직무 개요:
RAG 시스템을 전문으로 하는 엔지니어로서, 수많은 RFP를 청킹(Chunking)하여 벡터 데이터베이스(Vector DB)를 구축합니다. 그리고 GPT, Gemini, Llama 등의 대규모 언어 모델(LLM)을 활용해 자동으로 생성된 답변을 제시하는 솔루션을 함께 개발할 것입니다. RFP와 제안서 생성은 시간이 오래 걸리고 작성할 내용이 많아 클라이원트의 고객들이 가장 큰 어려움을 겪는 분야입니다. 전반적인 시스템 개선을 위해 지속적으로 연구하면서 고객들의 어려움을 해결하는 데 열정이 있는 AI 엔지니어분과 함께하고자 합니다.
역할 및 책임:
- RAG 시스템 설계: 클라이원트의 제품 성능과 확장성을 개선하기 위한 RAG 시스템 설계, 구현 및 최적화.
- 프롬프트 엔지니어링: 다양한 프롬프트를 시도하고 연구해보며 RFP와 제안서에 들어갈 내용에 대한 자동생성을 지속적으로 개선.
- Vector Database 구축: 비정형화되어있는 문서를 RAG에 사용하기 위해 효과적인 Chunking 방식을 연구하고, 자동으로 섹션을 구분하는 로직 구현.
- LLM모델 벤치마킹: LLM 모델들을 (GPT, Gemini, Claude, Llama 등) 벤치마킹하고 비교하며 효과적이면서도 비용 효율적인 솔루션 구축.
- 최신 트렌드 파악 및 적용: 자연어, LLMs 및 RAG 분야에서 최신 기술 동향을 연구하고 업데이트.
지원자격:
- 학력: 컴퓨터 과학, 인공지능, 머신 러닝 또는 관련 분야의 학사 또는 석사 학위.
- 경험: NLP, 특히 대규모 언어 모델(LLMs)과 RAG에 대한 경험을 보유.
- 기술 역량: Python과 같은 프로그래밍 언어에 대한 숙련도.
- 데이터 기술: 데이터 전처리, 특징 엔지니어링 및 대규모 데이터셋 작업 경험.
- 문제 해결: 뛰어난 분석 및 문제 해결 능력, 비판적이고 창의적으로 생각할 수 있는 능력.
- 팀 플레이어: 팀 지향 환경에서 효과적으로 일할 수 있는 강력한 협업 및 의사 소통 능력.
우대 사항:
- 자연어 처리(NLP) 분야의 전문성을 갖추고 있으며, 언어적 뉘앙스와 기법을 깊이 이해하여 언어 기반 기술을 발전시키는 데 필수적인 능력을 보유한 분.
- 머신러닝 분야에서 MS 또는 PhD 소지, 머신러닝의 원리 및 응용에 대한 깊은 학문적 기초.
- AWS Sagemaker, Bedrock 등 최신 AI 관련 클라우드 서비스 활용 경험.
연락처:
- 👤정구열
- ✉️ kyle@cliwant.com
(2) 백엔드 엔지니어
회사 소개:
클라이원트는 AI로 낙후된 입찰시장을 개척합니다. 하루에도 수천건씩 업로드되는 입찰 공고들의 RFP 문서를 AI와 Data로 분석해서 매칭, BI, 제안서 생성 시스템 등 다양한 솔루션을 개발하고 있습니다. 현재 국내 시장에서 입증된 성공을 바탕으로 글로벌 입찰 시장 진출을 목표로 하고 있으며, 이를 실현하기 위해 팀을 확장하고 있습니다.
직무 개요:
클라이원트는 혁신적인 입찰 분석 솔루션을 개발하고 지속적으로 개선하기 위해 경험 많은 개발 팀장을 찾고 있습니다. 이 역할은 AWS를 기반으로 한 백엔드 서버 구축, 빅데이터 DB 설계 및 구축, OpenAI API의 활용, RAG, Regex, Vector DB 등 최신 기술을 활용하여 제품 개발 및 최적화를 주도합니다.
역할 및 책임:
- 다양한 클라우드 인프라 환경(AWS, Azure, GCP)에서의 서비스 설계 및 구축.
- Kubernetes를 통한 효율적인 Microservice 관리 및 배포환경 구축.
- CI/CD 파이프라인을 통한 효율적인 개발 및 배포 프로세스 구현.
- 빅데이터 기반 DB 설계 및 유지 보수.
- RESTful API 개발 및 유지 보수.
- 웹 크롤러 개발 및 관리.
지원 자격:
- 컴퓨터공학 전공 혹은 그에 준하는 전공 및 지식을 보유하신 분.
- 만 5년 이상의 백엔드 개발 경험을 보유하신 분.
- 빅 데이터 기술을 활용한 프로젝트 경험.
- Java/Kotlin/Python 등 하나 이상의 프로그래밍 언어 전문성을 보유하신 분.
- Kubernetes와 같은 컨테이너 오케스트레이션 도구를 사용한 배포 시스템 구축 경험.
- 탁월한 문제 해결 능력, 강력한 팀워크 및 커뮤니케이션 스킬.
우대 사항:
- GCP Big Query를 이용한 빅데이터 분석 및 BI 툴 개발 경험.
- OpenAI 활용 프롬프트 엔지니어링을 통해 문서 내 주요 정보 추출 경험.
- RAG, Regex, Vector Database 등을 활용한 복잡한 데이터 처리 및 검색 엔진 구축 경험.
연락처:
- 👤정구열
- ✉️ kyle@cliwant.com
LLM 모델 선택
대규모 언어 모델(Large Language Model, LLM)은 대용량 데이터를 기반으로 사전 학습된 딥러닝 모델로, 종합적 추론이 가능하여 다양한 영역에서 활용됩니다. 주요 LLM으로는 GPT, Gemini, Claude, LLaMA, PaLM 등이 있으며, 같은 모델이라도 버전에 따라 성능과 가격이 다릅니다. 예를 들어, OpenAI의 경우 아래와 같이 가격이 책정되어 있습니다.
모델 선정 시 고려할 기준은 다음과 같습니다:
- 성능
- 비용
- 동시 요청량
- 컨텍스트 길이
이 기준에 따라 여러 모델을 테스트한 후, 클라이원트는 각 기능 요구사항에 맞는 모델을 선택했습니다. 간단한 판단에는 저렴한 모델을, 높은 정확도가 필요한 경우에는 성능이 좋은 모델을 사용했습니다.
사례: 입찰 공고문에서 제출 서류 추출 기능 개발
입찰 공고문에서 제출 서류를 추출하려면 많은 텍스트를 입력해야 하므로 토큰 제한이 높아야 합니다. 또한, 공고문의 복잡한 문맥을 이해하고 정확한 결과를 제공해야 하므로 높은 성능이 요구됩니다. 따라서 클라이원트는 아래와 같은 모델들을 선택해 테스트를 실행했고, 가장 높은 정확도를 보인 GPT-4o를 선택했습니다.
LLM 파이프라인
클라이원트는 다음과 같은 파이프라인을 통해 데이터를 추출하고 LLM을 적용합니다:
- 나라장터와 다양한 채널에서 입찰 공고 데이터를 1차 수집
- 필요한 정보를 추출하고 가공하는 ETL(Extract, Transform, Load) 프로세스 진행
- LLM API를 통해 산출물 생성
- 최종 데이터를 MySQL, Aeca, BigQuery에 저장
프롬프트 설계
제출 서류 추출 기능도 위와 동일한 파이프라인으로 구성됩니다. ETL 프로세스 이후, LLM 입력값에 넣을 데이터를 전처리하고 GPT에 전달할 프롬프트를 설계합니다. 프롬프트란 생성형 AI에게 특정 작업을 수행하도록 지시하는 입력값을 말합니다. 생성형 AI가 최적의 결과를 만들어 내도록 프롬프트를 설계하고 조정하는 과정을 프롬프트 엔지니어링이라고 합니다. 좋은 프롬프트 엔지니어링은 명확하고 구체적인 지시를 통해 모델의 성능을 극대화하는 데 중점을 둡니다.
그렇다면 어떻게 해야 정확한 결과를 이끌어낼 수 있을까요? 이를 위한 몇 가지 전략을 소개하겠습니다.
명확한 지시 전달하기
추상적인 표현보다는 명확하고 구체적인 지시를 전달해야 합니다. 단순히 "제출 서류를 추출해달라"고 지시하면, 특정 서류가 추출되지 않거나 제출 서류가 아닌 문서가 추출될 수 있습니다. 프롬프트를 아무리 고도화하더라도 항상 맞는 답변만 나오지는 않습니다. 이는 정확도를 점점 높여가는 과정입니다. 추출이 잘되지 않는 서류 유형을 파악하여 프롬프트에 구체적인 지시를 추가하고, 특수한 조건이 있는 경우 이를 설명해주어야 합니다.
프롬프트의 구성요소를 구조화하기
프롬프트 내에 여러 구성 요소가 있을 경우, 각각의 요소를 아래와 같이 구조화할 수 있습니다.
자연어 형식
문서 텍스트:
{{문서 텍스트}}
지시 사항:
{{지시 사항}}
출력 형식:
{{출력 형식}}
XML 태그 형식
<document>
{{문서 텍스트}}
</document>
<instructions>
{{지시 사항}}
</instructions>
<output>
{{출력 형식}}
</output>
예시 작성하기
출력에 도움이 되는 예시를 추가하면 LLM이 지시 사항을 더 명확하게 이해할 수 있습니다. 아래 예시에서는 JSON 형식으로 출력하도록 작성했습니다.
<example>
{
"submissionDocuments": [
{
"title": "서류명",
"quantity": "제출 부수"
}
]
}
</example>
그러나 예시를 과도하게 많이 주게 되면 결과의 정확도가 오히려 떨어질 수 있습니다. 추출해야 하는 서류의 이름을 예시로 여러 개 제공했을 때, 주어진 문서 텍스트 내에 해당 서류가 없음에도 LLM이 예시로 제공한 서류명을 포함하는 경우가 있었습니다. 지시 사항을 이해할 수 있는 1~2개의 예시만 작성하는 것이 좋습니다.
시스템 메시지 작성하기
시스템 메시지는 대화 시작 시 지침을 전달하거나 맥락을 제공하는 데 사용됩니다. 이는 LLM이 대화에서의 역할을 이해하는 데 도움이 됩니다. 일반적으로 대화의 톤을 설정하고 모델의 행동을 안내합니다. 시스템 메시지는 사용자 메시지의 텍스트나 프롬프트에 제공된 다른 컨텍스트보다 응답에 더 큰 영향을 미칩니다.
제출 서류 추출을 위해 다음과 같이 시스템 메시지를 작성해볼 수 있습니다:
당신은 공고문에서 제출 서류를 추출하는 AI 도우미입니다.
당신의 주요 목표는 공고문 텍스트에서 필요한 제출 서류 목록을 정확하게 추출하여 제공하는 것입니다.
사용자가 공고문 텍스트를 제공하면, 공고문에 명시된 제출 서류의 이름과 제출 부수를 추출하여 목록으로 제공합니다.
질문의 목적에 맞게 대화의 어조, 행동 지침, 응답 방법 등 다양한 지침을 작성해보세요.
Hallucination(환각) 줄이기
LLM이 겪는 Hallucination(환각) 현상은 정확하지 않거나 사실이 아닌 정보를 생성하는 것을 말합니다. 이러한 현상은 다음과 같은 이유로 발생할 수 있습니다:
- 프롬프트의 컨텍스트가 충분하지 않은 경우
- 훈련한 데이터에서 정보가 부족한 경우
- 모델 자체의 역량 부족
LLM이 잘못된 정보를 생성하는 현상을 줄이기 위해서는 충분한 컨텍스트를 제공하고, 예외 상황을 처리하는 방법을 명확히 지정해야 합니다. 예를 들어, 제공된 텍스트에서 제출 서류와 관련된 정보를 찾을 수 없다면 LLM이 어떻게 응답해야 할지 응답 형식을 미리 정의할 수 있습니다.
사고 과정 추가하기
중간 추론 단계를 추가하여 사고 과정을 거치면 LLM의 성능이 향상될 수 있습니다. Chain-of-Thought Prompting은 LLM이 복잡한 추론을 수행하기 위해 생각을 말로 표현하게 하거나 단계별 추론 과정을 따르게 합니다.
위의 예시처럼 문제를 풀이하는 단계를 추가하여 정확한 답을 얻어낼 수 있습니다. 혹은 답을 내놓기 전에 그렇게 추론한 이유를 작성하게 하거나, 주어진 텍스트를 먼저 요약하고 답을 내도록 할 수 있습니다.
코드 형태로 지시하기
Code Prompting은 자연어 문제를 코드로 변환하여 프롬프트에 사용하는 방법입니다. 이 방법은 특정 조건의 충족 여부에 따라 다른 결론을 도출해야 하는 경우에 유용합니다. 자연어로 길게 설명하는 것보다 더 간략하게 표현하면서도 LLM의 성능 향상을 이끌 수 있습니다.
LLM 파라미터 설정
LLM은 다양한 파라미터를 설정하여 출력값을 조절할 수 있습니다. 다음은 GPT에서 사용하는 파라미터입니다. 이외에도 다른 파라미터를 살펴보려면 이 링크를 참고해주세요.
temperature
- 0에서 2 사이의 값을 사용하여 출력 텍스트의 창의성과 다양성을 조절합니다. 높은 값은 생성되는 텍스트가 더 창의적이고 예측 불가능해지지만, 일관성이 떨어질 가능성이 커집니다. 낮은 값은 덜 창의적이지만 일관된 출력을 생성하여 결과의 예측 가능성을 높입니다.
top_p
- 모델이 다음에 생성할 토큰을 결정할 때 고려하는 후보 토큰들의 집합을 제한하는 데 사용됩니다. 모델이 다음에 생성할 수 있는 모든 토큰들의 확률을 계산하고, 이를 내림차순으로 정렬합니다. 정렬된 토큰들의 누적 확률을 계산하여 누적 확률이 top_p 값에 도달할 때까지의 토큰들을 후보로 삼습니다. 이 후보 토큰들 중 하나를 무작위로 선택하여 다음 토큰으로 생성합니다.
- 0에서 1 사이의 값을 가지며, 값이 높을수록 더 많은 토큰을 고려하므로 다양성이 높아지고, 낮을수록 선택의 폭을 좁혀 일관된 출력을 제공합니다.
- 일반적으로
temperature
와top_p
중 하나의 파라미터만 조정하는 것을 추천합니다.
max_tokens
- 생성할 수 있는 최대 토큰 수입니다. 입력 토큰과 생성된 토큰의 총 길이는 모델의 컨텍스트 길이로 제한됩니다.
반복 수행 및 평가
LLM을 서비스에 적용하려면 반복 테스트와 프롬프트 개선이 필수입니다. 초기 설계, 실험, 평가, 배포 단계를 통해 반복적으로 테스트하고 평가합니다.
초기 설계
- 프롬프트가 해결하고자 하는 문제와 목표를 명확히 정의합니다.
- 여러 가지 버전의 초기 프롬프트를 작성합니다.
실험
- 다양한 케이스를 포함한 소규모 테스트 데이터셋을 준비합니다.
- 작성한 프롬프트를 소규모 데이터셋에 적용하여 초기 결과를 확인합니다.
- 테스트 결과를 분석하고, 가장 높은 정확도를 보인 프롬프트를 선택합니다.
평가
- 대규모 테스트 데이터셋을 준비합니다. 이때 엣지 케이스를 꼭 포함합니다.
- 대규모 데이터셋에 프롬프트를 적용하여 결과를 분석하고 프롬프트를 개선합니다.
- 프롬프트의 성능을 평가할 지표(예: 정확도, 오류율, 응답 시간 등)를 설정하고 측정합니다.
배포
- 실제 서비스 환경에 개선된 프롬프트를 적용합니다.
- 실제 사용자들로부터 피드백을 수집합니다.
- 평가 단계에서 발견하지 못했던 예외를 지속적으로 모니터링하고 데이터를 수집하여 반복 개선합니다.
대비책 마련하기
LLM API에서 발생하는 에러 상황을 핸들링할 수 있어야 합니다. 예를 들어, 최대 컨텍스트 길이(토큰 수)를 초과하는 경우 다음과 같은 에러가 발생할 수 있습니다.
Error Message: This model's maximum context length is 128000 tokens. However, your messages resulted in 243102 tokens. Please reduce the length of the messages.
이런 경우 입력 텍스트를 줄이거나 분할하여 각각 처리하도록 합니다. 또는 텍스트를 전처리하는 단계에서 정제하여 중요한 정보만 남깁니다.
API 호출 실패가 발생했을 때는 재시도 로직을 구현하여 일시적인 문제를 해결할 수 있도록 합니다. 다른 모델을 사용하는 로직도 준비해두어야 합니다. 다른 API를 백업으로 설정해 두고 필요 시 전환합니다.
맺음말
이번 글에서는 클라이원트가 LLM을 어떻게 활용하고 있는지 개발 사례를 공유했습니다. LLM은 강력한 성능과 유연성으로 다양한 비즈니스 문제를 해결하는 데 큰 잠재력을 가지고 있습니다. 이 글이 팀원들과 자사 서비스 도입을 고려하는 분들에게 유용한 참고자료가 되기를 바랍니다.
프롬프트는 LLM의 성능을 높이는 핵심 요소로, 지속적인 개선이 필요합니다. 초기 프롬프트가 완벽하지 않더라도 반복적인 테스트와 피드백을 통해 더 나은 결과를 얻을 수 있습니다.
이 글을 읽는 여러분도 LLM을 활용한 경험이 있다면 인사이트를 메일로 공유해주세요. 다음 글을 통해 모두와 나누고 싶습니다. 이 글을 읽어주셔서 감사합니다!
Written by Esther, Backend Engineer
Edited by Wonjun, Growth @ Cliwant