|
import logging |
|
import os |
|
|
|
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex |
|
from llama_index.core.chat_engine.types import AgentChatResponse |
|
from llama_index.llms.openai import OpenAI |
|
from llama_index.core import StorageContext, load_index_from_storage |
|
|
|
logger = logging.getLogger("app.llama_index") |
|
|
|
|
|
class Assistant: |
|
def __init__( |
|
self, |
|
data_dir: str = "data/pdf", |
|
model_name: str = "gpt-4", |
|
) -> None: |
|
self.data_dir = data_dir |
|
self.model_name = model_name |
|
|
|
storage_dir = os.path.join(self.data_dir, "storage") |
|
if os.path.isdir(storage_dir): |
|
logger.info("Loading index from storage") |
|
storage_context = StorageContext.from_defaults(persist_dir=storage_dir) |
|
self.index = load_index_from_storage(storage_context) |
|
else: |
|
self.documents = SimpleDirectoryReader(self.data_dir).load_data() |
|
self.index = VectorStoreIndex(self.documents) |
|
self.index.storage_context.persist(storage_dir) |
|
|
|
llm = OpenAI(model=self.model_name) |
|
self.chat_engine = self.index.as_chat_engine( |
|
chat_mode="openai", |
|
llm=llm, |
|
verbose=True, |
|
system_prompt=( |
|
"Du er en assistent til at hjælpe med at besvare spørgsmål omkring årsopgørelsen fra skat." |
|
" Din viden er baseret på årsopgørelsen og relaterede emner fra skat.dk." |
|
" Du kan svare på spørgsmål omkring årsopgørelsen, og du kan også stille spørgsmål til brugeren for at få mere information." |
|
" Du kan også bede brugeren om at uddybe, hvis du ikke forstår spørgsmålet." |
|
" Du skal opgive de kilder, du bruger til at besvare spørgsmålet, og du skal også oplyse, hvis du ikke kan besvare spørgsmålet." |
|
), |
|
) |
|
|
|
def __call__(self, question: str, history: list[str]) -> str: |
|
response: AgentChatResponse = self.chat_engine.chat( |
|
question, |
|
tool_choice="query_engine_tool", |
|
) |
|
return response.response |
|
|