에이아이아테나
인턴·신입근거: AI를 활용하여 RAG, 임베딩모델 등을 개발합니다
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고는 RAG 와 임베딩 개발을 주요업무에 적고 로컬 LLM 과 LLM API 를 함께 다룬 경험을 자격요건에 둡니다. 이 포트폴리오는 그 검색 결과를 믿을 수 있게 만드는 쪽을 골랐습니다. 인용 대조를 규칙으로 두어 모델이 바뀌어도 판정 기준이 그대로 남고, 신입이 일주일에 끝낼 수 있는 크기로 잘랐습니다. 다만 이 포트폴리오는 인용 대조 규칙과 화면 구현을 보여줍니다. 검색 품질 개선이나 임베딩 모델 학습에 대한 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
AI 를 활용해 RAG 와 임베딩 모델 등을 개발한다고 주요업무에 적고, 로컬 LLM 과 LLM API 를 함께 다뤄 본 사람을 찾습니다. 모델을 부르는 데서 끝나지 않고 검색 품질을 만지는 자리입니다.
프론트엔드와 백엔드 개발, 핵심 코어 알고리즘 개선, 클라우드 운영 개발을 함께 적습니다. 신입 자리이지만 하나의 기능을 처음부터 끝까지 완성하는 경험을 요구합니다.
Git 기반 협업과 문서화·소통이 원활한 사람을 자격요건에 적습니다. 결과를 남기고 설명하는 일이 평가 대상인 자리라, 판단 근거가 화면에 남는 제품이 잘 맞습니다.
문서 담당자가 답변 목록을 열면, 답변마다 인용한 문장이 지목한 원문 문단에 실제로 있는지 대조해 확인된 답변과 손볼 답변을 나눠 보여줍니다. 대조 판정은 문자열 비교 규칙이 정하고, 모델은 인용 문장이 지목한 문단의 어디와 어긋나는지를 담당자가 읽을 한 줄로 요약합니다.
저는 사내 규정 문서를 관리합니다. 검색 도우미가 답변을 내주는데, 인용한 문장이 규정 어디에 있는지 찾다 보면 없는 경우가 있습니다. 답변마다 원문을 열어 확인하다 보니 도우미를 쓰는 시간보다 검토하는 시간이 깁니다.
답변을 믿기 어려운 이유는 모델이 나빠서가 아니라 인용이 원문과 맞는지 확인할 자리가 없기 때문입니다. 인용 문장을 문단과 맞춰 확인된 답변과 손볼 답변을 나눠 주면, 담당자는 손볼 것만 열어 봅니다.
문서 담당자가 쓰는 화면 하나가 완결됩니다. 답변마다 인용 문장을 지목한 문단과 대조해 확인·불일치·미매핑을 나눠 보여주고, 대조한 두 문장을 나란히 냅니다. 검색 도우미를 직접 붙이는 일은 답변 파일을 받는 것으로 대신하고 3주차로 미룹니다.
담당자가 손으로 확인한 판정 120건과 규칙의 결과를 맞춰 보고, 어느 유형에서 갈리는지 표로 냅니다. 띄어쓰기와 조사만 다른 인용을 어디까지 인정할지가 그 표에서 정해집니다.
검색 도우미가 답변을 넘기면 대조가 이어서 돌고, 불일치 비율이 기준을 넘으면 그 문서를 재색인 대상으로 표시합니다.
문서 담당자가 답변 목록을 열면 인용 대조 결과가 갈리고, 대조한 인용 문장과 원문 문단이 나란히 보입니다.
인용이 비거나 문단 번호가 없거나 지워진 문단을 가리키는 답변 30종을 넣어도 화면이 죽지 않고, 대조할 수 없는 답변은 미매핑으로 남습니다.
담당자 판정 120건으로 규칙 결과의 일치율을 냅니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 더미데이터 자가채점이며 실제 인용 정확도는 에이아이아테나의 실 문서와 검색 답변이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 인용 결측·문단 번호 누락·지워진 문단 참조를 더미에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
인용이 원문에 있다는 사실이 답변이 맞다는 뜻은 아닙니다. 맞는 문장을 엉뚱한 질문에 붙일 수도 있으므로 판정을 결론으로 읽지 않게 두 문장을 항상 같이 보여줍니다.
실제 도입에서는 문서 개정으로 문단 번호가 밀려 예전 답변의 인용이 어긋납니다. 개정 이력이 늘어나면 대조 규칙을 코드에서 빼 설정으로 옮겨야 하며, 그것은 도입 단계 과제로 분리합니다.
검색 품질을 올리는 색인과 임베딩 개선은 이 포트폴리오의 범위 밖입니다. 여기서는 나온 답변을 원문과 맞춰 보는 데까지만 다룹니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
사내 문서를 문단 단위로 나눈 원문입니다. 대조의 기준이며 개정으로 지워진 문단과 표기가 흔들린 문서 코드를 의도적으로 포함합니다.
| para_no | doc_code_raw | revision | text | is_active | updated_on |
|---|---|---|---|---|---|
| PA-1001 | HR-2026 | v3 | 연차는 입사일 기준으로 매년 새로 부여되며 사용하지 않은 연차는 다음… | true | 2026-03-02 |
| PA-1002 | HR-2026 | v3 | 반차는 오전과 오후로 나누어 사용하며 하루에 두 번 신청할 수 없습니다. | true | 2026-03-02 |
| PA-1003 | HR-2026 | v2 | 연차는 회계연도 기준으로 부여합니다. | false | 2025-01-10 |
| PA-1004 | SEC-2026 | v1 | 외부 저장장치는 보안팀 승인 후에만 반입할 수 있습니다. | true | 2026-05-19 |
| PA-1005 | SEC-2026 | v1 | 사내망 접속 계정은 6개월마다 비밀번호를 바꿉니다. | true | 2026-05-19 |
아래 JSON Schema 에 맞는 문단 행을 더 만들어 주세요. {"type":"object","properties":{"para_no":{"type":"string"},"doc_code_raw":{"type":"string"},"revision":{"type":"string"},"text":{"type":"string"},"is_active":{"type":"boolean"},"updated_on":{"type":"string"}},"required":["para_no","doc_code_raw","revision","text","is_active"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) is_active 가 false 인 지난 개정 문단, (2) text 가 빈 문단, (3) doc_code_raw 의 구분자와 대소문자가 흔들린 행, (4) 같은 내용이 개정본마다 수치만 다른 문단 쌍. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"para_no":{"type":"string"},"doc_code_raw":{"type":"string"},"revision":{"type":"string"},"text":{"type":"string"},"is_active":{"type":"boolean"},"updated_on":{"type":"string"}},"required":["para_no","doc_code_raw","revision","text","is_active"]}검색 도우미가 낸 답변입니다. 대조의 입력이며 인용 결측과 지워진 문단 참조, 조사만 다른 인용을 의도적으로 포함합니다.
| answer_no | asked_at | question | answer_text | cited_para_no | quoted_text | model |
|---|---|---|---|---|---|---|
| AN-2001 | 2026-08-17T09:10:00 | 연차가 이월되나요? | 이월되지 않습니다. | PA-1001 | 사용하지 않은 연차는 다음 해로 이월되지 않습니다 | api |
| AN-2002 | 2026-08-17T09:40:00 | 반차를 하루에 두 번 쓸 수 있나요? | 하루에 두 번은 신청할 수 없습니다. | PA-1002 | 하루에 두 번 신청할 수 없습니다 | api |
| AN-2003 | 2026-08-17T10:20:00 | 식대 한도가 얼마인가요? | 하루 2만원까지 인정됩니다. | PA-1009 | 식대는 1인당 하루 2만원까지 인정합니다. | local |
| AN-2004 | 2026-08-17T11:05:00 | 출장비는 언제 나오나요? | 영수증 제출 후 2주 안에 지급됩니다. | PA-1007 | 영수증을 제출한 날로부터 14일 이내에 지급합니다 | api |
| AN-2005 | 2026-08-17T13:00:00 | 외부 USB 를 가져와도 되나요? | 보안팀 승인이 필요합니다. | PA-1004 | 외부 저장장치는 보안팀의 승인 후에만 반입할 수 있습니다 | local |
아래 JSON Schema 에 맞는 답변 행을 더 만들어 주세요. {"type":"object","properties":{"answer_no":{"type":"string"},"asked_at":{"type":"string"},"question":{"type":"string"},"answer_text":{"type":"string"},"cited_para_no":{"type":["string","null"]},"quoted_text":{"type":["string","null"]},"model":{"type":"string","enum":["local","api"]}},"required":["answer_no","asked_at","question","answer_text","model"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) cited_para_no 나 quoted_text 가 null 인 행, (2) 문단 목록에 없는 cited_para_no, (3) 조사와 띄어쓰기만 다른 인용, (4) 지난 개정 문단을 인용한 행. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"answer_no":{"type":"string"},"asked_at":{"type":"string"},"question":{"type":"string"},"answer_text":{"type":"string"},"cited_para_no":{"type":["string","null"]},"quoted_text":{"type":["string","null"]},"model":{"type":"string","enum":["local","api"]}},"required":["answer_no","asked_at","question","answer_text","model"]}| TypeScript | 대조 규칙과 화면을 함께 쓰는 언어입니다. 정규화와 비교 규칙을 한 곳에 두고 러너와 화면이 같은 코드를 씁니다. |
| React | 문서 담당자가 보는 화면입니다. 답변과 원문 문단을 나란히 둡니다. |
| Node.js | 답변 접수와 대조 실행을 맡는 백엔드입니다. |
| RAG | 답변이 지목한 문단 번호를 그대로 받아 대조 대상으로 씁니다. 검색 자체는 이 포트폴리오가 만들지 않습니다. |
| LLM API | 3주차에 검색 도우미가 답변을 넘기는 연결에서 씁니다. |
| LLM | 대조가 끝난 뒤 인용과 원문 문단이 어긋난 자리를 한 줄로 요약합니다. 확인 여부는 규칙이 정합니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 담당자 판정과 규칙 결과를 맞춰 보는 단계로 넘어갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 검색 도우미의 답변을 바로 받아 대조하는 단계로 확장합니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
check_code사유 라벨 · answer_no + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
verified인용 확인normalized_match정규화 후 일치quote_not_found인용 불일치stale_revision지난 개정본citation_missing인용 결측para_unmapped문단 미매핑답변 한 건의 인용 대조 결과입니다. 판정 코드와 대조한 두 문장을 함께 남깁니다.
{"type":"object","properties":{"check_id":{"type":"string"},"answer_no":{"type":"string"},"cited_para_no":{"type":["string","null"]},"check_code":{"type":"string","enum":["verified","normalized_match","quote_not_found","stale_revision","citation_missing","para_unmapped"]},"evidence":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["answer","paragraph"]},"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{"type":["string","number","null"]}},"required":["source","field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["check_id","answer_no","check_code","evidence","summary"]}[
{
"check_id": "cc_0001",
"answer_no": "AN-2001",
"cited_para_no": "PA-1001",
"check_code": "verified",
"evidence": [
{
"source": "answer",
"field": "quoted_text",
"agg": null,
"value": "사용하지 않은 연차는 다음 해로 이월되지 않습니다"
},
{
"source": "paragraph",
"field": "para_no",
"agg": null,
"value": "PA-1001"
}
],
"summary": "인용 문장이 지목한 문단 안에 그대로 있습니다.",
"hedge": null
},
{
"check_id": "cc_0002",
"answer_no": "AN-2004",
"cited_para_no": "PA-1007",
"check_code": "verified",
"evidence": [
{
"source": "answer",
"field": "quoted_text",
"agg": null,
"value": "영수증을 제출한 날로부터 14일 이내에 지급합니다"
},
{
"source": "paragraph",
"field": "para_no",
"agg": null,
"value": "PA-1007"
}
],
"summary": "인용이 원문과 같아 답변을 그대로 씁니다.",
"hedge": null
},
{
"check_id": "cc_0003",
"answer_no": "AN-2005",
"cited_para_no": "PA-1004",
"check_code": "normalized_match",
"evidence": [
{
"source": "answer",
"field": "quoted_text",
"agg": null,
"value": "외부 저장장치는 보안팀의 승인 후에만 반입할 수 있습니다"
},
{
"source": "paragraph",
"field": "text",
"agg": null,
"value": "외부 저장장치는 보안팀 승인 후에만 반입할 수 있습니다."
}
],
"summary": "조사 하나만 다르고 나머지가 같아 정규화 후 같은 문장으로 봅니다.",
"hedge": "합성 기준 판정이라 조사 차이를 어디까지 허용할지는 담당자 확인이 필요합니다."
},
{
"check_id": "cc_0004",
"answer_no": "AN-2006",
"cited_para_no": "PA-1005",
"check_code": "quote_not_found",
"evidence": [
{
"source": "answer",
"field": "quoted_text",
"agg": null,
"value": "사내망 접속 계정은 3개월마다 비밀번호를 바꿉니다"
},
{
"source": "paragraph",
"field": "text",
"agg": null,
"value": "사내망 접속 계정은 6개월마다 비밀번호를 바꿉니다."
}
],
"summary": "인용한 숫자가 원문과 달라 답변을 고쳐야 합니다.",
"hedge": null
},
{
"check_id": "cc_0005",
"answer_no": "AN-2003",
"cited_para_no": "PA-1009",
"check_code": "stale_revision",
"evidence": [
{
"source": "paragraph",
"field": "is_active",
"agg": null,
"value": false
},
{
"source": "paragraph",
"field": "revision",
"agg": null,
"value": "v1"
}
],
"summary": "지난 개정본 문단을 인용해 현재 기준과 다릅니다.",
"hedge": null
},
{
"check_id": "cc_0006",
"answer_no": "AN-2007",
"cited_para_no": null,
"check_code": "citation_missing",
"evidence": [
{
"source": "answer",
"field": "cited_para_no",
"agg": null,
"value": null
},
{
"source": "answer",
"field": "quoted_text",
"agg": null,
"value": "노트북 교체 주기는 4년입니다."
}
],
"summary": "인용 문장은 있는데 어느 문단인지 지목하지 않아 대조하지 못합니다.",
"hedge": null
},
{
"check_id": "cc_0007",
"answer_no": "AN-2011",
"cited_para_no": "PA-9999",
"check_code": "para_unmapped",
"evidence": [
{
"source": "answer",
"field": "cited_para_no",
"agg": null,
"value": "PA-9999"
},
{
"source": "paragraph",
"field": "para_no",
"agg": "count",
"value": 0
}
],
"summary": "문단 목록에 없는 번호를 가리켜 원문을 찾지 못했습니다.",
"hedge": null
},
{
"check_id": "cc_0008",
"answer_no": "AN-2008",
"cited_para_no": "PA-1012",
"check_code": "citation_missing",
"evidence": [
{
"source": "answer",
"field": "quoted_text",
"agg": null,
"value": null
},
{
"source": "paragraph",
"field": "para_no",
"agg": null,
"value": "PA-1012"
}
],
"summary": "문단은 지목했지만 인용 문장이 비어 대조할 대상이 없습니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. check_code 가 enum 여섯 값 중 하나인지 확인합니다. 2. check_id·answer_no·check_code·evidence·summary 가 모두 채워졌는지 확인합니다. 3. evidence 항목 수가 2 이상인지 확인합니다. 4. evidence 의 field 이름이 문단과 답변 데이터에 실재하는 컬럼인지 대조합니다. 5. quoted_text 가 그 cited_para_no 문단 text 의 부분 문자열인지 확인합니다. 띄어쓰기와 문장부호를 지운 뒤에만 같으면 normalized_match 입니다. 6. 문단의 is_active 가 false 이면 check_code 는 stale_revision 인지 확인합니다. 문단에는 현재 개정본과 지난 개정본이 모두 있습니다. 7. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 담당자가 손으로 확인한 판정 120건과 규칙의 check_code 를 비교해 일치율과 갈리는 유형을 냅니다. [수동 검증 · 사람이 봅니다] 1. 조사와 어미만 다른 인용을 어디까지 같은 문장으로 볼지 표본 20건을 눈으로 확인합니다. 2. 본문이 빈 문단을 인용 대상에서 아예 뺄지는 문서 관리 기준을 따라 담당자가 정합니다.
근거: AI를 활용하여 RAG, 임베딩모델 등을 개발합니다