//twoway/stt-dictionary/twoway/sound-lab/admin/kerendia/dashboard/twoway/kerendia/twoway/kerendia/evaluation-history/knowledge/kerendia/twoway/faq/kerendia/kerendia-brochure.html/twoway/kerendia/evaluation-logic/biz-evaluation/cardinova/biz-evaluation/evaluation-history/biz-evaluation/faq/cardinova기존의 MR 교육은 정해진 스크립트를 읽고 녹음하는 '일방향(One-Way)' 방식에 머물렀습니다. 하지만 실제 영업 현장은 예측 불가능한 대화의 연속입니다. 본 프로젝트는 이 한계를 극복하기 위해 시작되었습니다.
본 시스템의 가장 핵심적인 차별점은 "100% 출처 기반 응답 (Grounded Response)"입니다. AI가 생성하는 모든 답변, FAQ, 힌트는 반드시 사용자가 업로드한 원본 문서에서 추출된 내용이어야 합니다. 원문에 없는 내용은 어떠한 경우에도 생성되지 않도록 3-Layer 검증 시스템이 작동합니다. 이는 제약 산업의 엄격한 규정 준수(Compliance)와 의학적 정확성 보장을 위해 필수적입니다.
본 시스템은 Event-Driven Architecture를 기반으로 설계되었습니다. 클라이언트와 서버는 WebSocket으로 지속적인 연결을 유지하며, 음성 데이터와 텍스트 메시지를 실시간으로 교환합니다.
[그림 1] Markit Two-Way 시스템 아키텍처 다이어그램 (v4.2)
사용자가 발화하는 순간부터 AI의 음성이 스피커로 나오기까지의 데이터 흐름은 다음과 같습니다.
| 단계 | 주요 프로세스 | 핵심 모듈 | 상세 기술 설명 |
|---|---|---|---|
| 1. Input | Audio Capture & Streaming | twoway-evaluation.ejs |
브라우저의 MediaRecorder API가 마이크 입력을 캡처하고, 청크(Chunk) 단위로 Socket.io를 통해 서버로 실시간 전송합니다.* 제품 선택(Cardinova/Kerendia)에 따라 productId 메타데이터가 함께 전송됩니다.
|
| 2. Perception | STT & Correction | sttCorrector.js |
서버는 수신된 오디오 버퍼를 결합하여 OpenAI Whisper API로 전송합니다. 3단계 보정 프로세스 (v4.3 Upgrade):
|
| 3. Retrieval | Hybrid RAG & Token Injection | vectorReferenceAnalyzer.js |
Hybrid Search: Vector Search(유사도)와 FAQ Keyword Search(불용어 처리)를 결합하여 최적의 지식을 추출합니다. Citation Token System (v4.5): 검색된 모든 지식의 파일명은 ⟪filename⟫ 형태의 특수 토큰으로 감싸져 프롬프트에 주입됩니다. 이는 AI가 출처를 명확히 인용하도록 강제하고 후처리를 용이하게 합니다.* 유사도 0.25 미만 결과는 무시되어 노이즈를 제거합니다. |
| 4. Reasoning | LLM Processing | twoway-evaluation.js |
Google Gemini 2.0 Flash Exp 모델이 [시스템 페르소나] + [토큰화된 참고 지식] + [대화 이력]을 종합하여 답변을 생성합니다. Strict Prompting: AI는 반드시 [출처: ⟪파일명⟫] 형식을 준수하도록 지시받습니다.* Temperature 0.0(Mentor) / 0.4(Doctor) 동적 설정 |
| 5. Output | Filter & Smart UI | twoway-evaluation.ejs |
TTS Filtering: 오디오 생성 전, ⟪...⟫ 토큰과 메타데이터는 완벽하게 제거되어 자연스러운 음성을 보장합니다.Smart Link UI: 프론트엔드는 ⟪filename⟫ 토큰을 감지하여 즉시 클릭 가능한 파일 아이콘 링크로 변환합니다.
|
| 6. Hint | 사전승인 FAQ 조회 | socket.on('suggest-answer') |
MR이 "정답 힌트"를 요청하면, 사전 승인된 FAQ JSON 데이터에서 키워드 매칭으로 가장 관련성 높은 답변을 반환합니다. v4.0 변경 LLM 생성 없이 사전 검증된 FAQ에서 직접 제공하여 Hallucination 0% 보장. |
utils/groundedVerifier.js)모든 AI 생성 콘텐츠(FAQ 답변, 정답 힌트 등)가 저장되기 전에 이 검증기를 통과해야 합니다.
[그림 2] 3-Layer Grounded Verification 파이프라인
AI 답변에서 모든 숫자(예: 90%, 4.5mg, 38%)를 정규식으로 추출합니다.
추출된 숫자가 원문 문서 전체에 단 한 번이라도 존재하지 않으면 즉시 REJECTED됩니다.
이유: AI가 숫자를 "지어내는" 것이 가장 위험한 Hallucination이기 때문입니다.
const numbers = answer.match(/\d+(\.\d+)?%?/g) || [];
for (const num of numbers) {
if (!fullContent.includes(num)) {
return { verified: false, reason: `수치(${num})가 원문에 없음` };
}
}
Gemini 2.0 Flash에게 다음을 요청합니다:
검증 통과 시 [[Exact Evidence Text]] 형태로 근거 문구를 반환합니다.
Layer 2에서 반환된 Evidence 문구에 대해:
모든 Layer 통과 시: { verified: true, evidence: "근거 문구" } 반환
| 기능 | 적용 위치 | 검증 실패 시 동작 |
|---|---|---|
| 정답 힌트 (Suggest Answer) | socket.on('suggest-answer') |
안전한 폴백 메시지 반환: "죄송합니다. 100% 신뢰할 수 있는 근거를 찾지 못했습니다." |
| FAQ 자동 생성 | faqUpdater.analyzeAndGenerateQA() |
FAQ 항목 생성 자체가 취소됨 (null 반환) |
| FAQ Context 조회 | /api/faq/context |
Literal Match → Suffix-Agnostic Match → Semantic Search 순으로 Fallback |
/api/faq/context)FAQ 항목 클릭 시 원문 출처를 찾는 3단계 Fallback 로직:
Evidence 문자열의 공백을 정규화한 후, Vector DB의 모든 Chunk와 비교합니다.
한국어 특성상 어미가 변할 수 있으므로, 마지막 10자를 제거하고 핵심 내용만 비교합니다.
removeSuffix(text, 10): "~했습니다" vs "~합니다" 차이 허용
위 두 가지 방법으로 찾지 못하면, Vector 유사도 검색으로 가장 유사한 Chunk를 반환합니다.
models/vectorReferenceAnalyzer.js)시스템의 "뇌"에 해당하는 핵심 모듈입니다. 모든 지식 데이터는 이 클래스를 통해 관리됩니다.
| 메서드 | 기능 | 호출 위치 |
|---|---|---|
addDocument(fileId, filename, text, metadata) |
문서 추가: 텍스트 청킹 → 임베딩 생성 → JSON 저장 | /knowledge/upload |
search(query, topK) |
전역 벡터 검색: 모든 문서에서 유사 청크 검색 | RAG 컨텍스트 주입, FAQ 출처 역추적 |
searchInDocument(fileId, query, topK) |
문서 내 검색: 특정 문서의 청크만 검색 | STT Training Alignment, FAQ Context 조회 |
updateDocumentVocabulary(fileId, words) |
문서별 단어장 업데이트 | STT 훈련 결과 저장 |
getAllVocabulary() |
전체 단어장 조회 (모든 문서의 합집합) | Whisper prompt 파라미터 생성 |
getDocumentText(fileId) |
문서 전체 텍스트 반환 (청크 결합) | STT 참조 텍스트 로드 |
utils/documentParser.js)PDF/DOCX 파일을 텍스트로 변환하며, 멀티모달 분석 기능을 포함합니다.
pdf-parse (PDF), mammoth (DOCX)pdftoppm으로 PDF를 PNG로 변환 후 Gemini Vision API로 차트/표 분석AI 멘토 모드는 단순히 답변만 하는 것이 아니라, **FAQ 데이터를 스스로 확장하는 자가 학습(Auto-Learning) 메커니즘**을 가집니다.
[그림 5] AI 멘토 하이브리드 검색 및 FAQ 자동 생성 파이프라인
시스템은 사용자의 질문에 대해 두 가지 지식 원천을 동시에 참조합니다.
지식 데이터(2순위)를 사용하여 답변한 경우, 해당 질의응답 쌍은 "잠재적 가치가 있는 새로운 지식"으로 간주됩니다.
Pending FAQ(승인 대기) 목록에 자동 저장합니다.faq.json)에 반영됩니다.이 과정을 통해 시스템은 사용하면 할수록 점점 더 똑똑해지는(Evolving) 지식 베이스를 구축하게 됩니다.
Whisper의 의학 용어 인식률을 극대화하기 위한 지능형 학습 시스템입니다.
[그림 3] STT 고도화 훈련 시퀀스
utils/sttCorrector.js) v4.1 UPDATE[그림 4] STT 3단계 교정 파이프라인 (v4.1)
| 단계 | 메서드 | 역할 및 작동 방식 |
|---|---|---|
| 1단계 | applyManualFixes(text) |
빠른 규칙 기반 치환 (즉시 실행) - "킬러피아" → "케렌디아" - "자 세훈선생님" → "안녕하세요 선생님" - "바투리움" → "나트륨" 20+ 개의 사전 정의된 치환 규칙 |
| 2단계 NEW |
correctTextWithReference(text, referenceText, productId) |
제품별 FAQ 기반 Gemini 문맥 교정 - 제품별 FAQ 데이터(최대 30개)를 참조 텍스트로 활용 - Gemini 2.5 Flash가 제품명, 의학 용어를 문맥에 맞게 교정 - 제품 정보: "케렌디아, Kerendia, 피네레논, Finerenone" 등 제공 FAQ에 없는 용어도 문맥 추론으로 교정 가능 |
| 3단계 | processReturningWords(sttResult, referenceText) |
자가 학습 (비동기) - Gemini가 오인식 패턴 분석 후 키워드 추출 - 추출된 단어는 Vector DB 단어장에 저장 - 다음 STT 호출 시 Whisper prompt에 자동 주입 |
v4.3에서는 Whisper 인식률 향상을 위해 3가지 소스를 결합하여 프롬프트를 구성합니다.
/twoway/stt-dictionary) v4.3 NEW관리자가 웹 UI에서 직접 오인식 패턴을 등록하고 관리할 수 있습니다. (stt_corrections.json)
full_vector_data.txt를 다운로드하여 학습 데이터의 무결성을 직접 검증 가능AI 의사 모드는 100% FAQ 데이터 기반으로 작동하며, 지식 데이터(PDF)를 참조하지 않습니다.
| AI 멘토 (지식백과) | AI 의사 (롤플레잉) |
|---|---|
| ✅ Hybrid Search (FAQ + PDF) | 🚫 FAQ Only + No Text Input |
| 사용자의 질문에 답변하는 역할 | FAQ 목록에서 질문하여 MR을 평가 (키보드 입력 불가) |
| 새로운 답변 생성 가능 (Auto-Add) | 정해진 질문 세트 외 생성 금지 (Strict Constraint) |
MR들이 출퇴근 시 라디오처럼 모든 질문과 답변을 연속으로 청취하며 학습할 수 있는 기능입니다.
OpenAI TTS 'Alloy' (중립적이고 명확한 톤)OpenAI TTS 'Onyx' (신뢰감 있는 남성 톤, 1.2x 배속)Pending FAQ로 저장됩니다.data/[product]/faq.json)detectProduct)AI 질문과 MR 답변에서 키워드를 분석하여 Kerendia/Cardinova 자동 분류
키워드 예: "피네레논", "미네랄로코르티코이드" → Kerendia
getExistingQuestions)Cheerio로 HTML 파싱하여 기존 질문 목록 추출, Gemini에게 유사 의도 질문 존재 여부 판단 위임
analyzeAndGenerateQA)Gemini가 원문 기반 모범 답안 생성 → GroundedVerifier로 검증 → 검증 실패 시 null 반환
updateHtml)검증 통과된 Q&A만 Cheerio로 FAQ_케렌디아.html 또는 FAQ_카르디노바.html에 삽입
Evidence 속성이 함께 저장되어 나중에 출처 조회 가능
<div class="qa-box new-entry">
<div class="question">케렌디아의 심혈관 보호 효과는?</div>
<div class="answer">
<div class="answer-content" data-evidence="FIDELIO-DKD 연구에서...">
케렌디아는 FIDELIO-DKD 연구에서 심혈관 복합 결과를 14% 감소시켰습니다.
<div class="source-citation">📚 Source: Kerendia_PI.pdf (AI Reference)</div>
</div>
</div>
</div>
| 평가 단계 | 배점 | 평가 내용 |
|---|---|---|
| 1. Opening (도입부) | 150점 | 인사/자기소개, 방문 목적 명확화, 시간 확보 및 주의집중 |
| 2. FAQ (핵심 디테일링) | 1~10점/문항 | 제품 지식의 정확성, 문맥 일치도, 논리적 설명력 (정성 평가) |
| 3. Call-to-Action (마무리) | 150점 | 구체적 행동 요청, 다음 단계 제시, 약속/일정 조율 |
의사와의 첫 대면 시 신뢰를 형성하고 대화의 목적을 명확히 하는 단계입니다.
| 카테고리 | 평가 기준 및 모범 답안 예시 | 배점 |
|---|---|---|
| 인사 및 자기소개 | 정중한 인사와 함께 소속, 본인의 이름을 명확히 밝힙니다. "안녕하십니까 원장님, 저는 마크잇제약의 김백점 부장입니다..." |
50점 |
| 방문 목적 명확화 | 오늘 방문하여 전달하고자 하는 제품(케렌디아)과 주제를 간결하게 제시합니다. | 50점 |
| 시간 확보 및 주의집중 | 디테일링 소요 시간을 미리 알리고, 원장님의 관심사를 언급하며 주의를 환기합니다. | 50점 |
AI 의사(멘토)와의 질의응답을 통해 제품 지식의 정확성과 전달력을 평가합니다.
케렌디아 제품의 경우, 총 76개 FAQ 문항이 등록되어 있습니다. (Opening K-000, CTA K-CTA 제외)
* 실제 대화의 흐름에 따라 AI가 무작위 또는 문맥에 맞춰 질문하며, 모든 문항을 다루지 않을 수 있습니다.
디테일링을 성공적으로 마무리하고 실질적인 처방 유도 및 다음 약속을 잡는 단계입니다.
| 카테고리 | 평가 기준 및 모범 답안 예시 | 배점 |
|---|---|---|
| 구체적 행동 요청 | 대상 환자군(2형 당뇨 동반 CKD 등)을 특정하여 명확하게 처방을 권유합니다. | 50점 |
| 다음 단계 제시 | 처방 가이드 제공, 환자 모니터링 협조 등 구체적인 후속 지원을 제안합니다. | 50점 |
| 약속/일정 조율 | 다음 방문 일정을 구체적으로 제안하고 확정합니다. "다음 주 수요일 오전 10시에 다시 찾아뵈어도 될까요?" |
50점 |
본 시스템은 단순한 키워드 매칭을 넘어, 논리적 완성도와 디테일링 스킬을 종합적으로 평가합니다.
prompt 파라미터로 의학 용어 인식률 극대화.
| URL 경로 | 페이지명 | 기능 및 의의 | |
|---|---|---|---|
/ |
메인 대시보드 | 시스템 진입점. 모든 기능 페이지 탐색 및 기술 개요 제공. | |
/admin/dashboard |
관리자 대시보드 | v4.6 NEW 모든 Two-Way 대화 로그 검색, 필터링, 엑셀 다운로드 및 개별 세션 상세 조회. | |
/twoway |
제품 선택 랜딩 | Entry '카르디노바'와 '케렌디아' 중 평가받을 제품을 선택하는 진입점. | |
/twoway/cardinova |
카르디노바 평가 | 고혈압 치료제 전문 AI 의사와 1:1 롤플레이. 제품 특화 페르소나 적용. | |
/twoway/kerendia |
케렌디아 평가 | 당뇨병성 CKD 치료제 전문 AI 의사와 1:1 롤플레이. | |
/twoway/faq |
FAQ 관리 (내부용) | 모든 제품의 FAQ를 탭으로 전환하며 관리. 문항 추가/삭제/Excel 다운로드 가능. | |
/twoway/faq/kerendia |
케렌디아 FAQ | v4.0 NEW 고객사 전달용 케렌디아 전용 FAQ 페이지. 탭 없이 깔끔한 URL. | |
/twoway/faq/cardinova |
카르디노바 FAQ | v4.0 NEW 고객사 전달용 카르디노바 전용 FAQ 페이지. | |
/twoway/stt-training |
STT 발음 훈련 | 시스템 공통 스크립트 읽기 → 오인식 단어 추출 → 통합 발음사전 업데이트. | |
/twoway/stt-dictionary |
STT 단어장 관리 | 시스템 공통 v4.3 Update 교정 테이블(Hard Rules) 편집 및 원문 다운로드. | |
/twoway/evaluation-logic |
평가 로직 시뮬레이션 | v4.3 NEW 정성적 평가 기준(S-A-B-C-D) 및 시뮬레이션 도구 제공. | |
/twoway/sound-lab |
Sound Lab | Sound Lab | v4.2 UPDATE Web Audio API 기반 30종 생성형 환경음(비, 불, 우주 등) 및 TTS 품질 테스트. |
/knowledge |
Knowledge Base 관리 | PDF/DOCX 업로드 → Vector DB 구축. AI의 "뇌"에 지식 주입. | PDF/DOCX 업로드 → Vector DB 구축. AI의 "뇌"에 지식 주입. |
| 경로 | 설명 |
|---|---|
server.js |
Entry Point. Express 앱 초기화, Vector DB 로드, 미들웨어 설정, Socket.io 연결. |
routes/admin.js |
Admin API. v4.6 대화 로그 조회/검색/삭제 및 엑셀 다운로드 API. |
routes/faq-admin.js |
FAQ Approval. v4.6 승인 대기 중인 FAQ 목록 조회 및 승인/거부 처리. |
routes/twoway-evaluation.js |
Main Controller. 모든 Two-Way 라우팅, 소켓 이벤트 핸들링, LLM/STT/TTS 호출 로직 집약. |
routes/knowledge.js |
Knowledge API. 파일 업로드/삭제/목록 조회, Vector DB 연동. |
models/vectorReferenceAnalyzer.js |
Vector DB. 임베딩 생성, 검색, 문서/단어장 CRUD. |
utils/groundedVerifier.js |
Grounding. 3-Layer 출처 검증 로직. |
utils/faqUpdater.js |
Auto-FAQ. Q&A 생성 및 HTML 업데이트. |
utils/sttCorrector.js |
STT Enhancement. 오타 교정 및 오인식 단어 추출. |
utils/documentParser.js |
Document Processing. PDF/DOCX 파싱 + 멀티모달 분석. |
vector_reference_data.json |
Data Store. 모든 문서, 청크, 임베딩, 단어장이 저장되는 JSON 파일. |
# API Keys (Required)
OPENAI_API_KEY=sk-xxxxx
GEMINI_API_KEY=AIzaxxxxx
# Server Config
PORT=3003
# 개발 모드 (nodemon)
npm run dev
# 프로덕션 모드
pm2 start ecosystem.config.js
📅 Last Updated: 2026.01.09
📝 Document Version: 4.6
✍️ Maintained By: Markit S-Labs Development Team
© 2026 Markit S-Labs. All rights reserved.