|
import nest_asyncio |
|
nest_asyncio.apply() |
|
|
|
from llama_index.core import ( |
|
VectorStoreIndex, |
|
ServiceContext, |
|
SimpleDirectoryReader, |
|
load_index_from_storage, |
|
) |
|
|
|
from llama_index.core.storage import StorageContext |
|
from llama_index.core.node_parser import SentenceSplitter |
|
from llama_index.core.prompts import PromptTemplate |
|
from llama_index.core.response_synthesizers import TreeSummarize |
|
from llama_index.core.query_pipeline import InputComponent |
|
from llama_index.core.indices.knowledge_graph import KGTableRetriever |
|
from llama_index.legacy.vector_stores.faiss import FaissVectorStore |
|
from llama_index.llms.openai import OpenAI |
|
from llama_index.embeddings.openai import OpenAIEmbedding |
|
from llama_index.core import Settings |
|
|
|
import openai |
|
import os |
|
from github import Github |
|
from datetime import datetime |
|
import gradio as gr |
|
|
|
|
|
openai.api_key = os.environ.get('openai_key') |
|
os.environ["OPENAI_API_KEY"] = os.environ.get('openai_key') |
|
|
|
|
|
exec(os.environ.get('logs_context')) |
|
|
|
|
|
|
|
exec(os.environ.get('context')) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
project_name = "DEV PharmaWise Data Integrity Chat 4.5" |
|
|
|
import networkx as nx |
|
import matplotlib.pyplot as plt |
|
from PIL import Image |
|
from io import BytesIO |
|
|
|
def draw_graph(): |
|
global kg_data |
|
G = nx.DiGraph() |
|
for source, relation, target in kg_data: |
|
G.add_edge(source, target, label=relation) |
|
|
|
|
|
pos = nx.spring_layout(G) |
|
|
|
plt.figure(figsize=(12, 8)) |
|
|
|
nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=400, edge_color='k', linewidths=1, font_size=8, font_weight='bold') |
|
|
|
edge_labels = {} |
|
for source, target, data in G.edges(data=True): |
|
if 'label' in data: |
|
edge_labels[(source, target)] = data['label'] |
|
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=7, font_weight='normal') |
|
plt.title("Graph") |
|
plt.axis('off') |
|
|
|
buf = BytesIO() |
|
plt.savefig(buf, format='png') |
|
buf.seek(0) |
|
plt.close() |
|
|
|
return Image.open(buf) |
|
|
|
|
|
def extraer_informacion_metadata(respuesta, max_results=10): |
|
|
|
source_nodes = respuesta.source_nodes |
|
|
|
|
|
page_file_info = [ |
|
f"Página {node.node.metadata.get('page_label', '')} del archivo {node.node.metadata.get('file_name', '')} (Relevance: {node.score:.6f} - Id: {node.node.id_})" |
|
for node in source_nodes |
|
] |
|
|
|
|
|
page_file_info = page_file_info[:max_results] |
|
|
|
return page_file_info |
|
|
|
from typing import List |
|
from llama_index.core import Prompt |
|
from llama_index.core.llms import ChatMessage, MessageRole |
|
from llama_index.core.chat_engine.context import ContextChatEngine |
|
from llama_index.core.memory import ChatMemoryBuffer |
|
|
|
chat_history_engine = [] |
|
result_metadata = "" |
|
|
|
with gr.Blocks(theme='sudeepshouche/minimalist') as demo: |
|
|
|
def visible(): |
|
return {btn_graph: gr.Button(value="Grafo", visible=True)} |
|
|
|
def get_ref(): |
|
return {mkdn: gr.Markdown(result_metadata)} |
|
|
|
def refresh(chat_history): |
|
global kg_data |
|
global chat_history_engine |
|
global result_metadata |
|
kg_data = [] |
|
chat_history_engine = [] |
|
result_metadata = "" |
|
chat_history = [[None, None]] |
|
gr.Info("¡Listo! Ya puedes seguir chateando.") |
|
return chat_history |
|
|
|
def summarize_assistant_messages(chat_history: List[ChatMessage]) -> List[ChatMessage]: |
|
|
|
assistant_messages = [msg for msg in chat_history if msg.role == MessageRole.ASSISTANT] |
|
if len(assistant_messages) < 2: |
|
return chat_history |
|
|
|
anteultima_respuesta = assistant_messages[-2] |
|
|
|
|
|
prompt = Prompt(f"Responder SOLO con un resumen del siguiente texto: \n\n{anteultima_respuesta.content}") |
|
llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1) |
|
response = llm.predict(prompt) |
|
|
|
|
|
summarized_message = ChatMessage(content=response, role=MessageRole.ASSISTANT) |
|
|
|
|
|
new_chat_history = [msg if msg != anteultima_respuesta else summarized_message for msg in chat_history] |
|
|
|
return new_chat_history |
|
|
|
|
|
def respond(message, chat_history): |
|
global chat_history_engine |
|
global result_metadata |
|
|
|
|
|
if not chat_history: |
|
chat_history = [[message, ""]] |
|
else: |
|
|
|
chat_history.append([message, ""]) |
|
|
|
chat_history_engine = summarize_assistant_messages(chat_history_engine) |
|
|
|
response = chat_engine.stream_chat(message, chat_history=chat_history_engine) |
|
|
|
|
|
metadata_info = extraer_informacion_metadata(response, max_results=10) |
|
|
|
if metadata_info: |
|
metadata_list = "\n".join(["- " + info for info in metadata_info]) |
|
result_metadata = "\n\n" + metadata_list |
|
|
|
for text in response.response_gen: |
|
chat_history[-1][1] += text |
|
yield "", chat_history |
|
|
|
print("----------") |
|
print(memory.get_all()) |
|
|
|
|
|
|
|
|
|
gr.Markdown(""" |
|
# PharmaWise Data Integrity Chat 4.5 |
|
Realiza preguntas a tus datos y obtén al final del texto las paginas y documentos utilizados generar tu responder. |
|
""") |
|
with gr.Row(): |
|
with gr.Column(): |
|
chatbot = gr.Chatbot(show_label=False, show_copy_button=True, ) |
|
pregunta = gr.Textbox(show_label=False, autofocus=True, placeholder="Realiza tu consulta...") |
|
pregunta.submit(respond, [pregunta, chatbot], [pregunta, chatbot]) |
|
|
|
with gr.Row(): |
|
btn_send = gr.Button(value="Preguntar", variant="primary") |
|
clear = gr.Button(value="Limpiar") |
|
|
|
gr.Examples(label="Ejemplos", examples=["Explicar el concepto ALCOA"], inputs=[pregunta]) |
|
|
|
with gr.Column(): |
|
|
|
with gr.Accordion(label="Bases de datos del conocimiento", open=False): |
|
gr.Markdown(""" |
|
###### [1] ISPE Risk Based Approach to Compliant Electronic Records and Signatures.pdf |
|
###### [2] EMA Guideline on computerised systems and electronic data in clinical trials.pdf |
|
###### [3] EU GMP guide annexes Supplementary requirements Annex 11 Computerised systems.pdf |
|
###### [4] FDA Data Integrity and Compliance With Drug CGMP (Q&A) Guidance for Industry.pdf |
|
###### [5] GAMP 5 A Risk Based Approach to Compliant GxP Computerized System (ED2).pdf |
|
###### [6] ISPE Application of GAMP 5 to Implementation of a GxP Clinical System.pdf |
|
###### [7] ISPE Guide_ Project Management for the Pharmaceutical Industry - ISPE.pdf |
|
###### [8] ISPE Science and Risk-Based Approach for the Delivery of Facilities, Systems, and Equipment.pdf |
|
###### [9] GAMP Good Practice Guide The Validation of Legacy Systems.pdf |
|
###### [10] ISPE Manufacturing Execution Systems.pdf |
|
###### [11] MHRA GXP Data Integrity Guidance and Definitions (2018).pdf |
|
###### [12] PI 041-1 Good Practices for Data Management and Integrity in Regulated Environments (2021).pdf |
|
###### [13] ISPE Records and Data Integrity Guide.pdf |
|
###### [14] ISPE Testing GxP Systems.pdf |
|
###### [15] WHO TR 1033 Annex 4 Guideline on data integrity.pdf |
|
###### [16] ISPE Validation of Laboratory Computerized Systems 2005.pdf |
|
###### [17] FDA Guidance for Industry Part 11, Electronic Records; Electronic Signatures.pdf |
|
###### [18] FDA General Principles of Software Validation -2002.pdf |
|
###### [19] FDA Guidance for Industry Computerized Systems Used in Clinical Trials.pdf |
|
###### [20] FDA Guidance-Computer-Software-Assurance - 2022.pdf |
|
###### [21] FDA 21 CFR Part 11 Electronic Records Electronic-Signatures - 2003.pdf |
|
###### [22] EMA Annex 15 Qualification and Validation.pdf |
|
###### [23] EMA Annex 11 Computerised Systems.pdf |
|
###### [24] ANMAT Disposicion_3827-2018 - Anexo 6 Sistemas Informaticos.pdf |
|
###### [25] DIGEMID DS-021 5.6 Sistemas Computadorizados.pdf |
|
###### [26] COFEPRIS BPM-NOM059-2015 9.13 Validación de sistemas computacionales.pdf |
|
###### [27] PA-PH-OMCL (08) 88 R5 Annex 2 Validation of Complex Computerised Systems.pdf |
|
###### [28] INVIMA Resolución_3619 - GLP- 2013 5 Equipos procesadores de datos.pdf |
|
###### [29] PAPHOMCL (08) 87 R6 Annex 1 Validation of Excel Spreadsheets.pdf |
|
###### [30] PA-PH-OMCL (08) 69 R7 Validation of Computerised Systems.pdf |
|
###### [31] GUÍA BPM ARCSA 2020 (software).pdf |
|
###### [32] GMP Paraguay DINAVISA Resolucion 197-21.pdf |
|
###### [33] ANVISA Guide for Computer Systems Validation 33-2020.pdf |
|
###### [34] ANVISA INSTRUÇÃO NORMATIVA - IN Nº 43 - 2019.pdf |
|
###### [35] PIC_011_3_recommendation_on_computerised_systems.pdf |
|
###### [36] PIC Revision of Annex 11 EU GMP.pdf |
|
""") |
|
|
|
with gr.Accordion(label="Referencias", open=True): |
|
mkdn = gr.Markdown() |
|
|
|
with gr.Row(): |
|
btn_graph = gr.Button(value="Grafo") |
|
btn_ref = gr.Button(value="Referencias") |
|
|
|
with gr.Row(): |
|
grafo = gr.Image(label="Grafo", show_share_button=False) |
|
|
|
btn_ref.click(get_ref, outputs=[mkdn]) |
|
btn_send.click(respond, [pregunta, chatbot], [pregunta, chatbot]) |
|
btn_graph.click(draw_graph, outputs=[grafo]) |
|
|
|
clear.click(refresh, inputs=[chatbot], outputs=[chatbot]) |
|
|
|
|
|
|
|
demo.queue() |
|
demo.launch() |