비바시티
경력근거: AI가 만든 결과를 그대로 받아들이지 않고 직접 테스트하고 검증하는 분
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고는 여러 에이전트에게 일을 나누어 지시하고 그 결과를 직접 검토·테스트해 배포까지 마치는 자리라고 적고, AI 가 만든 결과를 확인 없이 완료 처리하는 방식과는 맞지 않는다고 못박습니다. 이 포트폴리오는 그 검토 단계를 제품으로 만든 것입니다. 에이전트 출력을 원문과 대조해 채택 기준을 코드로 두고, 딤섬이 약속한 실제 원문 제시를 화면에서 지킵니다. 다만 이 포트폴리오는 검토 규칙과 화면 구현을 보여줍니다. 게임 운영 실무나 커뮤니티 감정 분석에 대한 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
제품의 목적을 이해해 요구사항과 예외를 정의한 뒤 여러 에이전트에게 일을 나누어 지시하고 결과를 직접 검토·테스트해 배포까지 마친다고 포지션 설명에 적습니다. 만드는 일과 검수하는 일이 한 사람 안에 있습니다.
AI 가 만든 결과를 그대로 받아들이지 않고 직접 테스트하고 검증하는 사람을 찾는다고 자격요건에 적고, 확인 없이 완료 처리하는 방식과는 맞지 않는다고 따로 못박습니다.
여러 채널에 흩어진 플레이어 피드백을 모아 중요한 이슈와 실제 원문을 게임 운영팀에 전달하는 제품이라고 회사 소개에 적습니다. 원문을 함께 보여주는 것이 제품의 약속입니다.
운영 담당자가 후보 목록을 열면, 에이전트가 커뮤니티 글에서 뽑은 이슈 후보마다 인용한 원문이 실제로 있는지와 재현 정보가 붙었는지를 확인해 넣을 것과 보류할 것을 나눠 보여줍니다. 넣을지 말지는 인용 대조와 재현 정보 유무를 보는 규칙이 정하고, 모델은 채택한 항목을 노트 문장으로 다듬는 일만 맡습니다.
저는 게임 운영에서 패치 노트를 씁니다. 커뮤니티에서 뽑아 온 이슈 목록을 받는데, 같은 버그가 표현만 다르게 세 번 올라와 있고 어떤 항목은 인용된 문장이 원문에서 찾아지지 않습니다. 결국 원문 링크를 하나씩 열어 확인하다 노트 작성이 밀립니다.
후보 검토가 오래 걸리는 이유는 항목이 많아서가 아니라 믿을 수 있는 항목과 확인이 필요한 항목이 섞여 있기 때문입니다. 인용 대조와 재현 정보로 먼저 나눠 주면, 담당자는 확인이 필요한 몇 건만 열어 보고 나머지는 그대로 노트로 넘깁니다.
운영 담당자가 쓰는 화면 하나가 완결됩니다. 이슈 후보마다 인용한 문장이 원문에 있는지 대조하고 재현 정보 유무를 확인해 채택·보류를 나눠 보여주며, 채택분으로 노트 초안을 만듭니다. 에이전트를 직접 돌리는 부분은 후보 파일을 받는 것으로 대신하고 3주차로 미룹니다.
담당자가 실제로 채택한 결과 150건과 규칙의 판정을 맞춰 보고, 규칙이 보류로 밀었지만 사람이 채택한 항목을 유형별로 냅니다. 그 유형이 다음 규칙 수정 대상이 됩니다.
에이전트가 후보를 만들어 넘기면 검토와 노트 초안까지 이어 돌고, 보류가 기준을 넘으면 후보 생성 프롬프트를 손볼 대상으로 표시합니다.
운영 담당자가 후보 목록을 열면 인용 대조와 재현 정보로 채택과 보류가 갈리고, 채택분으로 노트 초안이 만들어집니다.
인용 문장이 비거나 원문 식별자가 없거나 같은 내용이 세 번 올라온 후보 30종을 넣어도 화면이 죽지 않고, 확인이 필요한 항목이 사유와 같이 남습니다.
담당자 채택 결과 150건으로 규칙 판정의 일치율을 냅니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 더미데이터 자가채점이며 실제 채택 판단의 정확도는 비바시티의 실 후보와 운영팀 검토 기록이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 인용 결측·원문 식별자 누락·같은 내용의 중복 후보를 더미에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
인용이 원문에 있다는 사실이 그 이슈가 실제 결함이라는 뜻은 아닙니다. 사용자의 오해로 올라온 글도 그대로 인용되므로 판정을 결론으로 읽지 않게 원문을 항상 같이 보여줍니다.
실제 도입에서는 채널마다 원문 형식과 언어가 달라 인용 대조가 흔들립니다. 예외가 늘어나면 대조 규칙을 코드에서 빼 설정으로 옮겨야 하며, 그것은 도입 단계 과제로 분리합니다.
릴리스 노트를 실제로 배포하는 일은 이 포트폴리오의 범위 밖입니다. 여기서는 담당자가 손볼 초안을 내는 데까지만 다룹니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
채널에서 수집한 원문 글입니다. 인용 대조의 기준이며 짧은 글과 언어가 섞인 글을 포함합니다.
| post_no | channel | posted_at | body | lang | build_ver |
|---|---|---|---|---|---|
| PT-3001 | steam | 2026-08-14T10:00:00 | 1.8.2 패치 후 튜토리얼 3단계에서 진행이 막힙니다 | ko | 1.8.2 |
| PT-3002 | discord | 2026-08-14T11:20:00 | Guild raid rewards are not delivered a… | en | 1.8.2 |
| PT-3003 | inven | 2026-08-14T12:05:00 | 튜토리얼 3단계에서 안 넘어가요 저도 그렇습니다 | ko | — |
| PT-3004 | 2026-08-14T13:40:00 | Matchmaking wait time went up a lot to… | en | 1.8.2 | |
| PT-3005 | steam | 2026-08-14T15:10:00 | 좋아요 | ko | — |
아래 JSON Schema 에 맞는 커뮤니티 원문 행을 더 만들어 주세요. {"type":"object","properties":{"post_no":{"type":"string"},"channel":{"type":"string","enum":["steam","discord","reddit","inven"]},"posted_at":{"type":"string"},"body":{"type":"string"},"lang":{"type":["string","null"]},"build_ver":{"type":["string","null"]}},"required":["post_no","channel","posted_at","body"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) lang 이나 build_ver 가 null 인 행, (2) 본문이 다섯 자 이하인 짧은 글, (3) 같은 증상을 다른 언어로 적은 글 쌍, (4) 결함이 아니라 요청이나 칭찬인 글. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"post_no":{"type":"string"},"channel":{"type":"string","enum":["steam","discord","reddit","inven"]},"posted_at":{"type":"string"},"body":{"type":"string"},"lang":{"type":["string","null"]},"build_ver":{"type":["string","null"]}},"required":["post_no","channel","posted_at","body"]}에이전트가 원문에서 뽑아 넘긴 이슈 후보입니다. 검토의 입력이며 원문에 없는 인용과 같은 원문에서 두 번 뽑힌 중복 후보, 재현 정보 결측, 확신도 0 에 가깝거나 1 인 경계 행을 의도적으로 포함합니다.
| cand_no | source_post_no | title | quoted_text | issue_kind | repro_step | build_ver | agent_score |
|---|---|---|---|---|---|---|---|
| CD-9001 | PT-3001 | 튜토리얼 3단계 진행 불가 | 튜토리얼 3단계에서 진행이 막힙니다 | bug | 신규 계정으로 튜토리얼 3단계 진입 | 1.8.2 | 0.91 |
| CD-9002 | PT-3003 | 튜토리얼에서 막힘 | 튜토리얼 3단계에서 안 넘어가요 | bug | — | — | 0.72 |
| CD-9003 | PT-3002 | 길드전 보상 미지급 | Guild raid rewards are not delivered a… | bug | 점검 이후 길드전 완료 | 1.8.2 | 0.88 |
| CD-9004 | PT-3007 | 길드전 보상이 들어오지 않음 | 길드전 보상이 아직도 안 들어옵니다 | bug | — | 1.8.2 | 0.83 |
| CD-9005 | PT-3006 | 유럽 지역 통화 기호 오류 | The shop shows the wrong currency symb… | bug | 유럽 계정으로 상점 진입 | 1.8.1 | 0.79 |
아래 JSON Schema 에 맞는 이슈 후보 행을 더 만들어 주세요. {"type":"object","properties":{"cand_no":{"type":"string"},"source_post_no":{"type":["string","null"]},"title":{"type":"string"},"quoted_text":{"type":["string","null"]},"issue_kind":{"type":"string","enum":["bug","balance","request","praise"]},"repro_step":{"type":["string","null"]},"build_ver":{"type":["string","null"]},"agent_score":{"type":["number","null"]}},"required":["cand_no","title","issue_kind"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) quoted_text 나 repro_step 이 null 인 행, (2) source_post_no 가 null 이라 원문을 찾을 수 없는 행, (3) 원문에 없는 문장을 인용한 행, (4) 같은 source_post_no 에서 두 번 뽑힌 중복 후보와 agent_score 가 0 이나 1 인 경계 행. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"cand_no":{"type":"string"},"source_post_no":{"type":["string","null"]},"title":{"type":"string"},"quoted_text":{"type":["string","null"]},"issue_kind":{"type":"string","enum":["bug","balance","request","praise"]},"repro_step":{"type":["string","null"]},"build_ver":{"type":["string","null"]},"agent_score":{"type":["number","null"]}},"required":["cand_no","title","issue_kind"]}| TypeScript | 검토 규칙과 화면을 함께 쓰는 언어입니다. 인용 대조 규칙을 한 곳에 두고 러너와 화면이 같은 코드를 씁니다. |
| PostgreSQL | 원문과 후보와 검토 결과를 담습니다. 원문 식별자와 후보 식별자를 분리한 스키마가 대조의 정확도를 좌우합니다. |
| NestJS | 후보 접수와 검토 결과 조회를 맡는 백엔드입니다. |
| MCP | 3주차에 에이전트가 후보를 만들어 넘기는 연결 규격으로 씁니다. |
| SQL | 채택 이력과 보류 사유를 기간·채널별로 뽑아 보는 조회에 씁니다. |
| LLM | 채택이 끝난 항목을 노트 문장으로 다듬는 일만 맡습니다. 채택 여부는 규칙이 정합니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 담당자의 실제 선택과 규칙 판정을 맞춰 보는 단계로 넘어갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 후보 생성부터 노트 초안까지 이어 돌리는 단계로 확장합니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
review_code사유 라벨 · cand_no + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
accepted채택needs_repro재현 확인 필요duplicate중복quote_unverified인용 불일치post_unmapped원문 미매핑out_of_scope노트 대상 아님이슈 후보 한 건의 검토 결과입니다. 판정 코드와 근거가 된 값, 그리고 원문 번호를 함께 남깁니다.
{"type":"object","properties":{"result_id":{"type":"string"},"cand_no":{"type":"string"},"source_post_no":{"type":["string","null"]},"review_code":{"type":"string","enum":["accepted","needs_repro","duplicate","quote_unverified","post_unmapped","out_of_scope"]},"note_line":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{"type":["string","number","null"]}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["result_id","cand_no","review_code","evidence","summary"]}[
{
"result_id": "rv_0001",
"cand_no": "CD-9001",
"source_post_no": "PT-3001",
"review_code": "accepted",
"note_line": "튜토리얼 3단계에서 진행이 막히던 문제를 고쳤습니다.",
"evidence": [
{
"field": "quoted_text",
"agg": null,
"value": "튜토리얼 3단계에서 진행이 막힙니다"
},
{
"field": "repro_step",
"agg": null,
"value": "신규 계정으로 튜토리얼 3단계 진입"
}
],
"summary": "인용 문장이 원문에 있고 재현 절차도 있어 노트에 넣습니다.",
"hedge": null
},
{
"result_id": "rv_0002",
"cand_no": "CD-9003",
"source_post_no": "PT-3002",
"review_code": "accepted",
"note_line": "점검 이후 길드전 보상이 지급되지 않던 문제를 고쳤습니다.",
"evidence": [
{
"field": "quoted_text",
"agg": null,
"value": "Guild raid rewards are not delivered after the maintenance"
},
{
"field": "build_ver",
"agg": null,
"value": "1.8.2"
}
],
"summary": "인용과 빌드 버전이 원문과 맞아 노트에 넣습니다.",
"hedge": null
},
{
"result_id": "rv_0003",
"cand_no": "CD-9011",
"source_post_no": "PT-3009",
"review_code": "duplicate",
"note_line": null,
"evidence": [
{
"field": "title",
"agg": "count",
"value": 2
},
{
"field": "agent_score",
"agg": null,
"value": 0.94
}
],
"summary": "같은 제목의 후보가 두 건이라 점수가 높은 쪽만 남기고 이 건은 묶습니다.",
"hedge": null
},
{
"result_id": "rv_0004",
"cand_no": "CD-9006",
"source_post_no": "PT-3008",
"review_code": "needs_repro",
"note_line": null,
"evidence": [
{
"field": "repro_step",
"agg": null,
"value": null
},
{
"field": "build_ver",
"agg": null,
"value": null
}
],
"summary": "재현 절차와 빌드 버전이 모두 없어 확인 뒤에 넣습니다.",
"hedge": null
},
{
"result_id": "rv_0005",
"cand_no": "CD-9008",
"source_post_no": "PT-3004",
"review_code": "quote_unverified",
"note_line": null,
"evidence": [
{
"field": "quoted_text",
"agg": null,
"value": "Matchmaking wait time doubled after patch"
},
{
"field": "body",
"agg": null,
"value": "Matchmaking wait time went up a lot today"
}
],
"summary": "인용 문장이 원문에 없어 후보가 문장을 지어낸 것으로 보고 보류합니다.",
"hedge": null
},
{
"result_id": "rv_0006",
"cand_no": "CD-9009",
"source_post_no": null,
"review_code": "post_unmapped",
"note_line": null,
"evidence": [
{
"field": "source_post_no",
"agg": null,
"value": null
},
{
"field": "quoted_text",
"agg": null,
"value": "결제가 계속 실패합니다"
}
],
"summary": "원문 번호가 없어 어느 글에서 나왔는지 확인하지 못합니다.",
"hedge": null
},
{
"result_id": "rv_0007",
"cand_no": "CD-9010",
"source_post_no": "PT-3005",
"review_code": "out_of_scope",
"note_line": null,
"evidence": [
{
"field": "issue_kind",
"agg": null,
"value": "praise"
},
{
"field": "agent_score",
"agg": null,
"value": 0.31
}
],
"summary": "결함이 아니라 칭찬이라 릴리스 노트 대상이 아닙니다.",
"hedge": null
},
{
"result_id": "rv_0008",
"cand_no": "CD-9012",
"source_post_no": "PT-3012",
"review_code": "quote_unverified",
"note_line": null,
"evidence": [
{
"field": "quoted_text",
"agg": null,
"value": null
},
{
"field": "repro_step",
"agg": null,
"value": "매칭 대기 3분 경과"
}
],
"summary": "인용 문장이 비어 있어 원문과 맞춰 볼 수 없습니다.",
"hedge": "합성 기준 판정이라 실제로는 인용을 옮기는 단계에서 빠진 것일 수 있습니다."
},
{
"result_id": "rv_0009",
"cand_no": "CD-9013",
"source_post_no": "PT-3001",
"review_code": "duplicate",
"note_line": null,
"evidence": [
{
"field": "source_post_no",
"agg": "count",
"value": 2
},
{
"field": "agent_score",
"agg": null,
"value": 1
}
],
"summary": "같은 원문에서 두 번 뽑힌 후보라 먼저 채택한 건에 묶습니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. review_code 가 enum 여섯 값 중 하나인지 확인합니다. 2. result_id·cand_no·review_code·evidence·summary 가 모두 채워졌는지 확인합니다. 3. agent_score 가 0 이상 1 이하인지 확인합니다. 확신도가 1 인 경계 행도 그대로 통과합니다. 4. evidence 의 field 이름이 원문과 후보 데이터에 실재하는 컬럼인지 대조합니다. 5. quoted_text 가 그 source_post_no 원문의 부분 문자열인지 확인합니다. 아니면 review_code 는 quote_unverified 입니다. 6. review_code 가 accepted 이면 note_line 이 채워졌는지 확인합니다. 후보에는 채택된 건과 보류된 건이 모두 있습니다. 7. summary 와 note_line 이 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 담당자가 실제로 채택한 결과 150건과 규칙의 review_code 를 비교해 일치율과 규칙이 보류로 밀었지만 사람이 채택한 유형을 냅니다. [수동 검증 · 사람이 봅니다] 1. 같은 증상을 다른 언어로 적은 후보를 중복으로 묶을지 표본 20건을 눈으로 확인합니다. 2. 요청과 결함의 경계에 있는 후보를 노트에 넣을지는 운영 기준을 따라 담당자가 정합니다.
근거: AI가 만든 결과를 그대로 받아들이지 않고 직접 테스트하고 검증하는 분