타이드풀
경력근거: AI 기술로 양식 운영을 최적화하여 고품질 수산물을 합리적인 비용으로 생산
※ 실제 산출물이 아닌 AI 예측 시안입니다.
타이드풀은 AI로 양식 운영을 최적화해 고품질 수산물을 합리적 비용으로 생산하는 FISHSCOPE를 만듭니다. 운영 로그에서 이상 징후를 짚고 조정을 제안하는 이 도구는 그 제품의 핵심 가치를 그대로 MVP로 만든 것입니다. 풀스택 AI PE가 기능을 끝까지 상용화하는 자리라 운영 콘솔(React)·이상 탐지 API(FastAPI)·로그 스트림 처리(Kafka·Redis)·클라우드 배포(AWS·GCP·Azure)까지 한 사람이 끝까지 구현하는 데 적합합니다.
AI 기술로 양식 운영을 최적화해 고품질 수산물을 합리적 비용으로 생산하는 FISHSCOPE가 핵심 제품입니다. 운영 로그에서 이상 징후를 짚고 조정을 제안하는 이 도구가 그 제품과 곧바로 정렬됩니다.
짧은 사이클로 기능 단위 프로토타이핑을 하고 SaaS/HaaS 제품을 끝까지 개발·상용화하는 자리입니다. 운영 콘솔을 한 사람이 프론트·백엔드·배포까지 완성하는 흐름과 맞습니다.
Redis·Kafka 메시지 큐와 AWS·GCP·Azure 클라우드, 관측성·장애 대응으로 운영 안정성을 개선하는 업무입니다. 일일 로그를 모아 이상 징후를 처리하는 스트림 구조와 닿습니다.
연어·광어 양식장의 수온·산소·급이량·폐사 수 일일 운영 로그를 받아, 임계 이탈·폐사 급증·급이 누락 같은 이상 징후를 규칙과 LLM으로 짚고, 어떤 로그를 근거로 환경·급이를 어떻게 조정할지 초안을 만들어 양식 운영 콘솔에 모읍니다. 양식장·어종 기준값 마스터를 붙여 표기를 정규화하고 센서 결측을 표시합니다.
타이드풀 AI Product Engineer가 만드는 도구를 쓰는 양식장 운영 관리자입니다. 수온·산소·급이·폐사 기록을 표마다 따로 확인하다 폐사가 늘어난 신호를 뒤늦게 알아채던 상황을, 한 콘솔에서 이상 징후와 근거 로그, 조정 초안을 함께 보고 무엇을 바꿀지 바로 판단하고 싶은 사람입니다.
양식장 운영 로그와 어종별 기준값 마스터를 한 표준 구조로 묶으면, (a) 임계 이탈·폐사 급증·급이 누락 이상 징후를 규칙으로 짚고, (b) 근거 로그를 인용해 환경·급이 조정 초안을 만들며, (c) 짚은 이상 징후가 심어둔 정답 이상과 맞는지 대조로 채점합니다.
양식장 일일 운영 로그를 받아 임계 이탈·폐사 급증·급이 누락 이상 징후를 짚고 근거 로그를 붙여 환경·급이 조정 초안을 만드는 동작하는 콘솔입니다. 입력은 양식장 운영 기록을 가정한 더미 로그로 시작하고, 센서 결측은 추측 대신 '결측'으로 표시합니다. 1주차 기본 기능은 Next 프론트를 Vercel로 배포해 바로 도는 데모로 만듭니다.
짚은 이상 징후를 심어둔 정답 이상과 대조해 정확도를 보여주고, 모호한 경계 사례는 양식 운영자 2명이 라벨링해 일치도를 보여주는 화면입니다. 이 단계부터 이상 탐지 API(FastAPI)·Kafka·Redis를 AWS(또는 GCP·Azure) 클라우드에 배포·운영하고 클라우드 비용을 대략 산정합니다.
어종(연어·광어)·양식장마다 다른 수온·산소·급이 기준값과 이상 규칙을 공통 블록으로 묶어, 새 양식장 로그를 빠르게 붙여 이상 탐지가 도는 단계입니다.
양식장 일일 로그 12일치를 넣으면, 이상 징후와 근거 로그·환경·급이 조정 초안이 몇 초 안에 나오는 걸 시연합니다
일부러 만든 악성·결측 입력 30종(센서 결측·급이 0 휴무·수온 극단값·양식장 코드 표기 흔들림)을 넣어도 출력 형식(스키마)이 한 번도 안 깨지고 결측이 표시되는 걸 보여줍니다
일일 로그가 들어오면 이상 탐지와 조정 초안이 자동으로 채워지는 걸 시연으로 보여줍니다
내가 만든 정답 40건 중 짚은 이상 징후가 정답 이상과 일치한 게 34건(약 85%)입니다. 정답 이상은 임계 규칙으로 결정해 심어둔 값이라 객관 채점되고 폐사 급증·급이 누락도 규칙으로 결정됩니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 이상 탐지 정확도는 타이드풀 실 양식장 센서 데이터와 실 운영자가 있어야 측정 가능합니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다
정답 이상을 작성자가 만들었으니 잘 맞는 게 당연합니다. 센서 결측·휴무 0급이·수온 극단값 같은 경계 케이스를 더미에 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줍니다
수온·폐사는 상관이 인과가 아닐 수 있습니다. 이상 징후는 근거 로그를 인용해 보여주고 조정은 단정 대신 '검토 권고'로 표시하며, 폐사 급증은 임계 규칙으로만 확정합니다
양식장 코드·어종 표기가 기록마다 제각각입니다. 마스터로 같은 양식장으로 묶고, 못 묶은 건 추측하지 말고 '미등록 양식장'으로 알립니다
실제 도입 시 달라지는 점을 명시합니다. 실 센서 분포·어종별 기준값·결측 양상은 더미와 다르므로 기준값 마스터·이상 규칙을 다시 맞추고 검토자도 실제 운영 인력으로 교체해야 합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
양식장 일일 운영 로그(수온·산소·급이량·폐사 수). 이상 탐지가 읽는 입력입니다. 센서 결측·경계값·미등록 양식장·표기 흔들림을 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
| log_id | farm_code_raw | farm_id | species | water_temp | oxygen | feed_kg | mortality | log_date |
|---|---|---|---|---|---|---|---|---|
| l_001 | F-A1 | farm_a1 | salmon | 14.2 | 8.1 | 120 | 3 | 2026-05-01 |
| l_002 | F-A1 | farm_a1 | salmon | 19.8 | 5.2 | 120 | 41 | 2026-05-02 |
| l_003 | f a1 | farm_a1 | salmon | — | 7.9 | 0 | 2 | 2026-05-03 |
| l_004 | F-B2 | farm_b2 | flatfish | 16 | 7 | 80 | 1 | 2026-05-01 |
| l_005 | F-B2 | farm_b2 | flatfish | 24.5 | 4.1 | 80 | 30 | 2026-05-02 |
아래 JSON Schema({"type":"object","properties":{"log_id":{"type":"string"},"farm_code_raw":{"type":"string"},"farm_id":{"type":["string","null"]},"species":{"enum":["salmon","flatfish"]},"water_temp":{"type":["number","null"]},"oxygen":{"type":["number","null"]},"feed_kg":{"type":["number","null"]},"mortality":{"type":["integer","null"]},"log_date":{"type":"string"}},"required":["log_id","farm_code_raw","farm_id","species","water_temp","oxygen","feed_kg","mortality","log_date"]})에 맞는 양식장 일일 운영 로그 더미 40행을 JSON 배열로 생성합니다. 양식장 3~4곳, 어종 salmon/flatfish, 날짜 연속. 모두 가상 더미.
쉬운 데이터만 만들지 말 것. 이상 징후 정답이 임계 규칙으로 결정되게 심되 다음 하드 케이스를 의도적으로 섞어라(쉬운 문제만 푸는 함정 회피): (1) 센서 결측(water_temp·oxygen·feed_kg 일부 null) 4건, (2) 경계값(feed_kg=0 휴무, 수온 극단 24.5℃, 폐사 급증 30~41) 3건, (3) 미등록 양식장(farm_id=null) 2건, (4) 양식장 코드 표기 흔들림('F-A1'/'f a1'/'F-B2 ') 3건. JSON 배열만.{"type":"object","properties":{"log_id":{"type":"string"},"farm_code_raw":{"type":"string"},"farm_id":{"type":["string","null"]},"species":{"enum":["salmon","flatfish"]},"water_temp":{"type":["number","null"]},"oxygen":{"type":["number","null"]},"feed_kg":{"type":["number","null"]},"mortality":{"type":["integer","null"]},"log_date":{"type":"string"}},"required":["log_id","farm_code_raw","farm_id","species","water_temp","oxygen","feed_kg","mortality","log_date"]}어종·양식장별 수온·산소·급이 정상 범위와 폐사 급증 임계 마스터. 이상 탐지가 대조하는 기준입니다. 미등록 양식장·결측 기준·표기 흔들림을 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
| row_id | species | farm_id | temp_max | oxygen_min | mortality_spike |
|---|---|---|---|---|---|
| t_001 | salmon | farm_a1 | 18 | 6 | 20 |
| t_002 | flatfish | farm_b2 | 22 | 5 | 15 |
| t_003 | salmon | — | 18 | 6 | 20 |
| t_004 | salmon | farm_a1 | — | 6 | 20 |
| t_005 | flatfish | farm_b2 | 22 | — | 15 |
아래 JSON Schema에 맞는 어종·양식장별 기준값 마스터 40행을 JSON 배열로 생성합니다. 어종 salmon/flatfish.
{"type":"object","properties":{"row_id":{"type":"string"},"species":{"enum":["salmon","flatfish"]},"farm_id":{"type":["string","null"]},"temp_max":{"type":["number","null"]},"oxygen_min":{"type":["number","null"]},"mortality_spike":{"type":["integer","null"]}},"required":["row_id","species","farm_id","temp_max","oxygen_min","mortality_spike"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 미등록 양식장 기본 기준(farm_id=null, 어종 기본값) 2건, (2) 결측 기준(temp_max·oxygen_min·mortality_spike 일부 null) 3건, (3) 양식장별로 어종 기본값과 다른 맞춤 임계 다수. JSON 배열만.{"type":"object","properties":{"row_id":{"type":"string"},"species":{"enum":["salmon","flatfish"]},"farm_id":{"type":["string","null"]},"temp_max":{"type":["number","null"]},"oxygen_min":{"type":["number","null"]},"mortality_spike":{"type":["integer","null"]}},"required":["row_id","species","farm_id","temp_max","oxygen_min","mortality_spike"]}| Python | 이상 탐지 규칙·조정 초안 생성 파이프라인의 구현 언어 |
| TypeScript | 운영 콘솔 화면·로그 차트·이상 카드의 구현 언어 |
| React | 양식 운영 콘솔(로그 모니터·이상 징후·조정 초안 검토)의 화면 구현 |
| FastAPI | 이상 탐지·조정 초안 API와 로그 수집 엔드포인트 서버 |
| Spring | 일부 사내 기간계(출하·정산) 연동 어댑터를 가정한 JVM 백엔드 |
| NestJS | 콘솔 게이트웨이·검토자 라벨 수집 백엔드 가정 |
| Redis | 최근 로그 캐싱·이상 알림 큐·세션 관리 |
| Kafka | 양식장 센서·일일 로그를 모아 이상 탐지로 흘리는 스트림 처리 |
| AWS | 2주차부터 이상 탐지 API·Kafka·Redis를 AWS(ECS·MSK·ElastiCache)로 배포·운영 |
| GCP | 클라우드 대안으로 GCP(GKE·Pub/Sub) 배포 구성을 함께 가정 |
| Azure | 클라우드 대안으로 Azure(AKS·Event Hubs) 배포 구성을 함께 가정 |
| Docker | 이상 탐지 API·스트림 워커의 dev/staging/prod 컨테이너 구성과 배포 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(정답 대조 채점 + 클라우드 배포)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(어종·양식장별 기준값 사전 재사용 블록화)로 진행합니다.
양식장 하루치 로그 1건의 이상 카드. 짚은 이상 징후(근거 로그 인용·확신도)와 환경·급이 조정 제안, 결측 표시를 한 스키마로 담아 운영 콘솔에 씁니다.
{"type":"object","properties":{"log_id":{"type":"string"},"anomalies":{"type":"array","items":{"type":"object","properties":{"kind":{"enum":["temp_high","oxygen_low","mortality_spike","feed_missing"]},"evidence_log":{"type":"string"},"confidence":{"enum":["low","mid","high"]}},"required":["kind","evidence_log","confidence"]}},"suggestion":{"type":["string","null"]},"checks":{"type":"object","properties":{"missing_sensor":{"type":"array","items":{"type":"string"}},"unknown_farm":{"type":"boolean"},"note":{"type":["string","null"]}},"required":["missing_sensor","unknown_farm","note"]},"hedge":{"type":["string","null"]}},"required":["log_id","anomalies","suggestion","checks","hedge"]}[
{
"input_ref": "l_002 (수온 19.8℃·산소 5.2·폐사 41 — 임계 초과)",
"output": {
"log_id": "l_002",
"anomalies": [
{
"kind": "temp_high",
"evidence_log": "water_temp 19.8 > temp_max 18.0",
"confidence": "high"
},
{
"kind": "oxygen_low",
"evidence_log": "oxygen 5.2 < oxygen_min 6.0",
"confidence": "high"
},
{
"kind": "mortality_spike",
"evidence_log": "mortality 41 >= spike 20",
"confidence": "high"
}
],
"suggestion": "수온이 기준을 넘고 산소가 낮아 폐사가 급증했습니다. 수온을 낮추고 산소 공급을 늘리는 조정을 검토 권고합니다.",
"checks": {
"missing_sensor": [],
"unknown_farm": false,
"note": null
},
"hedge": null
}
},
{
"input_ref": "l_003 (수온 결측·급이 0 — 결측·휴무)",
"output": {
"log_id": "l_003",
"anomalies": [],
"suggestion": null,
"checks": {
"missing_sensor": [
"water_temp"
],
"unknown_farm": false,
"note": "수온 센서값이 결측이고 급이 0은 휴무로 보여 단정하지 않습니다."
},
"hedge": "수온 결측으로 임계 판정을 보류하고 결측만 표시합니다."
}
},
{
"input_ref": "l_006 (미등록 양식장 F-C3)",
"output": {
"log_id": "l_006",
"anomalies": [],
"suggestion": null,
"checks": {
"missing_sensor": [],
"unknown_farm": true,
"note": "양식장 F-C3가 마스터에 없어 어종 기본 기준으로만 점검했습니다."
},
"hedge": "미등록 양식장이라 맞춤 임계 대신 기본 임계로만 판정합니다."
}
}
][자동 검증 — 코드가 매 출력마다 자동으로 거릅니다] 1) JSON Schema 형식 통과: 출력이 정한 필드·타입을 지키는지 검사하고, 어기면 거부합니다. 2) anomalies.kind 가 기준값 마스터와 로그를 비교한 임계 규칙 결과와 일치하는지 코드가 자동 판정합니다 — 규칙으로 결정되는 이상을 임의로 바꾸지 못하게 합니다. 3) evidence_log 가 실제 로그·기준값을 인용한 비교식인지 대조합니다 — 없는 근거를 지어내지 못하게 합니다. 4) checks.missing_sensor 는 로그의 null 필드와 일치하는지, unknown_farm 은 양식장 마스터와 대조해 판정합니다. 5) 결측 센서가 있으면 그 항목 관련 anomaly 에 confidence=high 를 금지합니다(결측에 높은 확신 방지). [수동 검증 — 사람이 일부만 확인합니다] 1) 양식 운영자 2명이 같은 경계 사례를 따로 라벨링해, 두 사람 판단이 우연 이상으로 일치하는지 봅니다(Cohen's κ ≥ 0.6 — 0~1, 높을수록 일치). 2) 전체 출력의 5%는 사람이 직접 다시 확인합니다(spot check). [전제] 이상 징후 정답은 임계 규칙으로 결정해 로그에 심어두므로, 탐지 정밀도·재현율을 객관적으로 채점할 수 있습니다.