콘텐츠로 이동

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에서 사전 토큰화합니다:

  1. \w+ 토큰 추출, 소문자화.
  2. 1자 토큰과 작은 영어 stopword 세트 제거.
  3. 순서를 유지한 채 중복 제거.
  4. |로 조인해 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는 공인 자문가 흉내를 거부합니다.

참고