Implement Phase 12 feedback, Phase 13 Semantic Chunker, Phase 13-B Reranker, Bug 5 thinking fix
- 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>
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
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]]
|
||||
Reference in New Issue
Block a user