File size: 2,409 Bytes
b34efa5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
"""
Generator module for Norwegian RAG chatbot.
Generates responses using retrieved context and LLM.
"""

from typing import List, Dict, Any, Optional

from ..api.huggingface_api import HuggingFaceAPI, create_rag_prompt

class Generator:
    """
    Generates responses using retrieved context and LLM.
    Uses Hugging Face Inference API for text generation.
    """
    
    def __init__(
        self,
        api_client: Optional[HuggingFaceAPI] = None,
    ):
        """
        Initialize the generator.
        
        Args:
            api_client: HuggingFaceAPI client for text generation
        """
        self.api_client = api_client or HuggingFaceAPI()
    
    def generate(
        self,
        query: str,
        retrieved_chunks: List[Dict[str, Any]],
        temperature: float = 0.7
    ) -> str:
        """
        Generate a response using retrieved context.
        
        Args:
            query: User query
            retrieved_chunks: List of retrieved chunks with metadata
            temperature: Temperature for text generation
            
        Returns:
            Generated response
        """
        # Extract text from retrieved chunks
        context_texts = [chunk["chunk_text"] for chunk in retrieved_chunks]
        
        # If no context is retrieved, generate a response without context
        if not context_texts:
            return self._generate_without_context(query, temperature)
        
        # Create RAG prompt
        prompt = create_rag_prompt(query, context_texts)
        
        # Generate response
        response = self.api_client.generate_text(
            prompt=prompt,
            temperature=temperature
        )
        
        return response
    
    def _generate_without_context(self, query: str, temperature: float = 0.7) -> str:
        """
        Generate a response without context when no relevant chunks are found.
        
        Args:
            query: User query
            temperature: Temperature for text generation
            
        Returns:
            Generated response
        """
        prompt = f"""Du er en hjelpsom assistent som svarer på norsk. Svar på følgende spørsmål så godt du kan.

SPØRSMÅL:
{query}

SVAR:
"""
        
        response = self.api_client.generate_text(
            prompt=prompt,
            temperature=temperature
        )
        
        return response