주요 업무의 'RAG, Agent, LLM 파이프라인 설계 및 구현' 과 우대요건의 Hybrid RAG·LangChain·LangGraph 가 이 콘솔의 골조 그대로이고, '고객사 팀에 직접 투입해 AI 전환 실행 지원' 이라는 AX 프로젝트 상황이 이 도구의 사용 장면입니다. 우대요건의 기업 환경 컨설팅 경험을 존중해 더미 문서 테마만 환경 지침으로 골랐습니다. 이 포트폴리오가 입증하는 것은 Hybrid RAG 검색과 인용 검증 파이프라인 구현이며, 환경 규제·컨설팅 전문성은 주장하지 않습니다. 문서 내용은 가상 지침이고 규제 해석은 컨설턴트의 영역이라고 면접에서 밝힙니다.
공고가 RAG, Agent, LLM 파이프라인 설계·구현을 주요 업무로 명시합니다. 검색부터 인용 검증까지 이어지는 이 콘솔의 파이프라인이 그 업무의 실물 증거가 됩니다.
우대요건의 Hybrid RAG 와 LangChain·LangGraph 를 그대로 골조로 씁니다. 키워드 검색과 벡터 검색을 합치고 LangGraph 로 검색·답변·검증 단계를 잇습니다.
공고가 고객사 팀에 직접 투입돼 AI 전환을 실행 지원한다고 밝힙니다. 고객사 문서를 받아 하루 안에 Q&A 콘솔을 세우는 이 구성이 그 투입 상황의 시작 산출물과 같은 모양입니다.
고객사 사내 지침 문서(폐기물 분리배출 지침·에너지 사용 보고 절차 같은 환경 컨설팅 테마의 더미 문서)를 적재하면, 질문에 대해 키워드(BM25)와 벡터 검색을 합친 Hybrid RAG 로 근거 문단을 찾아 인용과 함께 답하는 Q&A 콘솔입니다. 문서에 근거가 없으면 지어내지 않고 없다고 답하는 것까지가 제품 범위입니다.
고객사에서 지침이 어디 적혀 있는지 물어볼 때마다 문서 폴더를 열어 Ctrl+F 를 반복하던 컨설팅 실무자입니다. 답과 함께 어느 문서 몇 번째 문단인지 바로 확인하고, 문서에 없는 질문에는 없다고 정직하게 알려주는 창구를 원하는 사람입니다.
키워드 검색과 벡터 검색을 합치면 용어가 정확한 질문(조항 이름)과 두루뭉술한 질문(이거 어떻게 버려요) 모두에서 근거 문단 적중이 안정되고, 인용 검증을 강제하면 인턴이 만든 콘솔도 고객사 앞에 세울 신뢰 수준이 됩니다.
더미 지침 문서 10건을 적재하고, FastAPI API 와 간단한 웹 화면에서 질문 입력부터 인용 검증을 통과한 답변까지 도는 완결품입니다. 문서에 없는 질문에는 근거 없음으로 답합니다.
질문·정답 문단 골든셋 30건 대비 검색 적중률과 무근거 질문 거절률을 잰 자가채점 리포트, 그리고 키워드·벡터·Hybrid 세 방식의 비교표가 남은 상태입니다.
검색 결과가 빈약할 때 질문을 바꿔 다시 검색하는 재질의 노드와, 답변·인용 불일치를 잡는 검증 노드가 LangGraph 그래프에 붙어 실패 케이스 처리까지 보여주는 상태입니다.
지침 문서를 적재하고 질문을 넣으면 근거 문단 인용이 달린 답이 나오는 흐름을 시연합니다(더미 문서 10건·질문 10종 기준).
답변의 모든 인용이 검색 문단의 실제 문장 조각인지 자동 검사로 전수 확인하고, 문서에 근거 없는 질문 5종을 전부 근거 없음으로 거절하는 것을 보여줍니다(자동 채점).
오타 질문·말바꿈 질문·두 문서가 상충하는 질문 같은 하드 케이스 20종에서도 출력 형식이 깨지지 않습니다.
위 수치는 문서와 정답을 작성자가 만든 더미 자가채점이라 성능 증명이 아닙니다. 실제 적중률은 제르코닉스 AX 프로젝트의 고객사 문서와 실무자 피드백이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직하게 설명합니다.
정답을 내가 만들었으니 검색이 잘 맞는 게 당연해지는 함정이 있어, 답이 문서에 없는 질문·두 문서의 상충 내용·오타 질문을 골든셋에 일부러 섞습니다.
실제 고객사 문서는 표·그림·스캔본이 섞여 전처리 난도가 다릅니다. 문서 파싱 고도화는 도입 단계 과제로 분리합니다.
이 포트폴리오는 Hybrid RAG 와 인용 검증 구현을 입증할 뿐, 환경 규제·컨설팅 전문성은 주장하지 않습니다. 더미 지침은 가상 문서이며 규제 해석은 컨설턴트 검토가 필요하다고 면접에서 밝힙니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 사내 지침을 본뜬 환경 컨설팅 테마의 가상 문서입니다. 검색·인용의 원문이며 상충·중복을 일부러 담았습니다.
사업장 일반 폐기물은 매주 화·목 오후 4시 이후 지하 1층 집하장에 배출한다. 파쇄 대상 문서는 보안 파쇄함에만 넣는다. 유성 페인트 용기는 지정 폐기물로 분류하며 일반 배출을 금지한다.
월별 전력 사용량은 익월 5영업일 안에 시설팀이 집계해 경영지원팀에 제출한다. 집계 단위는 층별 계측기 기준이며 계측기 누락 층은 전년 동월 값으로 추정 기재하고 추정임을 표기한다.
다음 JSON Schema 를 그대로 만족하는 사내 환경 지침 문서를 20건 더 만들어 주세요: {"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]} title 은 'DOC-## 제목' 형식의 가상 사내 지침으로 쓸 것. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 주제의 신·구버전이 서로 다른 내용을 담은 상충 쌍 2쌍 이상(v1/v2 표기), (2) 다른 문서를 참조만 하고 답을 담지 않은 문서 2건(별도 문서를 따른다 류), (3) 같은 대상을 다른 용어로 부르는 표기 흔들림(일회용컵/1회용 컵, 집하장/수거장) 3건, (4) 한 문단에 여러 규칙이 섞인 긴 문서 2건.{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]}검색·거절 채점의 정답표입니다. 정답 문단이 없는 질문(gold_quote null)을 포함해 무근거 거절을 채점합니다.
| question_id | question | gold_doc_id | gold_quote | question_type |
|---|---|---|---|---|
| Q-01 | 일반 폐기물은 언제 버리나요? | DOC-01 | 매주 화·목 오후 4시 이후 지하 1층 집하장에 배출한다 | 절차 |
| Q-02 | 여름철 에어컨 온도 기준이 뭐예요? | DOC-03 | 냉방기 설정 온도는 하절기 26도 이상을 기본으로 한다 | 기준 |
| Q-03 | 노트북 버리려면 뭐부터 해야 하죠? | DOC-07 | 정보보안팀의 데이터 소거 확인서를 받은 뒤에만 폐기 신청이 가능하다 | 절차 |
| Q-04 | 전력 사용량 보고는 누가 하나요? | DOC-02 | 시설팀이 집계해 경영지원팀에 제출한다 | 담당 |
| Q-05 | 음식물 쓰레기 처리 규정 알려주세요 | — | — | 무근거 |
다음 JSON Schema 를 그대로 만족하는 질문·정답 행을 30개 더 만들어 주세요: {"type":"object","properties":{"question_id":{"type":"string"},"question":{"type":"string"},"gold_doc_id":{"type":["string","null"]},"gold_quote":{"type":["string","null"]},"question_type":{"type":"string","enum":["절차","기준","담당","무근거"]}},"required":["question_id","question","question_type"]} gold_quote 는 반드시 대상 문서 body 의 실제 문장 조각이어야 한다. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 문서에 답이 없는 무근거 질문 6건 이상(gold_doc_id·gold_quote null), (2) 오타·구어체 질문 5건(타소→탄소 같은 오타 포함), (3) 신·구버전 상충 문서를 겨냥한 질문 2건, (4) 참조만 있고 답이 없는 문서(별도 문서를 따른다)를 겨냥해 무근거로 채점돼야 하는 질문 2건.{"type":"object","properties":{"question_id":{"type":"string"},"question":{"type":"string"},"gold_doc_id":{"type":["string","null"]},"gold_quote":{"type":["string","null"]},"question_type":{"type":"string","enum":["절차","기준","담당","무근거"]}},"required":["question_id","question","question_type"]}| FastAPI | 문서 적재·질문 응답 API 서버입니다. 공고의 사용 스택 그대로 씁니다 |
| LLM | 검색된 문단을 근거로 답변 문장을 만듭니다. 근거 채택 여부는 인용 일치 검증이 결정합니다 |
| RAG | 질문마다 근거 문단을 검색해 답에 붙이는 제품 골조입니다 |
| LangChain | 문서 로더·청킹·임베딩 등 파이프라인 부품을 조립합니다 |
| LangGraph | 검색, 답변, 인용 검증, 재질의 단계를 그래프 노드로 잇습니다 |
| Claude | 주 답변 생성 모델로 Claude Sonnet 을 씁니다 |
| ChatGPT | 골든셋 질문의 말바꿈(패러프레이즈) 변형을 만들어 검색 강건성을 시험합니다 |
| Gemini | 같은 질문의 교차 응답을 받아 인용 누락·상충 표본 점검에 씁니다 |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 골든셋 채점과 검색 방식 비교로 넘어갑니다.
✓ pass → LangGraph 재질의·교차 점검 노드 확장으로 넘어갑니다.
질문 한 건에 대한 답변입니다. 인용이 검색 문단의 실제 문장 조각이어야 하고, 근거가 없으면 지어내지 않고 거절합니다.
{"type":"object","properties":{"question_id":{"type":"string"},"status":{"type":"string","enum":["answered","no_evidence"]},"answer":{"type":["string","null"]},"citations":{"type":"array","items":{"type":"object","properties":{"doc_id":{"type":"string"},"quote":{"type":"string"}},"required":["doc_id","quote"]}},"conflict_note":{"type":["string","null"]},"hedge":{"type":"string"}},"required":["question_id","status","citations","hedge"]}[
{
"question_id": "Q-01",
"status": "answered",
"answer": "일반 폐기물은 매주 화요일과 목요일 오후 4시 이후에 지하 1층 집하장에 배출합니다.",
"citations": [
{
"doc_id": "DOC-01",
"quote": "매주 화·목 오후 4시 이후 지하 1층 집하장에 배출한다"
}
],
"conflict_note": "구버전 지침(DOC-05)은 금요일 오전 배출로 다르게 적혀 있어 함께 표시합니다.",
"hedge": "가상 더미 지침 기준의 답변입니다."
},
{
"question_id": "Q-05",
"status": "no_evidence",
"answer": null,
"citations": [],
"conflict_note": null,
"hedge": "적재된 문서에서 음식물 쓰레기 처리 규정을 찾지 못해 답을 만들지 않았습니다. 담당 부서 확인이 필요합니다."
},
{
"question_id": "Q-08",
"status": "answered",
"answer": "국내 출장은 이동 수단과 거리만 기록하면 배출량이 자동 계산되고, 해외 출장은 항공권 확정 후 3일 안에 노선 정보를 입력합니다.",
"citations": [
{
"doc_id": "DOC-04",
"quote": "국내 출장은 이동 수단과 거리만 기록하면 배출량은 시스템이 자동 계산한다"
},
{
"doc_id": "DOC-04",
"quote": "해외 출장은 항공권 예약 확정 후 3일 안에 노선 정보를 입력한다"
}
],
"conflict_note": null,
"hedge": "질문의 오타(타소)를 탄소로 해석해 검색했습니다. 가상 더미 지침 기준의 답변입니다."
}
][자동 검증 · 스크립트가 전수 수행] 1. 출력이 JSON Schema 형식을 통과하는지 확인합니다(형식 깨진 답변이 화면에 나가는 것을 차단). 2. citations 의 모든 quote 가 해당 doc_id 원문의 실제 문장 조각(공백 정규화 후 substring)인지 확인합니다(인용 환각 차단). 3. status 가 answered 인데 citations 가 비어 있거나, no_evidence 인데 answer 가 채워진 조합을 차단합니다. 4. 골든셋의 무근거 질문이 no_evidence 로 답해졌는지 채점합니다(지어내기 탐지). [수동 검증 · 사람이 표본 확인] 1. answer 가 인용 범위를 넘어 과장하지 않는지 10건을 표본 검토합니다. 2. 상충 문서가 걸린 답변에 conflict_note 가 붙는지 확인합니다.