File size: 1,362 Bytes
9a6173b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

import os
from qdrant_client import QdrantClient
from qdrant_client.models import NamedVector
from typing import List

from app.services.openai_service import OpenAIService
from app.services.embeddings_service import EmbeddingsService

class RAGService:
    def __init__(self, qdrant_client: QdrantClient, embeddings_service: EmbeddingsService, openai_service: OpenAIService):
        self.qdrant_client = qdrant_client
        self.embeddings_service = embeddings_service
        self.openai_service = openai_service
        self.collection_name = os.getenv("QDRANT_COLLECTION_NAME", "book_embeddings")

    async def retrieve_context(self, query: str, top_k: int = 3) -> List[str]:
        query_vector = await self.embeddings_service.create_embedding(query)
        
        search_result = self.qdrant_client.search(
            collection_name=self.collection_name,
            query_vector=query_vector,
            limit=top_k,
            with_payload=True,
        )

        context = [point.payload.get("content", "") for point in search_result if point.payload]
        return context

    async def generate_response(self, query: str, context: List[str]) -> str:
        full_prompt = f"""Context: {' '.join(context)}

Question: {query}

Answer:"""
        response = await self.openai_service.get_chat_response(full_prompt)
        return response