AI RAG 자료
Mind-Log v5.0 | 최종 업데이트: 2026-04-17 11:00
1. LMS RAG 시스템 개요
프로젝트: LMS (Leader's Mind Security) - 리더십 멘탈 웰니스 SaaS
LMS의 RAG 시스템은 그린룸(greenroom) 사용자의 경험을 최대한 맞춤형 팟캐스트 콘텐츠로 변환합니다. 두 가지 독립 에이전트가 각각 다른 데이터 소스를 검색하며, Reasoning Agent가 필요에 따라 이들을 조건부로 호출합니다.
본 문서의 RAG 구조는 LMS v5.0 아키텍처의 Knowledge Layer에 해당하며, Memory Agent(개인 기억)와 Knowledge Agent(전문 지식)가 담당합니다. Reasoning Agent 및 Podcast Reasoning이 조건부로 두 에이전트를 호출합니다.
핵심 특징
- 그린룸 맞춤형 콘텐츠: 사용자의 그린룸 입력 내용 + 과거 이용 데이터 + 공유 허락한 그린룸 이야기
- 마인드 온톨로지 연동: 리더십 도메인 전문 지식과 사용자 개인 기억의 융합
- 듀얼 RAG 아키텍처: Personal RAG (개인 기억) + Expert RAG (전문 지식)
2. 듀얼 RAG 파이프라인
A. Personal RAG (Memory Agent 담당)
목적: 사용자의 개인 그린룸 데이터와 과거 상담 기록 검색
데이터 소스:
- 개인 그린룸 이용 데이터 (그린룸 방문 시 입력한 개인 이야기)
- 과거 상담 기록 및 조회 이력
- 사용자 프로필, 주요 인물 관계도, 가치관
구현:
- Vector DB(Pinecone)의 단일 통합 인덱스
rag-suite-knowledge에 개인 기억을 임베딩 (PR #153) - 사용자 입력과 유사한 과거 경험을 벡터 유사도로 검색 (dense-only)
- 메타데이터 필터링으로
user_id+ namespace 기반 데이터 격리
활용 예시:
"리더로서의 성장을 고민해요" → 과거 그린룸 입력 기록에서 "팀 내 의사소통 관련 고민"을 발견하고 그 맥락을 활용해 맞춤형 이야기 제공
B. Expert RAG (Knowledge Agent 담당)
목적: 리더십 도메인 전문 지식과 공유 허락한 그린룸 이야기 검색
데이터 소스:
- 리더십/심리학 전문 논문 및 가이드
- 검증된 코칭 이론 및 모범 사례
- 공유 허락한 다른 사용자의 그린룸 이야기 (익명 처리)
- 도메인 전문가 인사이트
구현:
- Vector DB(Pinecone)의 단일 통합 인덱스
rag-suite-knowledge에 전문 지식 임베딩 (PR #153) - 현재 구현: Pinecone dense-only 검색 — KT Cloud Embedding passage로 인덱싱 후 Embedding query로 검색
- BM25 리랭킹은 향후 미구현 (6장 참조)
- Neo4j Graph DB로 리더십 개념 간의 관계 모델링
활용 예시:
"변화의 시대에 팀을 이끌어야 해요" → 변화관리 이론, 리더십 스타일, 관련된 다른 사용자들의 경험담을 종합
3. 그린룸 RAG 활용 흐름
INPUT 단계
사용자가 그린룸 입력
↓
[그린룸 입력 내용] + [이전 이용 데이터(조회)] + [공유 이야기(RAG 추출)]
↓
이 세 가지가 하나의 "컨텍스트 윈도우"로 통합
처리 단계
- Query Expansion (Reasoning Agent): 사용자의 그린룸 입력을 구체적인 검색 쿼리로 변환
- Dual Retrieval (병렬 처리):
- Personal RAG에서 사용자의 과거 관련 기록 검색
- Expert RAG에서 도메인 전문 지식 및 공유 이야기 검색
- Context Fusion (Synthesis Agent): 두 검색 결과를 통합
- Emotion-based Re-ranking: 사용자의 현재 감정 상태에 맞게 결과 재순위화
OUTPUT 단계
맞춤형 팟캐스트 스크립트의 이야기 소스
↓
Podcast Reasoning Agent가 스크립트 생성
↓
사용자의 개인 경험 + 전문 가이드 + 공유 이야기가 담긴 에피소드
데이터 흐름 다이어그램
| 단계 | 담당 에이전트 | 입력 | 출력 |
|---|---|---|---|
| 1. 쿼리 확장 | Reasoning Agent | 그린룸 입력 텍스트 | 구체화된 검색 쿼리 |
| 2. Personal 검색 | Memory Agent | 검색 쿼리 | 개인 기억 문서 (상위 K개) |
| 3. Expert 검색 | Knowledge Agent | 검색 쿼리 | 전문 지식 + 공유 이야기 (상위 K개) |
| 4. 컨텍스트 통합 | Synthesis Agent | 두 검색 결과 | 통합된 컨텍스트 윈도우 |
| 5. 감정 기반 리랭킹 | Emotion Agent | 통합 컨텍스트 + 감정 벡터 | 최종 검색 결과 (재순위화) |
| 6. 스크립트 생성 | Podcast Reasoning | 최종 검색 결과 | 팟캐스트 에피소드 스크립트 |
4. Vector DB 설계 (Pinecone)
Pinecone을 사용한 대규모 벡터 검색을 통해 개인 기억과 전문 지식을 효율적으로 관리합니다.
기존 설계의 3개 분리 인덱스(personal_memory / expert_knowledge / episode_archive)는 폐기되었으며, 현재는 단일 통합 인덱스 rag-suite-knowledge로 운영됩니다 (PR #153). 데이터 격리는 Pinecone namespace와 메타데이터 필터(user_id, doc_type 등) 로 수행합니다.
Index 구조 (현재 운영)
| Index 이름 | 용도 | namespace / 메타데이터 분리 | 청킹 전략 | 담당 에이전트 |
|---|---|---|---|---|
| rag-suite-knowledge (단일 통합) | 개인 기억 + 전문 지식 + 에피소드 아카이브를 namespace/메타데이터로 분리하여 통합 운영 | namespace: personal / expert / episode — 메타데이터: user_id, doc_type, timestamp, sentiment, topic_tag, source_type, domain, is_shared, anonymized_user_id, episode_id, themes | 에피소드 단위 (세션/주제/전체 에피소드) | Memory / Knowledge / Podcast Reasoning (공용) |
유사도 임계값 (PR #155)
- 현재 설정값:
0.25(기존 0.7에서 하향 조정) - 조정 근거: KT Cloud Query↔Passage 임베딩 실측 score 분포가 0.20~0.35 범위로 관측되어, 기존 0.7 임계값에서는 유효 결과가 거의 반환되지 않음.
- 관련 설정:
config/settings.yaml내 Pinecone 임계값 외부화 항목 (PR #146).
메타데이터 필터링 (단일 인덱스 기준)
Personal 검색 시 (namespace=personal):
- filter: {"user_id": "${user_id}"} (개인 데이터 격리)
Expert 검색 시 (namespace=expert):
- filter: {"is_shared": true} (공유 허락한 데이터만)
- filter: {"anonymized_user_id": null} (익명화된 이야기)
임베딩/생성 모델 (KT Cloud RAG Suite — PR #145, #148~#151, #158)
현재 임베딩·파서·생성은 KT Cloud RAG Suite를 사용합니다. OpenAI Text-embedding-3-large / KoSimCSE 등은 초기 설계안이었으며, 현재 운영 구성은 아래와 같습니다.
| 구성요소 | 엔드포인트 / 모델 | 용도 | 비고 |
|---|---|---|---|
| Parser | KT Cloud RAG Suite — Parser API | 문서 인제스트 단계에서 텍스트 추출·정제 | 인제스트 단계 전용. Knowledge Agent search()에서는 PR #158에서 제거 (텍스트 쿼리에는 불필요). |
| Embedding (passage) | KT Cloud RAG Suite — Embedding Passage 엔드포인트 | 문서/청크 인제스트 시 임베딩 생성 | scripts/ingest_knowledge.py에서 호출 |
| Embedding (query) | KT Cloud RAG Suite — Embedding Query 엔드포인트 | 검색 쿼리 임베딩 생성 | Knowledge Agent search() 경로에서 호출 (PR #148~#150에서 env 주입 복원) |
| TextGen | Qwen3-32B (KT Cloud RAG Suite TextGen) | RAG 결과 기반 답변 생성 | PR #145에서 도입 |
- 환경변수 네이밍:
PARSE_*,EMBEDDING_QUERY_*,EMBEDDING_PASSAGE_*,TEXTGEN_*(PR #148~#150에서 PARSER→PARSE 정렬, GitHub Secrets 정합) - 주입 경로: Reasoning Agent의 phase별(ToT/CoT) 컨텍스트 주입 + ScriptGenerator state 키 정합 (PR #151)
- 관측성: Pinecone 조회 로그/top_k 외부화 (PR #151)
- 재학습/적재: 신규 문서는
scripts/ingest_knowledge.py로 Parser → Passage Embedding → Pinecone 적재
Backend /api/internal/knowledge 엔드포인트 — 미구현 상태 (PR #156, #157)
AI 서버(Knowledge Agent)는 Backend와 분리된 전용 URL을 호출하도록 클라이언트 측 준비 완료 상태입니다.
BackendClient._knowledge_base_url도입 (PR #156)- 엔드포인트 경로 분리:
/api/internal/knowledge(PR #157)
Backend 서버 측 구현은 아직 완료되지 않음. 백엔드 팀에서 해당 엔드포인트를 구현하기 전까지는 실제 통신이 블록된 상태이며, 연동 테스트 가능 시점까지 대기.
5. GraphRAG (Neo4j) - 마인드 온톨로지 연동
Vector DB의 유사도 기반 검색을 보완하여, 리더십 개념 간의 인과관계를 파악합니다.
마인드 온톨로지 노드 및 관계
노드 타입:
- Leadership Concept (리더십 개념): "변화 관리", "팀 동기부여", "감정 지능" 등
- Psychological Pattern (심리 패턴): "회피형 대응", "공동 창조적 사고" 등
- User Story (사용자 이야기): 익명 처리된 그린룸 이야기
- Expert Resource (전문 자료): 논문, 가이드, 코칭 자료
관계 타입:
HAS_ROOT_CAUSE: 심리 패턴 → 근본 원인RELATED_TO_CONCEPT: 사용자 이야기 → 리더십 개념SIMILAR_TO_PATTERN: 심리 패턴 → 유사 패턴SUPPORTED_BY_RESEARCH: 리더십 개념 → 전문 자료
활용 예시
사용자 입력: "팀원들이 변화를 거부해요"
↓
Vector 검색: "변화 저항" 관련 과거 기록 찾기
↓
Graph 검색: "변화 저항" → [감정 지능 부족] → [공감 능력 강화]
↓
결과: 단순 기록이 아닌 "근본 원인 + 해결책" 연결
6. 검색 방식 (현재: dense-only)
현재 Knowledge Agent search()는 Pinecone dense-only 검색만 구현되어 있습니다. KT Cloud Embedding Query로 쿼리를 임베딩한 뒤 Pinecone 벡터 검색을 수행하며, BM25(키워드) 경로와 하이브리드 스코어링은 미구현 상태입니다.
Dense Retrieval (Semantic Search) — 현재 구현
장점:
- 표현이 다르지만 의미가 같은 내용 검색
- "마음이 답답해요" ≈ "숨이 턱 막혀요" 이해
- 감정 톤의 미묘한 차이 감지
적용:
Query: "변화가 무서워요"
↓
KT Cloud Embedding Query로 쿼리 임베딩
↓
Pinecone rag-suite-knowledge 인덱스 dense 검색 (임계값 0.25)
↓
"변화에 대한 불안", "예측 불가능한 상황 회피" 등 의미적 유사성 결과 반환
BM25 (Keyword-based Search) — 미구현
심리 상담 도메인의 특수성을 반영하여 키워드 기반 검색을 조합하는 방식입니다. 의약품 이름, 고유 명사(사람 이름, 회사명), 특정 치료 기법 이름(예: "인지행동치료", "수용전념치료") 검색에 유리합니다. 현재는 구현되어 있지 않으며, 향후 계획 섹션을 참조하십시오.
7. 감정 기반 리랭킹
검색된 여러 결과 중에서 사용자의 현재 감정 상태에 가장 적합한 정보를 상위에 배치합니다.
리랭킹 알고리즘
입력:
- 검색 결과: 상위 K개 문서 (벡터 유사도 기준)
- 현재 사용자 감정: Emotion Agent에서 추출한 감정 벡터
처리:
-
감정 매칭 점수 계산: 각 문서의 감정 톤과 사용자의 현재 감정 벡터 간 코사인 유사도
-
최신성 가중치: 최근 데이터에 더 높은 가중치
-
트라우마 필터: Safety Agent와 연동하여 사용자의 트라우마 트리거가 되는 콘텐츠 제거
-
최종 점수 재계산:
Final Score = (Vector Similarity × 0.4)
+ (Emotion Match × 0.3)
+ (Recency Weight × 0.2)
- (Trauma Risk × 0.1)
감정 기반 리랭킹 예시
| 상황 | 현재 감정 | 추천 우선순위 |
|---|---|---|
| "리더로서 자신감이 없어요" | 불안, 자책 | 1. 성공 경험담 (동기부여) 2. 자신감 강화 기법 3. 실패 극복 사례 |
| "팀원들과의 갈등으로 답답해요" | 답답함, 좌절감 | 1. 의사소통 개선 기법 2. 감정 조절 방법 3. 갈등 해결 사례 |
| "변화가 두려워요" | 두려움, 저항감 | 1. 변화 관리 점진적 접근 2. 심리적 안정감 제공 3. 변화 수용 사례 |
구현
def rerank_by_emotion(documents, emotion_vector, user_state):
"""
감정 기반 문서 재순위화
"""
reranked = []
for doc in documents:
# 1. 기존 벡터 유사도
vector_score = doc['similarity_score']
# 2. 감정 매칭 점수
emotion_score = cosine_similarity(doc['emotion_vector'], emotion_vector)
# 3. 최신성 가중치
recency_weight = calculate_recency(doc['timestamp'])
# 4. 트라우마 필터
trauma_risk = safety_agent.check_trauma_trigger(doc, user_id)
# 5. 최종 점수
final_score = (vector_score * 0.4 +
emotion_score * 0.3 +
recency_weight * 0.2 -
trauma_risk * 0.1)
reranked.append((doc, final_score))
return sorted(reranked, key=lambda x: x[1], reverse=True)
8. 프라이버시 정책
LMS의 RAG 시스템은 사용자 데이터 보호와 개인정보 관리를 최우선으로 합니다.
핵심 원칙
-
데이터 격리 (Isolation)
- 모든 Vector DB 쿼리에는
user_id메타데이터 필터 필수 - 개인 그린룸 데이터는 절대로 다른 사용자에게 노출 불가
- 타 사용자의 데이터가 RAG 검색 결과에 섞이면 안됨
- 모든 Vector DB 쿼리에는
-
공유 데이터 익명화 (Anonymization)
- 공유를 허락한 그린룸 이야기도 반드시 익명 처리
- 사용자 이름, 회사명, 연락처 등 개인 식별 정보 제거
- 이야기의 본질적 인사이트만 보존
-
명시적 동의 (Explicit Consent)
그린룸 입력 시점에서:
□ "이 내용을 다른 사용자와의 맞춤형 팟캐스트 생성에 활용할 수 있습니다"
□ "이 내용을 AI 학습 데이터로 사용할 수 있습니다"
→ 사용자의 명시적 선택만 반영 -
잊혀질 권리 구현 (Right to Be Forgotten)
- 사용자가 "이 이야기 삭제" 요청 시:
- Vector DB의 해당 임베딩 즉시 삭제
- Neo4j Graph DB의 관련 노드 익명화 또는 삭제
- 백업에서도 주기적으로 제거
- MCP 도구:
delete_user_memory,anonymize_story
- 사용자가 "이 이야기 삭제" 요청 시:
-
데이터 보관 기한
- 개인 그린룸 데이터: 사용자가 삭제 요청할 때까지 보관
- 공유 데이터: 사용자의 동의가 있는 기간만 보관
- 자동 삭제: 1년 이상 미사용 데이터는 사용자 통보 후 삭제 가능
-
접근 제어 (Access Control)
- 관리자도 개별 사용자의 개인 그린룸 데이터 직접 접근 불가
- 데이터 품질 개선을 위한 모니터링은 익명화된 데이터로만 진행
- 법적 요청 시에만 법정 절차를 거쳐 접근
-
감시 및 감사 로그
- RAG 검색 시마다 접근 로그 기록
- 누가, 언제, 어떤 데이터에 접근했는지 추적 가능
- 의도하지 않은 접근 시 알림 시스템
프라이버시 체크리스트
| 항목 | 체크 내용 | 담당 에이전트 |
|---|---|---|
| 개인 데이터 격리 | Vector DB 쿼리 시 user_id 필터 적용되었는가? | Memory Agent |
| 공유 데이터 익명화 | 사용자가 공유에 동의했고, 식별 정보가 제거되었는가? | Knowledge Agent |
| 명시적 동의 | RAG 활용에 대한 사용자 동의 존재하는가? | Safety Agent |
| 삭제 요청 처리 | 삭제 요청 시 모든 DB에서 제거되었는가? | Memory Agent |
| 접근 로그 | 모든 RAG 접근 이력이 기록되었는가? | Monitoring System |
구현 예시
def retrieve_with_privacy_check(state: AgentState):
"""
프라이버시를 고려한 안전한 검색
"""
user_id = state['user_id']
# 1. 명시적 동의 확인
if not has_rag_consent(user_id):
return {"error": "RAG 활용 동의 필요"}
# 2. 개인 데이터만 검색 (user_id 필터 필수)
personal_docs = pinecone_client.search(
index="rag-suite-knowledge",
namespace="personal",
query=state['input'],
filter={"user_id": user_id}, # 격리
k=3
)
# 3. 공유 데이터는 익명화 확인
shared_docs = pinecone_client.search(
index="rag-suite-knowledge",
namespace="expert",
query=state['input'],
filter={"is_anonymized": True, "is_shared": True}, # 익명 + 공유
k=2
)
# 4. 접근 로그 기록
log_rag_access(user_id, state['input'], len(personal_docs + shared_docs))
return {
"personal_docs": personal_docs,
"shared_docs": shared_docs
}
9. 에피소드 레벨 청킹
팟캐스트 콘텐츠의 에피소드 기반 청킹 전략으로 맥락 일관성을 유지합니다.
청킹 전략
개인 그린룸 데이터:
- 기본 단위: 1회 그린룸 세션 = 1개 청크
- 길이: 보통 300
800 토큰 (약 200500 단어) - 메타데이터:
{user_id, session_date, primary_topic, emotion_tone, risk_level}
전문 지식 & 공유 이야기:
- 기본 단위: 하나의 완결된 사례 또는 개념 설명 = 1개 청크
- 길이: 보통 400~1000 토큰
- 메타데이터:
{source_type, domain, themes, difficulty_level}
팟캐스트 에피소드 아카이브:
- 기본 단위: 전체 에피소드 스크립트 + 메타데이터
- 길이: 보통 2000~3000 토큰
- 메타데이터:
{episode_id, user_id, themes, source_stories, publication_date}
청킹 알고리즘
def chunk_by_episode(raw_data: str, data_type: str) -> List[Chunk]:
"""
에피소드 레벨 청킹
- data_type: 'personal', 'expert', 'episode'
"""
chunks = []
if data_type == 'personal':
# 개인 그린룸 데이터: 세션 단위로 분할
sessions = split_by_session(raw_data)
for session in sessions:
chunk = Chunk(
content=session['text'],
metadata={
'user_id': session['user_id'],
'session_date': session['timestamp'],
'primary_topic': extract_topic(session['text']),
'emotion_tone': extract_emotion(session['text']),
'risk_level': assess_risk(session['text'])
}
)
chunks.append(chunk)
elif data_type == 'expert':
# 전문 자료: 주제 또는 사례 단위로 분할
cases_or_concepts = split_by_concept(raw_data)
for case in cases_or_concepts:
chunk = Chunk(
content=case['text'],
metadata={
'source_type': case['source'],
'domain': extract_domain(case['text']),
'themes': extract_themes(case['text']),
'is_anonymized': case.get('is_anonymized', False)
}
)
chunks.append(chunk)
return chunks
청킹 이점
| 이점 | 설명 |
|---|---|
| 맥락 일관성 | 문장 단위가 아닌 완결된 이야기 단위로 검색하므로 맥락 손실 최소화 |
| 의미 응집도 | 에피소드 내의 모든 내용이 같은 주제를 다루므로 벡터 임베딩 품질 향상 |
| 검색 정확도 | "하나의 완전한 경험" 단위로 검색되어 관련성 높은 결과 반환 |
| 팟캐스트 생성 효율 | 전체 에피소드를 다시 잘라낼 필요 없이 청크 단위로 조합 가능 |
10. 구현 단계별 워크플로우
LMS RAG 시스템의 전체 데이터 흐름입니다.
Step 1: 사용자 그린룸 입력
사용자가 그린룸에 이야기 입력
↓
예: "새로운 팀을 리드하게 되었는데 팀원들과의 신뢰 구축이 어려워요"
Step 2: Query Expansion (Reasoning Agent)
원본 쿼리: "새로운 팀을 리드하게 되었는데 팀원들과의 신뢰 구축이 어려워요"
↓
확장된 쿼리들:
- "리더로서의 첫 경험"
- "팀원 신뢰 구축 방법"
- "새로운 역할 전환 불안감"
- "관계 형성 어려움"
Step 3: Dual Retrieval (병렬 처리)
Path A - Personal RAG (Memory Agent):
Memory Agent 검색 시작
↓
Pinecone rag-suite-knowledge (namespace=personal) 쿼리: user_id 필터 + 확장 쿼리들
↓
검색 결과:
- "지난번 팀 전환 때의 불안감을 어떻게 극복했어요"
- "과거 좋은 관계를 만들었던 경험"
- "신뢰 구축의 실패 사례"
Path B - Expert RAG (Knowledge Agent):
Knowledge Agent 검색 시작
↓
KT Cloud Embedding Query → Pinecone rag-suite-knowledge (namespace=expert) dense 검색
↓
검색 결과:
- "심리학 기반 신뢰 구축 5단계"
- "새로운 리더의 일반적인 도전과제" (공유 이야기, 익명화)
- "감정 지능이 리더십에 미치는 영향"
Step 4: 감정 기반 리랭킹 (Emotion Agent)
현재 사용자 감정 분석: 불안감, 자신감 부족
↓
검색 결과 재정렬:
1. [높음] "과거 성공했던 신뢰 구축 경험" (자신감 회복)
2. [높음] "신뢰 구축의 단계별 전략" (구체적 행동)
3. [중간] "다른 리더의 도전 과정" (공감과 정상화)
4. [낮음] "신뢰 구축 실패 사례" (현재 감정상으로 부담)
Step 5: 컨텍스트 통합 (Synthesis Agent)
최종 컨텍스트 윈도우 구성:
---
[사용자 입력] 새로운 팀을 리드하게 되었는데 팀원들과의 신뢰 구축이 어려워요
[개인 메모리]
이전에 유사한 상황을 겪으셨을 때, 당신은 ...
그 경험에서 배운 점은 ...
[전문 지식]
심리학 연구에 따르면, 신뢰 구축은 다음 단계를 거칩니다:
1. 진정성 표현 (Authenticity)
2. ...
[공유 이야기]
비슷한 상황에 있던 다른 리더는 ...
(익명 처리됨)
---
Step 6: 팟캐스트 스크립트 생성 (Podcast Reasoning)
최종 컨텍스트 주입
↓
Podcast Reasoning Agent가 스크립트 생성:
- 사용자의 개인 경험을 "이야기"로 표현
- 전문 지식을 "인사이트"로 제시
- 공유 이야기를 "다른 사람의 경험"으로 언급
↓
완성된 에피소드 스크립트
↓
Pinecone rag-suite-knowledge 인덱스의 episode namespace에 저장
참고 문서 및 연계
- AI 파트 아키텍처: 전체 시스템 구조 및 에이전트 역할 정의
- Memory Agent 설명서: 개인 기억 관리 및 retrieval 기법
- Knowledge Agent 설명서: 전문 지식 관리 및 graph-based reasoning
- Podcast Reasoning 설명서: 에피소드 스크립트 생성 로직
- 안전 및 위험 감지: Safety Agent와의 연동, 트라우마 트리거 필터링
- Emotion Agent 설명서: 감정 벡터 추출 및 감정 기반 리랭킹
- Pinecone 가이드: Vector DB 운영 및 최적화 (단일 인덱스
rag-suite-knowledge기준) - Neo4j 운영 가이드: Graph DB 유지보수 및 쿼리 최적화
- KT Cloud RAG Suite 연동 PR: #145, #148, #149, #150, #151, #158
- Pinecone 인덱스 통일 / 임계값 조정 PR: #153, #155
- Backend
/api/internal/knowledgeURL 분리 PR (엔드포인트 구현 대기): #156, #157
향후 계획
- BM25 리랭킹 구현: Elasticsearch 또는 Milvus를 활용한 키워드 기반 검색 추가. 하이브리드 스코어링 (BM25×0.3 + Dense×0.7) 적용으로 고유명사·치료 기법명 검색 정확도 향상.
- Backend
/api/internal/knowledge엔드포인트 구현: 백엔드 팀에서 해당 엔드포인트를 구현하면 Knowledge Agent → Backend 실제 통신 연동 테스트 가능. - user_id 필터 최적화: 현재 메타데이터 필터(
user_id) 방식에서 Pinecone namespace 기반 격리 방식으로 점진 전환 검토 (성능 및 격리 강도 비교). - 임베딩 모델 평가: KT Cloud RAG Suite 외 대안 임베딩 모델과의 score 분포 비교 및 임계값 재조정.
- 에피소드 아카이브 청킹 전략 고도화: 에피소드 전체 vs 세그먼트 단위 청킹 A/B 테스트.
변경 이력
| 날짜 | 내용 | PR |
|---|---|---|
| 2026-04-17 | 문서 전체 재작성: 코드 기준으로 직접 수정. 단일 인덱스 rag-suite-knowledge 반영, 3개 분리 인덱스 항목 삭제, 임계값 0.25 직접 기재, KT Cloud RAG Suite 구성 직접 기재, Backend 미구현 상태 직접 기재, dense-only 검색 방식 직접 기재, 향후 계획 섹션 분리 | #153, #155, #145, #148~#151, #158, #156, #157 |
| 2026-04-17 | 기존: 정정 callout 박스 방식으로 운영 현황 기재 | — |