Claw chat (RAG)¶
Claw는 Claw 페이지의 채팅 인터페이스입니다. 자유로운 질문을 영어나 중국어로 입력하면 — Claw는 본인의 과거 시그널을 검색하고, OpenRouter를 통해 Claude 또는 Qwen급 LLM으로 합성해 답합니다.
현재 검색 상태 (2026-04-22)
아래의 하이브리드 파이프라인은 절반만 가동 중입니다: BM25 / Postgres 쪽은 작동하며 현재 Claw가 질문에 답할 때 쓰고 있습니다. dense / ChromaDB 쪽은 설계가 돼 있고 검색 코드와 배선도 연결돼 있지만 embedding_worker.py가 여전히 TODO: Implement 스텁 상태입니다 — 아직 실제로 임베딩되는 시그널이 없고, dense 검색은 모든 쿼리에서 빈 리스트를 반환합니다. 그래서 RRF 융합은 현재 BM25 단독으로 떨어집니다. 임베더 완성은 후속 작업으로 추적되고 있습니다.
검색 파이프라인¶
당신의 질문
│
├────── dense search ──────► ChromaDB (예정; 임베더 스텁)
│ paraphrase-multilingual 임베딩
│
└────── BM25 키워드 검색 ──► Postgres tsvector
쿼리 토큰화 → "term1 | term2 | …" (OR 매칭)
summary_en + summary_zh + tickers 대상
│
▼
Reciprocal Rank Fusion (RRF, k=60)
│
▼
융합된 상위 6개 시그널, RLS로 본인 소유만 필터링
│
▼
프롬프트 조립 → OpenRouter LLM → 답변
│
▼
rag_query_logs에 행 기록
BM25 토크나이저¶
사용자 질문은 자연어 문장으로 들어옵니다("Should I buy NVDA right now?"). Postgres의 websearch_to_tsquery는 기본적으로 모든 단어를 AND로 매칭하기 때문에 거의 히트하지 않습니다. 그래서 rag/bm25_search._build_or_tsquery에서 사전 토큰화합니다:
\w+토큰 추출, 소문자화.- 1자 토큰과 작은 영어 stopword 세트 제거.
- 순서를 유지한 채 중복 제거.
|로 조인해to_tsquery에 넘김.
"Should I buy NVDA right now?" → "buy | nvda" → 두 단어 중 하나라도 언급한 시그널에 매칭되고, ts_rank로 랭킹됩니다. LLM이 상위 6개 중 관련성 있는 부분을 선택합니다.
무엇이 검색되는가¶
- 본인의 시그널만. dense와 렉시컬 경로 모두 사용자 격리를 강제합니다 — Chroma는
where={"user_id": ...}메타데이터 필터로, Postgres는 대시보드를 보호하는 것과 동일한 RLS 정책으로. 실수로라도 다른 사용자의 기록을 질의할 수 없습니다. - 단순 연결이 아닌 융합. dense 검색은 의미 패러프레이즈를 잡아냅니다(중국어 질문이 영어 시그널을 찾거나, "supply chain"이 "downstream manufacturers"에 매칭되는 등). BM25는 dense 임베딩이 놓칠 수 있는 정확한 티커와 이름을 잡아냅니다. RRF는 점수 스케일이 매우 다른 두 순위 리스트를 보정 없이 병합합니다.
- 이중언어. 임베더(
paraphrase-multilingual-MiniLM-L12-v2, 384차원)가 영어와 중국어 요약을 같은 의미 공간에 넣으므로, 어느 언어로 질의하든 두 언어의 콘텐츠가 모두 검색됩니다.
답변은 어떻게 생겼는가¶
Claw는 다음과 같이 프롬프트됩니다:
- 사용한 사실은 검색된 시그널에 매칭되는 대괄호 번호
[1],[2]로 인용. - 질문과 같은 언어로 답변.
- 검색 결과가 관련성이 없었다면 "the signals don't support that"이라고 말함 — 환각된 세부사항 금지.
- 질문이 리스트를 요구하지 않는 한 약 250단어 이내 유지.
모든 호출은 rag_query_logs에 다음과 함께 기록됩니다:
- 질문 텍스트와 답변
- 검색된 시그널 id 리스트
- 상위 1위의 코사인 유사도(검색 품질 프록시로 유용 — 0.30 미만이면 질문이 범위 밖일 가능성이 큼)
- 모델명과 지연시간
Claw가 가장 유용할 때¶
- "Why did NVDA drop today?" — 최근 NVDA 태그 시그널을 끌어와 why-내러티브를 합성.
- "Summarise this week's FLASH signals" — 해당 윈도우의 모든 FLASH 티어 시그널을 검색해 롤업 반환.
- "What's the Chinese semiconductor policy situation?" — 단일 카드가 전달할 수 없는, 멀티 시그널·멀티 에이전트 집계에 딱 맞는 질문.
- "최근 AI 芯片 수요 측면에 어떤 시그널이 있어?" — 중국어 풀 라운드트립도 작동.
그렇지 않을 때¶
- 현재가 / 호가. Claw는 시그널을 읽지 실시간 시장 데이터를 읽지 않습니다. 대시보드의 지수 바나 종목 카드를 쓰세요.
- 교차 사용자 집계. RLS가 다른 사람의 시그널을 당신의 세션에서 가립니다 — Claw에는 "전역" 뷰가 없습니다.
- 투자 조언. Claw는 공인 자문가 흉내를 거부합니다.