145b0cc96f
- Phase 12: FeedbackRepository + td_feedback 테이블, Gradio 👍/👎 이벤트, run_id 추적, LangSmith create_feedback() 연동 - Phase 13: 커스텀 _SemanticSplitter 제거 → langchain_experimental.SemanticChunker 교체, buffer_size/threshold_type 환경변수 적용 - Phase 13-B: RerankService (Cross-Encoder), RetrieverService.search()에 reranker 통합, tools.py as_retriever() → search() 전환 - Bug 5: mlx_chat_model enable_thinking 런타임 오버라이드, agent_service stream_mode=["messages","custom"] 이중 스트림, thinking 토큰 custom 이벤트로 emit - ROADMAP: LLM 모델명 8B 반영, RAG에 Reranker 추가, 추천 진행 순서 갱신 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
20 lines
771 B
Python
20 lines
771 B
Python
from langchain_core.documents import Document
|
|
|
|
|
|
class RerankService:
|
|
"""Cross-Encoder 기반 재순위(Reranker) 서비스."""
|
|
|
|
def __init__(self, model_id: str = "cross-encoder/mmarco-mMiniLMv2-L12-H384-v1"):
|
|
from sentence_transformers import CrossEncoder
|
|
print(f"Reranker 로딩 중: {model_id}")
|
|
self._model = CrossEncoder(model_id)
|
|
print("Reranker 로딩 완료")
|
|
|
|
def rerank(self, query: str, docs: list[Document], top_k: int) -> list[Document]:
|
|
if not docs:
|
|
return docs
|
|
pairs = [(query, doc.page_content) for doc in docs]
|
|
scores = self._model.predict(pairs)
|
|
ranked = sorted(zip(scores, docs), key=lambda x: x[0], reverse=True)
|
|
return [doc for _, doc in ranked[:top_k]]
|