import yaml import gradio as gr from typing import List from llm_client import GeminiClient from pinecone_index import PinceconeIndex SYSTEM_MESSAGE = "Give a precise answer to the question based on only the \ context and evidence and do not be verbose." TOP_K = 1 def format_prompt(question: str, evidence: List[str]): evidence_string = "" for i, ev in enumerate(evidence): evidence_string = evidence_string.join(f"\n Evidence {i+1}: {ev}") print(f"evidence string - {evidence_string}") content = f"{SYSTEM_MESSAGE} \ \n ### Question:{question} \ \n ### Evidence: {evidence_string} \ \n ### Response:" return content if __name__ == "__main__": config_path = "config.yml" with open("config.yml", "r") as file: config = yaml.safe_load(file) print(config) data_path = config["paths"]["data_path"] project = config["paths"]["project"] index_name = config["pinecone"]["index-name"] embedding_model = config["sentence-transformers"]["model-name"] embedding_dimension = config["sentence-transformers"]["embedding-dimension"] index = PinceconeIndex(index_name, embedding_model) index.connect_index(embedding_dimension, False) gemini_client = GeminiClient() def get_answer(question: str): evidence = index.query(question, top_k=TOP_K) prompt_with_evidence = format_prompt(question, evidence) print(prompt_with_evidence) response = gemini_client.generate_text(prompt_with_evidence) final_output = [response] + evidence return final_output context_outputs = [gr.Textbox(label=f"Evidence {i+1}") for i in range(TOP_K)] result_output = [gr.Textbox(label="Answer")] gradio_outputs = result_output + context_outputs gradio_inputs = gr.Textbox(placeholder="Enter your question...") demo = gr.Interface( fn=get_answer, inputs=gradio_inputs, # outputs=[gr.Textbox(label=f'Document {i+1}') for i in range(TOP_K)], outputs=gradio_outputs, title="GT Student Code of Conduct Bot", description="Get LLM-powered answers to questions about the \ Georgia Tech Student Code of Conduct. The evidences are exerpts\ from the Code of Conduct.", ) demo.launch()