Prompt Engineering 기본과 한계

3줄 요약

  • Prompt Engineering은 모델에게 줄 지시문, 역할, 예시, 출력 형식, 제약 조건을 설계하는 단계다.
  • 단일 요청의 품질을 높이는 데는 효과적이지만, 운영 서비스의 안정성 전체를 책임지지는 못한다.
  • 백엔드 개발자는 프롬프트를 문자열이 아니라 변경 가능한 실행 계약으로 보고 버전, 테스트, 검증을 함께 관리해야 한다.

핵심 정리

  • Prompt는 모델에게 “무엇을 해야 하는지”를 전달하는 인터페이스다. API의 request body처럼 형식과 의미가 함께 중요하다.
  • 좋은 프롬프트는 역할, 목표, 입력 데이터, 제약 조건, 출력 형식, 예외 처리 기준을 명확히 가진다.
  • few-shot 예시는 모델의 답변 패턴을 안정시키는 데 도움을 주지만, 운영 데이터의 모든 변형을 덮지는 못한다.
  • 프롬프트만 고쳐서 품질 문제를 해결하려는 접근은 한계가 있다. 잘못된 컨텍스트, 권한 누락, 오래된 문서, 불안정한 후처리는 프롬프트 문장만으로 해결되지 않는다.
  • 백엔드에서는 프롬프트 변경이 기능 변경과 같다. 버전, 리뷰, 테스트, rollback 기준이 필요하다.

헷갈리는 지점

  • 프롬프트를 잘 쓰면 AI 기능이 안정된다고 생각하기 쉽다. 데모에서는 한두 예시가 잘 동작하기 때문이다.
    • 핵심은 프롬프트가 요청 품질의 일부일 뿐이라는 점이다.
    • 운영 안정성은 context 조립, 응답 검증, retry, fallback, eval, observability까지 포함한다.
  • 프롬프트는 자연어라서 코드보다 가볍게 바꿔도 된다고 느끼기 쉽다. 문장 수정처럼 보이기 때문이다.
    • 핵심은 프롬프트가 모델 동작을 바꾸는 실행 계약이라는 점이다.
    • 작은 문장 변경도 JSON 형식, 거절률, 환각률, 비용을 바꿀 수 있다.

확인 질문

  • Prompt Engineering의 주된 관심사는 무엇인가?
    • 단일 요청에서 모델이 목표, 제약, 출력 형식을 잘 따르도록 지시문과 예시를 설계하는 것이다.
  • 프롬프트만으로 운영 안정성을 보장하기 어려운 이유는 무엇인가?
    • 실제 서비스 품질은 컨텍스트 품질, 응답 검증, 장애 대응, 평가, 권한 필터링 같은 외부 장치에 크게 의존하기 때문이다.

Context Engineering과 컨텍스트 조립

3줄 요약

  • Context Engineering은 모델에 어떤 정보를 언제, 어떤 순서와 구조로 넣을지 설계하는 단계다.
  • RAG 문서, 사용자 프로필, 대화 이력, tool 결과, 권한 필터, token budget이 모두 context 설계 대상이다.
  • 백엔드에서는 컨텍스트 조립이 데이터 접근 계층과 보안 경계에 닿기 때문에 프롬프트보다 더 운영적인 문제다.

핵심 정리

  • 모델은 요청 시점에 제공된 context를 기준으로 답한다. 좋은 모델도 잘못된 context를 받으면 잘못 답한다.
  • Context Engineering은 단순히 많은 정보를 넣는 것이 아니다. 정확한 정보를, 권한에 맞게, 필요한 순서로, 토큰 예산 안에 넣는 일이다.
  • RAG에서는 검색 결과의 점수만 믿지 않는다. 최신성, 권한, 출처, 중복, chunk 길이, metadata filter를 함께 본다.
  • tool result는 신뢰된 데이터처럼 보이지만 외부 시스템에서 온 텍스트이므로 prompt injection payload를 포함할 수 있다.
  • context 조립 로직은 백엔드 서비스 코드처럼 테스트되어야 한다. 사용자 유형, 권한, 문서 상태, token budget별 테스트가 필요하다.

헷갈리는 지점

  • context window가 커지면 context 문제가 사라진다고 생각하기 쉽다. 더 많이 넣을 수 있기 때문이다.
    • 핵심은 많은 정보가 항상 좋은 정보는 아니라는 점이다.
    • 오래되었거나 권한이 없거나 서로 충돌하는 정보가 많아지면 품질과 비용이 함께 나빠진다.
  • RAG 검색 결과를 그대로 모델에 넣으면 된다고 생각하기 쉽다. 검색과 생성이 분리되어 보이기 때문이다.
    • 핵심은 검색 결과도 모델 입력이므로 정제, 정렬, 출처 표시, 권한 검증이 필요하다는 점이다.

확인 질문

  • Context Engineering이 Prompt Engineering보다 더 운영적인 이유는 무엇인가?
    • 실제 사용자 데이터, 권한, 검색, tool 결과, token budget, 비용과 직접 연결되기 때문이다.
  • RAG context 조립에서 검색 점수 외에 확인해야 할 것은 무엇인가?
    • 권한, 최신성, 출처, 중복, chunk 품질, metadata filter, token budget이다.

Harness Engineering과 실행 안정성

3줄 요약

  • Harness Engineering은 프롬프트와 컨텍스트를 둘러싼 실행 장치 전체를 설계하는 단계다.
  • retry, fallback, structured output validation, guardrail, tracing, eval, regression test, human review loop가 여기에 들어간다.
  • 실무에서 AI 기능의 품질은 프롬프트 자체보다 harness의 안정성에서 갈리는 경우가 많다.

핵심 정리

  • Harness는 모델 호출 전후의 실행 틀이다. 요청을 만들고, 모델을 호출하고, 응답을 검증하고, 실패를 처리하고, 로그와 평가 데이터를 남긴다.
  • structured output을 요구해도 응답이 항상 DTO로 파싱되는 것은 아니다. refusal, partial output, provider 장애, schema 불일치를 처리해야 한다.
  • retry는 모든 실패의 답이 아니다. 읽기 요청은 재시도하기 쉽지만, 결제, 메일 발송, DB 변경 같은 tool 호출은 idempotency 없이 재시도하면 사고가 난다.
  • fallback model은 장애 대응에 좋지만 품질과 비용이 달라진다. 사용자에게 품질 저하를 어떻게 보여줄지까지 설계해야 한다.
  • tracing과 eval 없이 프롬프트를 고치면, 좋아진 것처럼 보이는 변경이 다른 케이스를 망가뜨릴 수 있다.

헷갈리는 지점

  • structured output을 쓰면 파싱 실패가 없어질 것이라고 생각하기 쉽다. schema를 지정했기 때문이다.
    • 핵심은 모델 호출에는 거절, 중단, provider error, schema drift가 남아 있다는 점이다.
    • schema validation 실패를 정상적인 실패 경로로 설계해야 한다.
  • retry를 넣으면 안정성이 올라간다고만 생각하기 쉽다. 일시 장애에는 효과가 있기 때문이다.
    • 핵심은 retry가 중복 실행과 비용 폭증을 만들 수 있다는 점이다.
    • 외부 side effect가 있는 작업은 idempotency key와 실행 로그가 먼저다.

확인 질문

  • Harness Engineering의 핵심 역할은 무엇인가?
    • 프롬프트와 컨텍스트를 실제 서비스에서 안전하게 실행되도록 검증, 재시도, fallback, 평가, 관측성을 제공하는 것이다.
  • tool calling에서 retry를 조심해야 하는 이유는 무엇인가?
    • 외부 결제, 메일, DB 변경 같은 side effect가 중복 실행될 수 있기 때문이다.

Prompt Versioning Eval Regression

3줄 요약

  • 프롬프트, context 조립 코드, 모델, schema 변경은 모두 품질 회귀를 만들 수 있다.
  • Eval은 “한 번 좋은 답을 냈다”가 아니라 “중요 케이스에서 계속 기준을 만족한다”를 확인하는 장치다.
  • 백엔드에서는 eval을 CI, 릴리즈 노트, rollback 기준과 연결해야 한다.

핵심 정리

  • Prompt versioning은 프롬프트 파일에 이름을 붙이는 정도가 아니다. 모델, schema, retrieval 설정, tool 목록, 평가 결과를 함께 기록해야 의미가 있다.
  • regression test는 대표 질문, 엣지 케이스, 보안 공격, 권한 경계, 실패 상황을 포함해야 한다.
  • 자동 평가는 빠르지만 완벽하지 않다. 중요한 고객-facing 기능은 샘플 기반 human review와 함께 운영하는 편이 안전하다.
  • eval dataset은 운영 로그에서 만들 수 있지만 개인정보와 민감정보를 제거해야 한다.
  • 좋은 eval은 점수 하나보다 실패 유형을 알려준다. 검색 실패인지, context 누락인지, 추론 실패인지, 출력 형식 실패인지 분리해야 한다.

헷갈리는 지점

  • eval은 모델을 비교할 때만 필요하다고 생각하기 쉽다. 벤치마크 이미지가 강하기 때문이다.
    • 핵심은 eval이 프롬프트, context, schema, tool 변경의 회귀를 잡는 운영 테스트라는 점이다.
    • 모델 교체가 없어도 프롬프트 한 줄 변경 때문에 eval이 필요하다.
  • 운영 로그를 그대로 eval dataset으로 쓰면 된다고 생각하기 쉽다. 실제 사용자 질문이라 좋아 보이기 때문이다.
    • 핵심은 개인정보, 편향, 권한 정보, 중복, 라벨 품질을 먼저 정리해야 한다는 점이다.

확인 질문

  • Prompt version에 함께 기록하면 좋은 것은 무엇인가?
    • 프롬프트 내용, 모델, schema, retrieval 설정, tool 목록, eval 결과, 배포 시점이다.
  • eval이 단순 점수보다 실패 유형을 보여줘야 하는 이유는 무엇인가?
    • 원인이 검색, 컨텍스트, 모델 추론, 출력 형식, 보안 정책 중 어디인지 알아야 개선 방향을 정할 수 있기 때문이다.

백엔드에서 프롬프트를 코드처럼 관리하기

3줄 요약

  • 프롬프트는 운영 동작을 바꾸므로 코드처럼 리뷰, 버전 관리, 테스트, 배포, rollback 대상이 되어야 한다.
  • 프롬프트 템플릿에는 변수 계약, 출력 schema, 실패 처리 정책, 금지 입력 처리 기준이 포함되어야 한다.
  • 개인 프로젝트에서도 프롬프트 파일 분리, 버전 이름, 작은 eval set, 변경 로그 정도는 갖추는 편이 좋다.

핵심 정리

  • 프롬프트를 코드 안의 긴 문자열로 방치하면 변경 이력, 리뷰, 재사용, 테스트가 어려워진다.
  • 템플릿 변수는 API 파라미터처럼 명확해야 한다. context, user_input, format처럼 뭉뚱그린 이름보다 retrieved_policy_chunks, current_user_question, response_schema처럼 의미를 드러내는 이름이 낫다.
  • 프롬프트는 환경별로 달라질 수 있다. 개발, staging, production에서 모델과 guardrail이 다르면 결과도 달라진다.
  • 프롬프트 변경은 feature flag나 version routing으로 점진 배포할 수 있다.
  • 운영 로그에는 prompt 전체를 무조건 남기지 않는다. 민감정보와 라이선스가 있는 문서가 섞일 수 있으므로 hash, version, token count, selected source id를 우선 남긴다.

헷갈리는 지점

  • 프롬프트를 DB에서 바로 수정할 수 있게 만들면 운영이 쉬워진다고 생각하기 쉽다. 배포 없이 바꿀 수 있기 때문이다.
    • 핵심은 쉬운 변경이 쉬운 장애로 이어질 수 있다는 점이다.
    • 리뷰, eval, 권한, rollback 없이 production prompt를 바꾸는 것은 위험하다.
  • 프롬프트 로그를 많이 남길수록 디버깅이 쉬워진다고 생각하기 쉽다. 입력을 보면 원인 분석이 쉽기 때문이다.
    • 핵심은 프롬프트 안에 개인정보, 내부 문서, tool 결과가 섞일 수 있다는 점이다.
    • 운영 로그는 최소 정보와 마스킹, 샘플링, 접근 제어를 함께 설계해야 한다.

확인 질문

  • 프롬프트를 코드처럼 관리해야 하는 이유는 무엇인가?
    • 프롬프트 변경이 모델 동작, 비용, 출력 형식, 보안 위험을 바꿀 수 있는 기능 변경이기 때문이다.
  • 운영 로그에 prompt 전체를 남길 때의 위험은 무엇인가?
    • 개인정보, 내부 문서, 권한이 필요한 context, 외부 tool 결과가 로그에 유출될 수 있다.