디써클
경력근거: AI 기반 R&D 파트너 매칭 및 연구 성과 PR 솔루션
※ 실제 산출물이 아닌 AI 예측 시안입니다.
디써클은 30만개 기업과 5만개 대학 연구실 프로필을 색인해 R&D 파트너를 매칭하는 RnDcircle 을 만듭니다. 과제와 연구실을 기술 키워드·분야코드로 잇는 이 매칭 사슬은 디써클처럼 정규화된 연구실 프로필 DB 가 있어야 의미가 있습니다. 이 포트폴리오는 검색·RAG·LLM 매칭 파이프라인 구현 역량을 보여주며, R&D 정책·기술이전 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
디써클의 RnDcircle 은 30만개 기업·5만개 대학 연구실 DB 를 검색해 R&D 파트너를 매칭합니다. 파편화된 프로필을 정규화해 매칭 근거를 만드는 게 제품의 뼈대입니다.
ElasticSearch 검색과 LLM 파이프라인, AI Agent 로 매칭·추천을 만드는 자리입니다. 키워드 검색으로 후보를 좁히고 LLM 이 근거를 설명하는 구조가 JD 그대로입니다.
신규 PoC 에 참여해 기술 가능성과 프로덕트 가치를 빠르게 검증하고 Tech Spec/ADR 로 남기는 역할. 매칭 한 루프를 데이터부터 근거 출력까지 완결하는 게 이 직무의 최소 단위입니다.
정부 R&D 과제 공고를 입력하면, 기업·연구실 프로필 DB 에서 기술 키워드가 겹치고 과거 수행 이력이 맞는 연구실 Top5 를 뽑아 '왜 맞는지' 근거를 붙여 보여주는 관리자 페이지입니다. 검색으로 후보를 좁히고 LLM 이 매칭 근거를 문장으로 설명합니다. 근거는 채용공고 정렬이고, 데이터는 작성자가 만든 더미입니다.
R&D 과제 공고를 하나 받아, 30만 기업·5만 연구실 중 어디에 제안해야 할지 매번 손으로 키워드를 뒤지던 상황을, 한 콘솔에서 근거까지 붙은 후보 목록으로 받고 싶은 디써클 PE 입니다.
과제 공고의 기술 요구를 키워드·분야코드로 정규화하고 연구실 프로필을 같은 축으로 색인하면, 검색이 후보를 좁히고 LLM 이 (a) 매칭 연구실 Top5 와 (b) 각 매칭의 근거(겹치는 기술·수행 이력)를 몇 초 안에 답하며, (c) 사람 검토자가 매긴 적합도와 얼마나 일치하는지로 신뢰도를 확인합니다.
과제 공고를 넣으면 키워드 검색으로 후보 연구실을 좁히고, LLM 이 Top5 와 매칭 근거를 근거 키워드까지 붙여 반환하는 동작하는 콘솔입니다. 검색은 우선 PostgreSQL 전문 검색·키워드 겹침으로 시작하고 임베딩 재순위는 2주차로 둡니다.
가상 심사자 2명이 매칭 후보의 적합/부적합을 라벨링해, 매칭 근거가 타당한지 일치도를 보여주는 검증 대시보드입니다. 임베딩 재순위를 붙여 키워드만으로 놓친 후보를 잡습니다.
분야코드 표기 흔들림·미등록 신규 연구실을 정규화·격리하고, 검색 임계값을 조정해 정밀도와 재현율의 균형점을 찾는 단계입니다.
과제 공고 20종을 넣으면 근거 붙은 연구실 Top5 가 몇 초 안에 나오는 걸 시연합니다
일부러 만든 악성·결측 입력 30종(빈 요구·미등록 분야코드·표기 흔들림)을 넣어도 출력 형식(스키마)이 한 번도 안 깨지고, 근거 없는 매칭은 '근거 부족'으로 걸러지는 걸 보여줍니다
내가 만든 정답 30건 중 Top5 안에 정답 연구실이 든 게 24건(80%)입니다. 단, 정답·데이터를 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 매칭 정확도는 디써클 실 연구실 DB 와 실 심사자가 있어야 측정 가능합니다. 이 콘솔은 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
이건 고객·실데이터 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 데이터 자가채점이라 '성능 증명'이 아닙니다. 면접에서 '데모 조건 동작 + 실검증 준비 상태'로 솔직히 설명합니다
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 미등록 분야코드·표기 흔들림·요구 결측 같은 경계 케이스를 더미에 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줍니다
'이 연구실이 이 과제에 적합하다'는 키워드 겹침일 뿐 실제 수행 역량과 다를 수 있습니다. 매칭은 근거(겹친 기술·이력)를 항상 함께 제시하고, 근거가 약하면 '근거 부족'으로 표시합니다
실제 도입 시 달라지는 것을 명시합니다. 실 연구실 프로필 분포는 더미와 다르므로 검색 임계값·분야코드 사전을 다시 맞춰야 하고, 심사자도 실제 R&D 전문가로 교체해야 합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
대학 연구실 프로필. 매칭이 가장 먼저 검색하는 테이블. 분야코드 표기 흔들림·미등록 신규 연구실·키워드 결측을 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
| lab_id | name | institution | field_code_raw | field_code | tech_keywords | past_grants |
|---|---|---|---|---|---|---|
| lab_001 | 고체전지연구실 | 서울대 | EE-이차전지 | EE0203 | ["전고체전지","리튬이온","전해질"] | 12 |
| lab_002 | 지능형로봇연구실 | KAIST | 로봇/자동화 | ME0401 | ["매니퓰레이터","강화학습","SLAM"] | 8 |
| lab_003 | 바이오센서랩 | 연세대 | BT-진단 | BT0107 | ["광학센서","바이오마커","진단칩"] | 5 |
| lab_004 | 자연어처리연구실 | 고려대 | AI/NLP | IT0502 | ["대규모언어모델","정보검색","요약"] | 15 |
| lab_005 | 탄소포집연구단 | POSTECH | 탄소중립 | — | ["CO2 포집","촉매","흡착"] | 3 |
아래 JSON Schema 에 맞는 대학 연구실 프로필 40행 JSON 배열로 생성.
{"type":"object","properties":{"lab_id":{"type":"string"},"name":{"type":"string"},"institution":{"type":"string"},"field_code_raw":{"type":"string"},"field_code":{"type":["string","null"]},"tech_keywords":{"type":"array","items":{"type":"string"}},"past_grants":{"type":["integer","null"]}},"required":["lab_id","name","field_code_raw","tech_keywords"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 분야의 표기 흔들림(field_code_raw 'EE-이차전지'/'이차전지' → 같은 field_code EE0203 으로 정규화돼야 함), (2) 미등록 분야(field_code=null) 2~3건(신규 융합 분야), (3) 결측(past_grants=null) 1~2건, (4) 신규 연구실(past_grants=0), (5) tech_keywords 가 1개뿐인 얕은 프로필 1건. JSON 배열만.{"type":"object","properties":{"lab_id":{"type":"string"},"name":{"type":"string"},"institution":{"type":"string"},"field_code_raw":{"type":"string"},"field_code":{"type":["string","null"]},"tech_keywords":{"type":"array","items":{"type":"string"}},"past_grants":{"type":["integer","null"]}},"required":["lab_id","name","field_code_raw","tech_keywords"]}정부 R&D 과제 공고. 매칭의 입력 쿼리. 요구 기술 결측·모호한 분야 표기를 섞어, 입력이 불완전해도 매칭이 안 깨지는지 보여줍니다.
| call_id | title | agency | required_field_raw | required_keywords | budget_krw |
|---|---|---|---|---|---|
| g_2026_01 | 전고체전지 상용화 핵심소재 개발 | 산업부 | 이차전지 | ["전고체전지","전해질","양극재"] | 3,000,000,000 |
| g_2026_02 | 자율주행 센서퓨전 인지 고도화 | 과기정통부 | 자율주행 | ["라이다","센서퓨전","객체인식"] | 1,500,000,000 |
| g_2026_03 | 의료영상 판독 보조 AI 실증 | 복지부 | AI-의료영상 | ["영상분할","딥러닝"] | 800,000,000 |
| g_2026_04 | 탄소포집 촉매 효율 개선 | 환경부 | 탄소중립 | ["CO2 포집","촉매"] | — |
| g_2026_05 | 대규모 언어모델 기반 정보검색 실증 | 과기정통부 | AI/NLP | ["대규모언어모델","정보검색"] | 1,200,000,000 |
아래 JSON Schema 에 맞는 정부 R&D 과제 공고 30행 JSON 배열로 생성.
{"type":"object","properties":{"call_id":{"type":"string"},"title":{"type":"string"},"agency":{"type":"string"},"required_field_raw":{"type":"string"},"required_keywords":{"type":"array","items":{"type":"string"}},"budget_krw":{"type":["integer","null"]}},"required":["call_id","title","required_field_raw","required_keywords"]}
쉬운 데이터만 만들지 말 것. 하드 케이스 혼입: (1) budget_krw=null 예산 미공개 1~2건, (2) required_field_raw 가 '융합'처럼 모호해 특정 field_code 로 안 떨어지는 과제 1~2건, (3) required_keywords 가 1개뿐인 광범위 공고 1건. JSON 배열만.{"type":"object","properties":{"call_id":{"type":"string"},"title":{"type":"string"},"agency":{"type":"string"},"required_field_raw":{"type":"string"},"required_keywords":{"type":"array","items":{"type":"string"}},"budget_krw":{"type":["integer","null"]}},"required":["call_id","title","required_field_raw","required_keywords"]}| TypeScript | Nest.js 매칭 API 서버(`POST /match`. 과제 입력 → output_schema 반환) + 프론트 매칭 결과 카드 |
| Node.js | Nest.js 기반 매칭·검색 오케스트레이션(검색 → LLM 근거 생성 파이프라인) |
| Python | ingest 파이프라인(과제 공고·연구실 프로필 → PostgreSQL upsert), 매칭 평가 스크립트(정밀도·재현율·Cohen's κ 계산) |
| Kotlin | Spring Boot 배치 워커(연구실 프로필 정규화·색인 갱신 스케줄러) |
| PostgreSQL | grant_calls / lab_profiles / match_labels 단일 진실원 + 전문 검색 인덱스(1주차 후보 검색) |
| ElasticSearch | 연구실 프로필 키워드·분야코드 색인(2주차 임베딩 재순위 결합 검색) |
| Redis | 매칭 결과 캐시(같은 과제 재조회 시 검색·LLM 재호출 회피) |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우고 싶으면 2주차(매칭이 사람 판단과 맞는지 확인)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(검색 정확도 튜닝·미매핑 처리)로 진행합니다.
과제 공고 1건에 대한 연구실 매칭 Top5 + 각 매칭의 근거(겹치는 기술·분야코드 일치·수행 이력) + 근거 부족 플래그. 매칭 한 건이 왜 뽑혔는지 추적 가능하게 담습니다.
{"type":"object","properties":{"call_id":{"type":"string"},"matches":{"type":"array","minItems":1,"maxItems":5,"items":{"type":"object","properties":{"lab_id":{"type":"string"},"score":{"type":"number"},"matched_keywords":{"type":"array","items":{"type":"string"}},"field_code_match":{"type":"boolean"},"reason":{"type":"string","minLength":20},"evidence_weak":{"type":"boolean"}},"required":["lab_id","score","matched_keywords","reason"]}}},"required":["call_id","matches"]}[
{
"call_id": "g_2026_01",
"matches": [
{
"lab_id": "lab_001",
"score": 0.92,
"matched_keywords": [
"전고체전지",
"전해질"
],
"field_code_match": true,
"reason": "요구 기술 전고체전지·전해질이 연구실 키워드와 직접 겹치고 분야코드 EE0203 이 일치합니다. 과거 과제 12건으로 수행 이력도 충분합니다.",
"evidence_weak": false
},
{
"lab_id": "lab_010",
"score": 0.74,
"matched_keywords": [
"양극재",
"리튬이온"
],
"field_code_match": true,
"reason": "양극재·리튬이온이 요구 기술과 겹치나 전고체 전해질 키워드는 없어 부분 매칭입니다.",
"evidence_weak": false
}
]
},
{
"call_id": "g_2026_08",
"matches": [
{
"lab_id": "lab_008",
"score": 0.31,
"matched_keywords": [
"개방형"
],
"field_code_match": false,
"reason": "요구 분야가 '융합'으로 모호해 키워드 겹침이 약합니다. 확정 매칭이 아니라 후보로만 제시합니다.",
"evidence_weak": true
}
]
},
{
"call_id": "g_2026_05",
"matches": [
{
"lab_id": "lab_004",
"score": 0.89,
"matched_keywords": [
"대규모언어모델",
"정보검색"
],
"field_code_match": true,
"reason": "대규모언어모델·정보검색이 요구 기술과 정확히 겹치고 분야코드 IT0502 일치, 과제 15건으로 이력이 가장 두텁습니다.",
"evidence_weak": false
}
]
}
][자동 검증] 1. 출력이 스키마를 통과하는가(필수 필드·타입). 2. matched_keywords 가 실제로 과제 required_keywords 와 연구실 tech_keywords 양쪽에 존재하는가(근거 조작 차단). 3. field_code_match 가 실제 두 분야코드 일치 여부와 맞는가. 4. score 하위·근거 1개 이하이면 evidence_weak=true 강제. [수동 검증] 1. 심사자 2명이 Top5 적합/부적합 라벨 → Cohen's κ(두 사람 판단이 우연 이상 일치하는 정도) 하한 확인. 2. reason 문장이 matched_keywords 를 넘어 과장하지 않는지 spot check 5%.
포트폴리오가 “무엇을 만들지”라면, 시나리오 테스트는 “현장에서 어떻게 판단·소통할지” 입니다. 실제 이 채용공고 맥락의 대본을 읽고 무엇을 물어야 할지 직접 써봅니다.