File size: 2,082 Bytes
dc22afe
 
 
 
 
 
362d1df
dc22afe
 
 
 
a0212b5
dc22afe
 
 
 
 
 
 
 
 
 
 
bdb528b
a11be47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a0212b5
 
a11be47
 
3b60208
dc22afe
bdb528b
aed82db
 
811c24e
 
 
 
a11be47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
from typing import List
from langchain_groq import ChatGroq

import streamlit as st

class RerankResult(BaseModel):
     top_indexes: List[int] = Field(..., description="A releváns dokumentumok indexei")
     message: str = Field(..., description="A felhasználónak megjelenítendő üzenet")
     

class Reranker:
    def __init__(self, model):
        self.llm = model
        self.parser = self.llm.with_structured_output(RerankResult)

    def rerank(self, query: str, docs: List) -> RerankResult:
        context = "\n\n".join(
            [f"[{i}] {doc[0]} (score={doc[1]:.3f})" for i, doc in enumerate(docs)]
        )

        prompt = ChatPromptTemplate.from_template(""" 
Egy intelligens asszisztens vagy, akinek feladata a dokumentumok szűrése azok relevanciája alapján egy kérdés megválaszolásához.
Az alábbi a felhasználó kérdése: "{query}"
És itt vannak a lekért dokumentumok:
{context}

Feladatod:
1. Csak azokat a dokumentumokat válaszd ki, amelyek valóban relevánsak (a többit hagyd figyelmen kívül).
2. Csak a releváns dokumentumok indexeit add vissza (ugyanabban a sorrendben, ahogy a listában szerepelnek).
3. Ha egyik dokumentum sem releváns, akkor a "top_indexes" értéke legyen egy üres lista, a "message" mezőben kérj pontosítást, és a "feedback_required" mező legyen `true`.

⚠️ Nagyon fontos: A válaszod **szigorúan érvényes JSON formátumú legyen**:
- A kulcsok legyenek dupla idézőjelek között (`"`)
- A logikai értékek kisbetűsek legyenek (`true` / `false`)
- Ne használj sortörést a JSON-on kívül

Példa a helyes formátumra:
{{
  "top_indexes": [0, 2],
  "message": ""
  
}}
""")


        # Formatage du prompt
        formatted_prompt = prompt.format_prompt(query=query, context=context)

    # Appel du modèle avec parsing automatique
        result = self.parser.invoke(formatted_prompt.to_messages())
    
        return result