구글
경력근거: an embedded builder who bridges the gap between frontier AI products
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고가 GenAI FDE 의 일로 'multi-agent systems, MCP servers 같은 프로덕션급 agentic workflow 로 옮긴다' 와 'agentic system 이 정확·안전·지연 요건을 만족하는지 보장하는 평가 파이프라인과 관측 프레임워크를 만든다' 를 나란히 적었습니다. 우대사항에는 hierarchical delegation·self-reflection 같은 복잡한 패턴과 granular tracing, state management 최적화가 있습니다. 위임과 되돌아봄이 얽힌 실행에서 관측이 어려운 지점이 바로 그 구조이고, 이 포트폴리오는 그 구조를 규칙으로 읽습니다. 이 포트폴리오가 보여주는 것은 실행 트레이스를 그래프로 세워 구조 규칙으로 판정하는 기술이며, Google Cloud 운영 경험이나 고객사 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
'frontier AI 와 production-grade reality 의 간극을 잇는 embedded builder'. 고객 환경 배포가 핵심.
'Gen AI, Google Cloud'. RAG 어시스턴트 배포가 1주 단위.
'RAG, LangGraph' 역량. 근거 인용 파이프라인이 토대.
멀티에이전트 실행이 어디서 멈췄는지 위임 흐름으로 가려냅니다. 스팬의 부모·자식 관계를 세워 위임 그래프를 만들고, 상한을 넘긴 깊이와 되도는 위임, 부모가 없는 스팬, 처리되지 않은 도구 오류를 구조 규칙으로 판정합니다. 판정마다 걸린 규칙 번호와 스팬 식별자를 근거로 남기고, 어느 규칙에도 안 걸리면 정상 완료로 둡니다. 실행 트레이스는 실 고객사 데이터 대신 지원자가 오픈 에이전트 프레임워크를 돌려 OpenTelemetry GenAI 규약으로 뽑은 결과를 가정합니다.
고객사 환경에 멀티에이전트를 붙이고 나서 답이 안 나온다는 연락을 받으면 트레이스를 열어 스팬을 하나씩 따라가던 FDE 입니다. 계획 단계에서 도는지, 도구가 실패했는데 아무도 안 받았는지, 위임이 너무 깊이 내려갔는지는 구조를 보면 갈리는데 그 구조를 매번 눈으로 세우던 사람입니다.
스팬의 부모·자식 관계로 위임 그래프를 세우고 구조 규칙과 맞추면, 끊긴 자리와 되도는 자리가 규칙으로 정해지고 판정에 쓴 스팬이 근거로 남는다는 가정입니다. 규칙에 안 걸리는 실행은 정상 완료로 두므로 구조로 못 잡는 실패가 그대로 남습니다.
실행 트레이스를 받아 스팬의 부모·자식 관계로 위임 그래프를 세우고, 구조 규칙으로 되도는 위임·고아 스팬·깊이 초과·미처리 도구 오류를 가려내 사유별로 묶은 리포트를 터미널과 Markdown 파일로 내는 CLI 가 도는 완결품입니다.
직접 돌린 실행 40건에 손으로 붙인 정답 판정과 대조해 일치율을 내고, 정상 완료로 뒀는데 실제로는 답이 틀린 실행을 모아 구조로 못 잡는 유형을 목록으로 냅니다.
스팬마다 토큰과 지연을 합산해 어느 에이전트가 실행 시간을 끌었는지 보이고, 같은 실행을 여러 번 돌렸을 때 구조가 흔들리는지 회귀로 확인하는 단계입니다.
FDE 가 실행 트레이스를 넣으면 위임 그래프가 세워지고 끊긴 자리와 되도는 자리가 사유별로 묶여 나오는 과정을 시연합니다.
직접 돌린 실행 40건과 손으로 붙인 정답 판정을 대조해 일치율을 냅니다. 단, 정답과 트레이스를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
부모가 없는 스팬·자식이 없는 위임·규칙에 없는 구조가 섞인 입력 30종을 넣어도 출력 형식이 안 깨지고 미매칭으로 빠지는 비율을 보여줍니다.
같은 실행을 여러 번 돌렸을 때 구조 판정이 같게 나오는지 회귀로 확인합니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 작성자가 직접 돌린 실행의 자가채점이며, 실제 진단 적중률은 구글 고객사의 실 에이전트 트레이스가 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 붙였으니 잘 맞는 게 당연하므로, 규칙에 없는 구조와 자식이 없는 위임을 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
이 포트폴리오가 보여주는 것은 실행 트레이스를 그래프로 세워 구조 규칙으로 판정하는 기술이며, Google Cloud 운영 경험이나 고객사 도메인 전문성은 주장하지 않습니다. 구조 판정은 그래프 탐색이 하고 LLM 은 담당자가 읽을 요약 문장만 맡습니다.
구조가 멀쩡해도 답이 틀릴 수 있어서 정상 완료가 정답을 뜻하지는 않으므로, 판정에 답의 옳고 그름을 단정하는 문구를 쓰지 않습니다.
실제 도입 때는 고객사마다 에이전트 구성과 허용 깊이가 다르므로, 구조 규칙을 새로 채우는 일을 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
멀티에이전트 실행 트레이스의 스팬입니다. OpenTelemetry GenAI 규약을 따르므로 지원자가 오픈 에이전트 프레임워크를 돌려 직접 뽑을 수 있습니다. 정상 완료 한 건과 되도는 위임·부모가 없는 스팬·미처리 도구 오류·자식이 없는 위임을 섞었습니다. 판정 결과는 이 표에 두지 않습니다.
| span_id | trace_id | parent_span_id | agent_name | step_type | tool_name | span_status | input_tokens | output_tokens | latency_ms |
|---|---|---|---|---|---|---|---|---|---|
| sp-1001 | tr-2001 | — | orchestrator | plan | — | ok | 1,800 | 220 | 940 |
| sp-1002 | tr-2001 | sp-1001 | retriever | delegate | — | ok | 600 | 140 | 510 |
| sp-1003 | tr-2001 | sp-1002 | retriever | act | vector_search | ok | 900 | 80 | 320 |
| sp-1004 | tr-2001 | sp-1001 | writer | delegate | — | ok | 1,400 | 610 | 1,580 |
| sp-1005 | tr-2002 | — | orchestrator | plan | — | ok | 1,700 | 240 | 880 |
아래 JSON Schema 를 그대로 만족하는 스팬 행을 80개 더 만들어 주세요. 트레이스 하나에 스팬 3~8개가 들어가게 하고 parent_span_id 로 위임 관계를 세웁니다. 2할은 되도는 위임이나 부모가 없는 스팬으로 두고, 1할은 도구 스팬이 error 인데 뒤를 받는 스팬이 없게 하세요. 판정이나 사유는 넣지 마세요.
{"type": "object", "properties": {"span_id": {"type": "string"}, "trace_id": {"type": "string"}, "parent_span_id": {"type": ["string", "null"]}, "agent_name": {"type": "string"}, "step_type": {"type": "string", "enum": ["plan", "act", "reflect", "delegate"]}, "tool_name": {"type": ["string", "null"]}, "span_status": {"type": "string", "enum": ["ok", "error"]}, "input_tokens": {"type": ["integer", "null"]}, "output_tokens": {"type": ["integer", "null"]}, "latency_ms": {"type": ["integer", "null"]}}, "required": ["span_id", "trace_id", "parent_span_id", "agent_name", "step_type", "span_status"]}{"type": "object", "properties": {"span_id": {"type": "string"}, "trace_id": {"type": "string"}, "parent_span_id": {"type": ["string", "null"]}, "agent_name": {"type": "string"}, "step_type": {"type": "string", "enum": ["plan", "act", "reflect", "delegate"]}, "tool_name": {"type": ["string", "null"]}, "span_status": {"type": "string", "enum": ["ok", "error"]}, "input_tokens": {"type": ["integer", "null"]}, "output_tokens": {"type": ["integer", "null"]}, "latency_ms": {"type": ["integer", "null"]}}, "required": ["span_id", "trace_id", "parent_span_id", "agent_name", "step_type", "span_status"]}실행 구조를 보는 규칙표입니다. 검사 종류와 상한값, 차단 여부, 왜 문제인지를 한 행에 둡니다. 차단 규칙과 경고 규칙을 섞어 두어 걸렸을 때 실행을 멈출지 기록만 할지가 갈립니다. 스팬에 나오는 구조 중 일부는 규칙을 넣지 않아 구조로 못 잡는 실패가 남게 둡니다.
| policy_no | check_kind | limit_value | severity | description | registered_on |
|---|---|---|---|---|---|
| PL-01 | delegation_depth | 3 | warn | 위임이 세 단계를 넘어 내려가면 어느 에이전트가 답을 내는지 흐려집니다. | 2026-04-02 |
| PL-02 | delegation_cycle | — | block | 같은 에이전트로 위임이 되돌아오면 답이 나오지 않고 돕니다. | 2026-04-02 |
| PL-03 | orphan_span | — | block | 부모 스팬이 트레이스에 없으면 실행 흐름이 끊긴 것입니다. | 2026-04-02 |
| PL-04 | tool_error_unhandled | — | block | 도구 스팬이 error 인데 그 뒤를 받는 스팬이 없으면 오류가 그대… | 2026-05-14 |
| PL-05 | reflect_repeat | 2 | warn | 같은 에이전트의 반성 단계가 두 번을 넘으면 되돌아봄이 루프가 됩니다. | 2026-05-14 |
아래 JSON Schema 를 그대로 만족하는 구조 규칙 행을 30개 더 만들어 주세요. check_kind 는 위임 관계·스팬 상태·토큰·지연을 보는 종류로 섞고 severity 를 block 과 warn 으로 나눕니다. 상한이 없는 검사는 limit_value 를 null 로 둡니다.
{"type": "object", "properties": {"policy_no": {"type": "string"}, "check_kind": {"type": "string"}, "limit_value": {"type": ["integer", "null"]}, "severity": {"type": "string", "enum": ["block", "warn"]}, "description": {"type": "string"}, "registered_on": {"type": "string"}}, "required": ["policy_no", "check_kind", "severity", "description"]}{"type": "object", "properties": {"policy_no": {"type": "string"}, "check_kind": {"type": "string"}, "limit_value": {"type": ["integer", "null"]}, "severity": {"type": "string", "enum": ["block", "warn"]}, "description": {"type": "string"}, "registered_on": {"type": "string"}}, "required": ["policy_no", "check_kind", "severity", "description"]}| Python | 스팬을 부모·자식 관계로 세우고 사이클과 깊이를 재는 그래프 탐색을 맡습니다. |
| OpenTelemetry | 실행 트레이스를 GenAI 규약 속성으로 받는 입력 형식으로 씁니다. |
| LangGraph / ADK | 위임이 얽힌 실행을 만들어 트레이스를 뽑는 데 씁니다. |
| Markdown | 사유별로 묶은 판정 리포트를 파일로 냅니다. |
✗ fail → 정상 완료가 대부분이면 규칙을 먼저 늘립니다.
✓ pass → 2주차 정답 대조로 넘어갑니다.
✗ fail → 그 유형을 모아 새 구조 규칙 후보로 세웁니다.
✓ pass → 3주차 토큰·지연 합산으로 넘어갑니다.
트레이스 한 건마다 위임 그래프를 세워 구조 규칙과 맞춘 판정을 냅니다. 걸린 규칙 번호와 판정에 쓴 스팬 식별자를 함께 싣고, 어느 규칙에도 안 걸리면 정상 완료로 둡니다.
{"type": "object", "properties": {"verdict_no": {"type": "string"}, "trace_id": {"type": "string"}, "trace_code": {"type": "string", "enum": ["completed", "delegation_cycle", "orphan_span", "tool_error_unhandled", "delegate_without_child", "policy_unmatched"]}, "policy_no": {"type": ["string", "null"]}, "severity": {"type": ["string", "null"]}, "span_path": {"type": "array", "items": {"type": "string"}}, "evidence": {"type": "array", "items": {"type": "object", "properties": {"field": {"type": "string"}, "agg": {"type": ["string", "null"]}, "value": {}}, "required": ["field", "value"]}}, "summary": {"type": "string"}, "hedge": {"type": ["string", "null"]}}, "required": ["verdict_no", "trace_id", "trace_code", "policy_no", "span_path", "evidence", "summary"]}[
{
"verdict_no": "TV-001",
"trace_id": "tr-2001",
"trace_code": "completed",
"policy_no": null,
"severity": null,
"span_path": [
"sp-1001",
"sp-1002",
"sp-1003"
],
"evidence": [
{
"field": "span_id",
"agg": null,
"value": "sp-1001"
},
{
"field": "step_type",
"agg": null,
"value": "plan"
},
{
"field": "span_id",
"agg": "count",
"value": 4
}
],
"summary": "계획에서 시작해 위임이 두 단계로 끝나고 모든 스팬이 ok 라 정상 완료로 둡니다.",
"hedge": null
},
{
"verdict_no": "TV-002",
"trace_id": "tr-2005",
"trace_code": "completed",
"policy_no": null,
"severity": null,
"span_path": [
"sp-1013",
"sp-1014"
],
"evidence": [
{
"field": "span_id",
"agg": null,
"value": "sp-1013"
},
{
"field": "step_type",
"agg": null,
"value": "reflect"
},
{
"field": "span_id",
"agg": "count",
"value": 2
}
],
"summary": "반성 단계가 한 번뿐이라 상한을 넘지 않아 정상 완료로 둡니다.",
"hedge": null
},
{
"verdict_no": "TV-003",
"trace_id": "tr-2002",
"trace_code": "delegation_cycle",
"policy_no": "PL-02",
"severity": "block",
"span_path": [
"sp-1005",
"sp-1006",
"sp-1007",
"sp-1008"
],
"evidence": [
{
"field": "agent_name",
"agg": null,
"value": "reviewer"
},
{
"field": "parent_span_id",
"agg": null,
"value": "sp-1007"
},
{
"field": "span_id",
"agg": null,
"value": "sp-1008"
}
],
"summary": "reviewer 가 writer 에게 넘긴 일이 다시 reviewer 로 돌아와 위임이 돕니다.",
"hedge": "차단 규칙이라 이 구조가 풀리기 전에는 실행을 그대로 두지 않습니다."
},
{
"verdict_no": "TV-004",
"trace_id": "tr-2003",
"trace_code": "orphan_span",
"policy_no": "PL-03",
"severity": "block",
"span_path": [
"sp-1010"
],
"evidence": [
{
"field": "parent_span_id",
"agg": null,
"value": "sp-1099"
},
{
"field": "span_id",
"agg": null,
"value": "sp-1010"
}
],
"summary": "sp-1010 의 부모로 적힌 sp-1099 가 트레이스에 없어 실행 흐름이 끊겼습니다.",
"hedge": null
},
{
"verdict_no": "TV-005",
"trace_id": "tr-2004",
"trace_code": "tool_error_unhandled",
"policy_no": "PL-04",
"severity": "block",
"span_path": [
"sp-1011",
"sp-1012"
],
"evidence": [
{
"field": "span_status",
"agg": null,
"value": "error"
},
{
"field": "tool_name",
"agg": null,
"value": "http_get"
},
{
"field": "latency_ms",
"agg": null,
"value": 15200
}
],
"summary": "http_get 스팬이 error 로 끝났는데 뒤를 받는 스팬이 없어 오류가 그대로 남았습니다.",
"hedge": "같은 스팬이 지연 상한도 넘겼으나 차단 규칙을 먼저 냅니다."
},
{
"verdict_no": "TV-006",
"trace_id": "tr-2002",
"trace_code": "delegate_without_child",
"policy_no": "PL-09",
"severity": "warn",
"span_path": [
"sp-1008"
],
"evidence": [
{
"field": "step_type",
"agg": null,
"value": "delegate"
},
{
"field": "span_id",
"agg": null,
"value": "sp-1008"
}
],
"summary": "sp-1008 이 위임으로 끝나고 자식 스팬이 없어 넘긴 일이 수행되지 않았습니다.",
"hedge": null
},
{
"verdict_no": "TV-007",
"trace_id": "tr-2003",
"trace_code": "policy_unmatched",
"policy_no": null,
"severity": null,
"span_path": [
"sp-1009"
],
"evidence": [
{
"field": "step_type",
"agg": null,
"value": "plan"
},
{
"field": "policy_no",
"agg": "count",
"value": 12
}
],
"summary": "계획 뒤에 아무 단계도 이어지지 않았는데 규칙 열두 건 어디에도 이 구조가 없어 미매칭으로 남깁니다.",
"hedge": "구조로 못 잡는 실패라 2주차에 규칙 후보로 모읍니다."
}
][자동 검증 · 코드가 판정합니다] 1. trace_code 가 enum 여섯 값 중 하나인지 확인합니다. 2. verdict_no·trace_id·trace_code·policy_no·span_path·evidence·summary 가 모두 채워졌는지 확인합니다. 3. span_path 의 각 span_id 가 그 trace_id 의 스팬에 실재하는지 대조합니다. 4. span_path 가 부모·자식 관계로 실제로 이어지는지 대조합니다. 5. policy_no 가 규칙표에 실재하는 번호인지 대조하고, 있으면 severity 가 그 행의 값과 같은지 확인합니다. 6. trace_code 가 delegation_cycle 이면 span_path 에 같은 agent_name 이 두 번 나오는지 다시 계산합니다. 7. trace_code 가 orphan_span 이면 parent_span_id 가 그 트레이스에 없는지 다시 확인합니다. 8. trace_code 가 completed·policy_unmatched 이면 policy_no 가 null 인지 확인합니다. 9. evidence 의 field 이름이 스팬과 규칙표에 실재하는 컬럼인지 대조합니다. 10. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행 값과 같은지 확인합니다. 11. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 직접 돌린 실행 40건에 손으로 붙인 정답 판정과 대조해 일치율과 사유 코드별 분포를 내고, 정상 완료로 뒀는데 답이 틀린 실행을 모아 구조로 못 잡는 유형을 목록으로 냅니다. [수동 검증 · 사람이 봅니다] 1. 되도는 위임이 설계된 반복인지 사고인지 담당자가 정합니다. 2. 깊이 상한을 몇 단계로 둘지 고객사 구조에 맞춰 정합니다.