| import os |
| from typing import List |
| from aimakerspace.text_utils import CharacterTextSplitter, TextFileLoader, PDFLoader |
| from aimakerspace.openai_utils.prompts import ( |
| UserRolePrompt, |
| SystemRolePrompt, |
| AssistantRolePrompt, |
| ) |
| from aimakerspace.openai_utils.embedding import EmbeddingModel |
| from aimakerspace.vectordatabase import VectorDatabase |
| from aimakerspace.openai_utils.chatmodel import ChatOpenAI |
|
|
| system_template = """\ |
| Use the following context to answer a users question. If you cannot find the answer in the context, say you don't know the answer.""" |
| system_role_prompt = SystemRolePrompt(system_template) |
|
|
| user_prompt_template = """\ |
| Context: |
| {context} |
| |
| Question: |
| {question} |
| """ |
| user_role_prompt = UserRolePrompt(user_prompt_template) |
|
|
| class RetrievalAugmentedQAPipeline: |
| def __init__(self, llm: ChatOpenAI(), vector_db_retriever: VectorDatabase) -> None: |
| self.llm = llm |
| self.vector_db_retriever = vector_db_retriever |
|
|
| async def arun_pipeline(self, user_query: str): |
| context_list = self.vector_db_retriever.search_by_text(user_query, k=4) |
|
|
| context_prompt = "" |
| for context in context_list: |
| context_prompt += context[0] + "\n" |
|
|
| formatted_system_prompt = system_role_prompt.create_message() |
| formatted_user_prompt = user_role_prompt.create_message(question=user_query, context=context_prompt) |
|
|
| async def generate_response(): |
| async for chunk in self.llm.astream([formatted_system_prompt, formatted_user_prompt]): |
| yield chunk |
|
|
| return {"response": generate_response(), "context": context_list} |
|
|
| text_splitter = CharacterTextSplitter() |
|
|
| def process_file(file_path: str, file_name: str): |
| print(f"Processing file: {file_name}") |
|
|
| |
| if file_name.lower().endswith('.pdf'): |
| loader = PDFLoader(file_path) |
| else: |
| loader = TextFileLoader(file_path) |
|
|
| |
| documents = loader.load_documents() |
| texts = text_splitter.split_texts(documents) |
| return texts |