Jorge Henao commited on
Commit
62a36e2
1 Parent(s): d9a4c48

ui refactor

Browse files
Files changed (8) hide show
  1. .vscode/launch.json +1 -1
  2. about.py +13 -13
  3. app.py +152 -0
  4. hallazgos.py +0 -151
  5. main_page.py +0 -35
  6. pinecode_quieries.py +14 -9
  7. reformas.py +0 -170
  8. samples.py +32 -0
.vscode/launch.json CHANGED
@@ -27,7 +27,7 @@
27
  "program": "/Users/jorge.henao/oosource/ask2democracycol/venv/bin/streamlit",
28
  "args": [
29
  "run",
30
- "main_page.py"]
31
  }
32
  ]
33
  }
 
27
  "program": "/Users/jorge.henao/oosource/ask2democracycol/venv/bin/streamlit",
28
  "args": [
29
  "run",
30
+ "app.py"]
31
  }
32
  ]
33
  }
about.py CHANGED
@@ -1,30 +1,30 @@
1
  from pinecode_quieries import PinecodeProposalQueries
2
  import streamlit as st
3
 
4
- def about_ask2democracy(api_key: str, queries: PinecodeProposalQueries = None):
5
- st.markdown("""
6
- <h1 style='
7
- text-align: center;
8
- color: #39AA35'>
9
- Ask2Democracy 🇨🇴
10
- </h1>
11
  <p>Muchas de las discusiones que ocurren en Colombia generalmente están sustentadas en artículos o pdfs que salvo pocas excepciones, casi nadie lee.
12
  Este sistema ha indexado algunos textos relevantes para la discución pública que suelen estar dispersos y poco accesibles, además, apoyandose en modelos de lenguaje Transformers (abajo más detalles) puede entender preguntas elaboradas.
13
  Algunos de los textos indexados: las propuestas presidenciales del 22, los hallazgos de la comisión de la verdad, los textos de las reformas, entre otros.
14
  <div align="right">
15
  Creado por Jorge Henao 🇨🇴 <a href="https://twitter.com/jhenaotw" target='_blank'>Twitter</a> <a href="https://www.linkedin.com/in/henaojorge" target='_blank'/>LinkedIn</a>
16
  </div>
17
- """, unsafe_allow_html=True)
18
- description = """
19
  <p>
20
- <h2>Sobre esta iniciativa</h2>
 
 
 
 
 
 
 
 
21
  Pretende ayudar a construir democracia participativa apaloncándose en el estado del arte de la inteligencia artificial.
22
  Siendo una herramienta que aporta a la discución pública, empoderando al ciudadano del común para ser partícipe del debate público mientras hace preguntas en su propio lenguaje, y llegando a sus propias conclusiones.
23
- <h2>Inteligencia artificial en la democracia</h2>
24
  Uno de los objetivos es contribuir a la inteligencia artificial abierta y en español, con la construcción de un dataset y el entrenamiento de un modelo de lenguaje adaptado para las discuciones ciudadanas.
25
  Algo útil para elevar la calidad del debate en todos los países de habla hispana.
26
- <h2>¿Cómo utilizar este espacio?</h2>
27
- Selecciona el texto sobre el que quieres buscar en el panel de la izquierda y escribe preguntas. No se trata de un sistema de búsquedas basado en palabras clave, por el contrario, puedes redactar preguntas más extensas y elaboradas. Cuanto más contexto le des a la pregunta mejores resultados se obtienen.
28
  <h2>Ask2Democracy v 1.2</h2>
29
  Esta version usa sentence transformers, Cosine similarity, <a href= "https://github.com/deepset-ai/haystack">Haystack framework</a> y una base de dactos vectorial Pinecone para mejorar la precision en las respuestas.
30
  Los modelos transformers de lenguaje utilizados son:
 
1
  from pinecode_quieries import PinecodeProposalQueries
2
  import streamlit as st
3
 
4
+ def show_about_ask2democracy():
5
+ description = """
6
+ <h2>Sobre esta iniciativa</h2>
 
 
 
 
7
  <p>Muchas de las discusiones que ocurren en Colombia generalmente están sustentadas en artículos o pdfs que salvo pocas excepciones, casi nadie lee.
8
  Este sistema ha indexado algunos textos relevantes para la discución pública que suelen estar dispersos y poco accesibles, además, apoyandose en modelos de lenguaje Transformers (abajo más detalles) puede entender preguntas elaboradas.
9
  Algunos de los textos indexados: las propuestas presidenciales del 22, los hallazgos de la comisión de la verdad, los textos de las reformas, entre otros.
10
  <div align="right">
11
  Creado por Jorge Henao 🇨🇴 <a href="https://twitter.com/jhenaotw" target='_blank'>Twitter</a> <a href="https://www.linkedin.com/in/henaojorge" target='_blank'/>LinkedIn</a>
12
  </div>
 
 
13
  <p>
14
+ <h2>¿Cómo utilizar este espacio?</h2>
15
+ Selecciona la colección de documentos sobre la que quieres buscar en el panel de la izquierda y escribe preguntas.
16
+ No se trata de un sistema de búsquedas basado en palabras clave, por el contrario, puedes redactar preguntas más extensas y elaboradas. Cuanto más contexto le des a la pregunta mejores resultados se obtienen.
17
+ <h2>Integración opcional con OpenAI</h2>
18
+ Este espacio usa recursos de computo de Hugging Face y y una base de datos vectorial Pinecone sin costo para el usuario. De manera opcional, si tienes una cuenta en OpenAI también puedes activar la integración copiando tu API key en el panel de la izquierda.
19
+ Una vez ingreses el api key, cada vez que preguntes el sistema la usará para generar una respuesta a partir de los resultados de búsqueda obtenidos.
20
+ También puedes configurar la temperatura y la cantidad de tokens.
21
+ <p><p><b>Nota:El sistema no guarda tu API key, la utiliza para aumentar tus consultas mientras lo uses.</b>
22
+ <h2>Inteligencia artificial y democracia</h2>
23
  Pretende ayudar a construir democracia participativa apaloncándose en el estado del arte de la inteligencia artificial.
24
  Siendo una herramienta que aporta a la discución pública, empoderando al ciudadano del común para ser partícipe del debate público mientras hace preguntas en su propio lenguaje, y llegando a sus propias conclusiones.
25
+ <p>
26
  Uno de los objetivos es contribuir a la inteligencia artificial abierta y en español, con la construcción de un dataset y el entrenamiento de un modelo de lenguaje adaptado para las discuciones ciudadanas.
27
  Algo útil para elevar la calidad del debate en todos los países de habla hispana.
 
 
28
  <h2>Ask2Democracy v 1.2</h2>
29
  Esta version usa sentence transformers, Cosine similarity, <a href= "https://github.com/deepset-ai/haystack">Haystack framework</a> y una base de dactos vectorial Pinecone para mejorar la precision en las respuestas.
30
  Los modelos transformers de lenguaje utilizados son:
app.py ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ from about import show_about_ask2democracy
3
+ import streamlit as st
4
+ from pinecode_quieries import PinecodeProposalQueries
5
+ from config import Config
6
+ from samples import *
7
+
8
+ queries = PinecodeProposalQueries (index_name= Config.index_name,
9
+ api_key = Config.es_password,
10
+ environment = Config.pinecone_environment,
11
+ embedding_dim = Config.embedding_dim,
12
+ reader_name_or_path = Config.reader_model_name_or_path,
13
+ use_gpu = Config.use_gpu,
14
+ OPENAI_key= None)
15
+
16
+ def search(question, retriever_top_k, reader_top_k, selected_index=None):
17
+ filters = {"source_title": selected_index}
18
+ query_result = queries.search_by_query(query = question,
19
+ retriever_top_k = retriever_top_k,
20
+ reader_top_k = reader_top_k,
21
+ filters = filters)
22
+ result = []
23
+ for i in range(0, len(query_result)):
24
+ item = query_result[i]
25
+ result.append([[i+1], item.answer.replace("\n",""), item.context[:250],
26
+ item.meta['title'], item.meta['source_title'],
27
+ int(item.meta['page']), item.meta['source_url']])
28
+ return result
29
+
30
+ def search_and_show_results(query:str, retriever_top_k = 5, reader_top_k =3, selected_index=None):
31
+ stt = time.time()
32
+ results = search(query, retriever_top_k=retriever_top_k,
33
+ reader_top_k=reader_top_k, selected_index=selected_index)
34
+ ent = time.time()
35
+ elapsed_time = round(ent - stt, 2)
36
+
37
+ st.write(f"**Resultados encontrados para la pregunta** \"{query}\" ({elapsed_time} sec.):")
38
+ for i, answer in enumerate(results):
39
+ st.subheader(f"{answer[1]}")
40
+ doc = answer[2][:250] + "..."
41
+ st.markdown(f"{doc}[Lee más aquí]({answer[6]})", unsafe_allow_html=True)
42
+ st.caption(f"Fuente: {answer[4]} - Artículo: {answer[3]} - Página: {answer[5]}")
43
+
44
+ def search_and_generate_answer(question, retriever_top_k, generator_top_k,
45
+ openai_api_key, openai_model_name= "text-davinci-003",
46
+ temperature = .5, max_tokens = 30, selected_index = None):
47
+ filters = {"source_title": selected_index}
48
+
49
+ query_result = queries.genenerate_answer_OpenAI(query = question,
50
+ retriever_top_k = retriever_top_k,
51
+ generator_top_k = generator_top_k,
52
+ filters = filters, OPENAI_key = openai_api_key,
53
+ openai_model_name= openai_model_name,temperature = temperature, max_tokens = max_tokens)
54
+ result = []
55
+ for i in range(0, len(query_result)):
56
+ item = query_result[i]
57
+ source_title = item.meta['doc_metas'][0]['source_title']
58
+ source_url = item.meta['doc_metas'][0]['source_url']
59
+ chapter_titles = [source['title'] for source in item.meta['doc_metas']]
60
+ result.append([[i+1], item.answer.replace("\n",""),
61
+ source_title, source_url, str(chapter_titles)])
62
+ return result
63
+
64
+ def search_and_show_generative_results(query:str, retriever_top_k = 5, generator_top_k =1 , openai_api_key = None, openai_model_name = "text-davinci-003", temperature = .5, max_tokens = 30, selected_index = None):
65
+ # set start time
66
+ stt = time.time()
67
+ results = search_and_generate_answer(query, retriever_top_k = retriever_top_k,
68
+ generator_top_k= generator_top_k,
69
+ openai_api_key = openai_api_key,
70
+ openai_model_name= openai_model_name,
71
+ temperature = temperature, max_tokens = max_tokens,
72
+ selected_index = selected_index)
73
+ ent = time.time()
74
+ elapsed_time = round(ent - stt, 2)
75
+ st.write(f"**Respuesta generada para la pregunta** \"{query}\" ({elapsed_time} sec.):")
76
+ if results != None:
77
+ for i, answer in enumerate(results):
78
+ # answer starts with header
79
+ st.subheader(f"{answer[1]}")
80
+ st.caption(f"Fuentes: {answer[2]} - {answer[4]}")
81
+ st.markdown(f"[Lee más aquí]({answer[3]})")
82
+
83
+
84
+ indexes = [{"title": "Propuestas de reforma 2023", "name": "Reforma de la salud 13 Febrero 2023", "samples": samples_reforma_salud},
85
+ {"title": "Hallazgos de la comisión de la verdad", "name": "Hallazgos y recomendaciones - 28 de Junio 2022", "samples": samples_hallazgos_paz}]
86
+
87
+ index_titles = [item["title"] for item in indexes]
88
+
89
+ def get_selected_index_by_title(title):
90
+ for item in indexes:
91
+ if item["title"] == title:
92
+ return item["name"]
93
+ return None
94
+
95
+ def get_samples_for_index(title):
96
+ for item in indexes:
97
+ if item["title"] == title:
98
+ return item["samples"]
99
+ return None
100
+
101
+ def main():
102
+ st.markdown("""
103
+ <h1 style='
104
+ text-align: center;
105
+ color: #39AA35'>
106
+ Ask2Democracy 🇨🇴
107
+ </h1>
108
+ <div align="right">
109
+ Creado por Jorge Henao 🇨🇴 <a href="https://twitter.com/jhenaotw" target='_blank'>Twitter</a> <a href="https://www.linkedin.com/in/henaojorge" target='_blank'/>LinkedIn</a>
110
+ </div>""", unsafe_allow_html=True)
111
+ st.sidebar.title("Configuración de búsqueda")
112
+ with st.sidebar.expander("Parámetros de recuperación", expanded= True):
113
+ index = st.selectbox("Selecciona la colección de documentos", index_titles)
114
+ top_k_retriever = st.slider("Retriever Top K", 1, 10, 5)
115
+ top_k_reader = st.slider("Reader Top K", 1, 10, 3)
116
+
117
+ with st.sidebar.expander("Configuración OpenAI"):
118
+ openai_api_key = st.text_input("OpenAI API Key", type="password", placeholder="Copia aquí tu OpenAI API key (no será guardada)",
119
+ help="puedes obtener tu api key de OpenAI en https://platform.openai.com/account/api-keys.")
120
+ openai_api_model = st.text_input("OpenAI API model", value= "text-davinci-003")
121
+ openai_api_temp = st.slider("OpenAI temperature", 0.1, 1.0, 0.5, step=0.1)
122
+ openai_api_max_tokens = st.slider("OpenAI max tokens", 10, 100, 30, step=10)
123
+
124
+ sample_questions = get_samples_for_index(index).splitlines()
125
+ # selected_sample_question = st.selectbox("Algunas preguntas de ejemplo:", sample_questions)
126
+ # if selected_sample_question == "Selecciona una pregunta de ejemplo":
127
+ # selected_sample_question = ""
128
+ query = st.text_area("",placeholder="Escribe aquí tu pregunta y presiona Buscar")
129
+ with st.expander("Algunas preguntas de ejemplo", expanded= False):
130
+ for sample in sample_questions:
131
+ st.markdown(f"- {sample}")
132
+
133
+ search_button = st.button("Buscar")
134
+ if search_button:
135
+ selected_index = get_selected_index_by_title(index)
136
+ if openai_api_key:
137
+ with st.expander("", expanded= True):
138
+ search_and_show_generative_results(query = query,retriever_top_k= top_k_retriever,
139
+ generator_top_k= 1, openai_api_key = openai_api_key,
140
+ openai_model_name = openai_api_model,
141
+ temperature= openai_api_temp,
142
+ max_tokens= openai_api_max_tokens,
143
+ selected_index = selected_index)
144
+ with st.expander("", expanded= True):
145
+ search_and_show_results(query, retriever_top_k=top_k_retriever,
146
+ reader_top_k=top_k_reader,
147
+ selected_index=selected_index)
148
+ else:
149
+ show_about_ask2democracy()
150
+
151
+ if __name__ == "__main__":
152
+ main()
hallazgos.py DELETED
@@ -1,151 +0,0 @@
1
- from random import randint
2
- import streamlit as st
3
-
4
- import streamlit as st
5
- import json
6
- import time
7
- from config import Config
8
- from pinecode_quieries import PinecodeProposalQueries
9
- import logging
10
- logging.basicConfig(format="%(levelname)s - %(name)s - %(message)s", level=logging.WARNING)
11
- logging.getLogger("haystack").setLevel(logging.INFO)
12
-
13
-
14
- def hallazgos_comision_verdad_2022(api_key: str, queries: PinecodeProposalQueries = None):
15
-
16
- # queries = PinecodeProposalQueries (index_name= Config.index_name,
17
- # api_key = Config.es_password,
18
- # environment = Config.pinecone_environment,
19
- # embedding_dim = Config.embedding_dim,
20
- # reader_name_or_path = Config.reader_model_name_or_path,
21
- # use_gpu = Config.use_gpu, OPENAI_key= api_key)
22
- title = """
23
- <h1 style='
24
- text-align: center;
25
- color: #39AA35'>
26
- Ask2Democracy 🇨🇴 - Hallazgos y recomendaciones de la comisión de la verdad
27
- </h1>
28
- <p>
29
- El 28 de junio del 2022, la Comisión de la Verdad en Colombia liberó su informe final. Fue el resultado de más de 3 años de investigación sobre el conflicto armado interno durante los últimos 60 años. Apoyándose en modelos de lenguaje, este espacio pretende ayudar a explorar las más de 6000 páginas que conforman más de 10 libros del Informe, comenzando por el de Hallazgos y recomendaciones.
30
- """
31
- st.markdown(title, unsafe_allow_html=True)
32
- st.markdown("""<div align="right">
33
- Creado por Jorge Henao 🇨🇴 <a href="https://twitter.com/jhenaotw" target='_blank'>Twitter</a> <a href="https://www.linkedin.com/in/henaojorge" target='_blank'/>LinkedIn</a> </div>
34
- """, unsafe_allow_html=True)
35
-
36
- question_samples_str = """¿cantidad de víctimas en la masacre de bojayá?
37
- ¿periodo con más detenciones arbitrarias registradas?
38
- ¿cantidad de víctimas en la masacre de bojayá?
39
- ¿cuantas víctimas de desplazamiento en antioquia?"""
40
-
41
- question_samples = question_samples_str.splitlines()
42
-
43
- def clear_submit():
44
- st.session_state["submit"] = False
45
-
46
- def fake_search(question, retriever_top_k, reader_top_k):
47
- #p1_result = query.search_by_query(query = question, retriever_top_k = retriever_top_k, reader_top_k = reader_top_k, es_index = "informecomisionverdad")
48
- result = []
49
- p = """
50
- La masacre de Bojayá fue perpetrada por el Frente José María Córdoba, de las FARC-EP, al lanzar un cilindro bomba que cayó en una iglesia en la que los pobladores se refugiaban del enfrentamiento de este grupo con el Bloque Élmer Cárdenas de las AUC. Las víctimas fueron 81 personas, 47 de ellas eran niñas, niños y adolescentes
51
- """
52
- for i in range(0, reader_top_k):
53
- result.append([[i+1],"81 personas", p[:250],"Las masacres","Comisión de la verdad - Informe de hallazgos y recomendaciones Junio 2022","5"])
54
-
55
- return result
56
-
57
- def search(question, retriever_top_k, reader_top_k):
58
- filters = {"source_title": "Hallazgos y recomendaciones - 28 de Junio 2022"}
59
- query_result = queries.search_by_query(query = question,
60
- retriever_top_k = retriever_top_k,
61
- reader_top_k = reader_top_k,
62
- filters = filters)
63
- result = []
64
- for i in range(0, len(query_result)):
65
- item = query_result[i]
66
- result.append([[i+1], item.answer.replace("\n",""), item.context[:200],
67
- item.meta['title'], item.meta['source_title'],
68
- int(item.meta['page']), item.meta['source_url']])
69
- #result.append([[i+1], item.answer, item.context[:200], item.meta['title']])
70
- return result
71
-
72
- def search_and_show_results():
73
- # set start time
74
- stt = time.time()
75
- # retrieve top 5 documents
76
- results = search(query, retriever_top_k=5, reader_top_k=3)
77
- # set endtime
78
- ent = time.time()
79
- # measure resulting time
80
- elapsed_time = round(ent - stt, 2)
81
-
82
- # show which query was entered, and what was searching time
83
- st.write(f"**Resultados encontrados de las fuentes** \"{query}\" ({elapsed_time} sec.):")
84
- # then we use loop to show results
85
- for i, answer in enumerate(results):
86
- # answer starts with header
87
- st.subheader(f"{answer[1]}")
88
- # cropped answer
89
- doc = answer[2][:250] + "..."
90
- st.markdown(f"{doc}[**Lee más aquí**]({answer[6]})")
91
- st.caption(f"Fuente: {answer[4]} - Capítulo: {answer[3]} - Página: {answer[5]}")
92
-
93
- st.markdown("---")
94
-
95
- def search_and_generate_answer(question, retriever_top_k, generator_top_k):
96
- filters = {"source_title": "Hallazgos y recomendaciones - 28 de Junio 2022"}
97
- query_result = queries.genenerate_answer_OpenAI(query = question,
98
- retriever_top_k = retriever_top_k,
99
- generator_top_k = generator_top_k,
100
- filters = filters, OPENAI_key = st.session_state.get("OPENAI_API_KEY"))
101
-
102
- result = []
103
- for i in range(0, len(query_result)):
104
- item = query_result[i]
105
- source_title = item.meta['doc_metas'][0]['source_title']
106
- source_url = item.meta['doc_metas'][0]['source_url']
107
- chapter_titles = [source['title'] for source in item.meta['doc_metas']]
108
- result.append([[i+1], item.answer.replace("\n",""),
109
- source_title, source_url, str(chapter_titles)])
110
-
111
- def search_and_show_generative_results():
112
- # set start time
113
- stt = time.time()
114
-
115
- # retrieve top 5 documents
116
- results = search_and_generate_answer(query, retriever_top_k=5, generator_top_k=1)
117
- # set endtime
118
- ent = time.time()
119
- # measure resulting time
120
- elapsed_time = round(ent - stt, 2)
121
-
122
- # show which query was entered, and what was searching time
123
- st.write(f"**Respuesta generada a partir de los resultados** \"{query}\" ({elapsed_time} sec.):")
124
- # then we use loop to show results
125
- if results != None:
126
- for i, answer in enumerate(results):
127
- # answer starts with header
128
- st.subheader(f"{answer[1]}")
129
- st.markdown(f"[**Lee más aquí**]({answer[3]})")
130
- st.caption(f"Fuentes: {answer[2]} - {answer[4]}")
131
-
132
- st.markdown("---")
133
-
134
- #results = search("que es el adres", retriever_top_k=5, reader_top_k=3)
135
-
136
-
137
- st.markdown(f"""<br><p>Cuanto más contexto le des a la pregunta mejores resultados se obtienen.
138
- No es un sistema basado en palabras claves, puedes escribir preguntas elaboradas.
139
- Una serie de modelos de lenguaje transformers intervienen en cada consulta para ayudar a entenderlas.""",
140
- unsafe_allow_html=True)
141
- selected_question = st.selectbox("Aquí algunos ejemplos:", question_samples)
142
- query = st.text_area("Escribe tu pregunta", value = selected_question, on_change=clear_submit)
143
- button = st.button("Buscar")
144
- if button or st.session_state.get("submit"):
145
- if not query:
146
- st.error("¡escribe una pregunta!")
147
- else:
148
- st.session_state["submit"] = True
149
- if api_key:
150
- search_and_show_generative_results()
151
- search_and_show_results()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
main_page.py DELETED
@@ -1,35 +0,0 @@
1
- import streamlit as st
2
- from about import about_ask2democracy
3
- from hallazgos import hallazgos_comision_verdad_2022
4
- from reformas import reforma_salud_febrero_2023
5
- from pinecode_quieries import PinecodeProposalQueries
6
- from config import Config
7
-
8
- # Define the sidebar
9
- api_key = st.sidebar.text_input("OpenAI API Key", type="password",
10
- value=st.session_state.get("OPENAI_API_KEY", ""))
11
- if api_key:
12
- st.session_state["OPENAI_API_KEY"] = api_key
13
-
14
-
15
- # Define the navigation between pages
16
- page_options = {
17
- "About": about_ask2democracy,
18
- "Propuesta: Reforma a la salud febrero de 2023": reforma_salud_febrero_2023,
19
- "Hallazgos de la comisión de la verdad 2022": hallazgos_comision_verdad_2022
20
- }
21
-
22
- # Define the page selector
23
- selected_page = st.sidebar.radio("Selecciona la página que deseas explorar:", list(page_options.keys()))
24
-
25
- queries = PinecodeProposalQueries (index_name= Config.index_name,
26
- api_key = Config.es_password,
27
- environment = Config.pinecone_environment,
28
- embedding_dim = Config.embedding_dim,
29
- reader_name_or_path = Config.reader_model_name_or_path,
30
- use_gpu = Config.use_gpu,
31
- OPENAI_key=api_key)
32
-
33
- # Render the selected page
34
- #print("key: " + api_key)
35
- page_options[selected_page](api_key, queries)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pinecode_quieries.py CHANGED
@@ -85,7 +85,8 @@ class PinecodeProposalQueries(DocumentQueries):
85
  self._initialize_pipeline(index_name, api_key, reader = reader, embedding_dim=
86
  embedding_dim, environment = environment, OPENAI_key= OPENAI_key)
87
  #self.log = Log(es_host= es_host, es_index="log", es_user = es_user, es_password= es_password)
88
-
 
89
  def _initialize_pipeline(self, index_name, api_key, similarity = "cosine",
90
  embedding_dim = 384, reader = None,
91
  environment = "us-east1-gcp",
@@ -129,14 +130,18 @@ class PinecodeProposalQueries(DocumentQueries):
129
  prediction = self.extractive_pipe.run( query = query, params = params, debug = True)
130
  return prediction["answers"]
131
 
132
- def genenerate_answer_OpenAI(self, query : str, retriever_top_k: int, generator_top_k: int, filters = None, OPENAI_key = None):
133
- # if (OPENAI_key != None and OPENAI_key != ""):
134
- # OPENAI_generator = OpenAIAnswerGenerator(api_key=OPENAI_key,
135
- # model="text-davinci-003", temperature=.5, max_tokens=60)
136
- # self.generative_OPENAI_pipe = GenerativeQAPipeline(generator = OPENAI_generator,
137
- # retriever = self.retriever)
138
-
139
- if (self.generative_OPENAI_pipe != None):
 
 
 
 
140
  params = {"Retriever": {"top_k": retriever_top_k,
141
  "filters": filters},
142
  "Generator": {"top_k": generator_top_k}}
 
85
  self._initialize_pipeline(index_name, api_key, reader = reader, embedding_dim=
86
  embedding_dim, environment = environment, OPENAI_key= OPENAI_key)
87
  #self.log = Log(es_host= es_host, es_index="log", es_user = es_user, es_password= es_password)
88
+ self.OpenAI_api_key = None
89
+
90
  def _initialize_pipeline(self, index_name, api_key, similarity = "cosine",
91
  embedding_dim = 384, reader = None,
92
  environment = "us-east1-gcp",
 
130
  prediction = self.extractive_pipe.run( query = query, params = params, debug = True)
131
  return prediction["answers"]
132
 
133
+ def __initialize_openAIGEnerator(self, OPENAI_key, openai_model_name= "text-davinci-003", temperature = .5, max_tokens = 30):
134
+ if OPENAI_key != self.OpenAI_api_key:
135
+ OPENAI_generator = OpenAIAnswerGenerator(api_key=OPENAI_key,
136
+ model=openai_model_name, temperature= temperature, max_tokens=max_tokens)
137
+ self.generative_OPENAI_pipe = GenerativeQAPipeline(generator = OPENAI_generator,
138
+ retriever = self.retriever)
139
+ self.OpenAI_api_key = OPENAI_key
140
+
141
+ def genenerate_answer_OpenAI(self, query : str, retriever_top_k: int, generator_top_k: int, filters = None,
142
+ OPENAI_key = None, openai_model_name= "text-davinci-003",temperature = .5, max_tokens = 30):
143
+ if OPENAI_key != self.OpenAI_api_key:
144
+ self.__initialize_openAIGEnerator(OPENAI_key, openai_model_name, temperature, max_tokens)
145
  params = {"Retriever": {"top_k": retriever_top_k,
146
  "filters": filters},
147
  "Generator": {"top_k": generator_top_k}}
reformas.py DELETED
@@ -1,170 +0,0 @@
1
- from random import randint
2
- import streamlit as st
3
-
4
- import streamlit as st
5
- import json
6
- import time
7
- from config import Config
8
- from pinecode_quieries import PinecodeProposalQueries
9
- import logging
10
- logging.basicConfig(format="%(levelname)s - %(name)s - %(message)s", level=logging.WARNING)
11
- logging.getLogger("haystack").setLevel(logging.INFO)
12
-
13
- def reforma_salud_febrero_2023(api_key: str, queries: PinecodeProposalQueries = None):
14
-
15
- title = """
16
- <h1 style='
17
- text-align: center;
18
- color: #39AA35'>
19
- Ask2Democracy 🇨🇴 - Propuesta reforma a la salud 2023
20
- </h1>
21
- """
22
- st.markdown(title, unsafe_allow_html=True)
23
- st.markdown("""<div align="right">
24
- Creado por Jorge Henao 🇨🇴 <a href="https://twitter.com/jhenaotw" target='_blank'>Twitter</a> <a href="https://www.linkedin.com/in/henaojorge" target='_blank'/>LinkedIn</a> </div>
25
- """, unsafe_allow_html=True)
26
-
27
- question_samples_str = """¿Que es el ADRES?
28
- ¿Cuándo se implementará el Sistema de Salud?
29
- ¿Cómo se implementará el Sistema de Salud?
30
- ¿Qué es principio de interpretación y fundamento de la transición en relación al Sistema de Salud?
31
- ¿Qué se garantiza la atención en todo momento con el nuevo Sistema de Salud?
32
- ¿Qué son los Centros de Atención Primaria Integrales y Resolutivos en Salud - CAPIRS?
33
- ¿Qué se garantiza durante el periodo de transición del nuevo Sistema de Salud?
34
- ¿Puede haber personas sin protección de su salud durante el periodo de transición?
35
- ¿Cuál es el derecho fundamental que se garantiza en todo momento durante la transición del nuevo Sistema de Salud?
36
- ¿Qué se debe realizar para garantizar la gestión de los recursos en el nivel nacional y desconcentrado?
37
- ¿Cómo se regirá el régimen de contratación de los contratos mencionados en el texto?
38
- ¿Qué son las cláusulas exorbitantes previstas en el estatuto General de Contratación de la administración pública?
39
- ¿Qué principios deben atender los contratos mencionados en el texto?
40
- ¿Cuál es el ámbito de aplicación de los contratos mencionados en el texto?
41
- ¿Quién tiene la responsabilidad de realizar la auditoría de las cuentas en relación a estos contratos?
42
- ¿Cuáles son las características que deben cumplir los contratos mencionados en el texto?
43
- ¿Qué se entiende por "coordinación" en el contexto de los contratos mencionados en el texto?
44
- ¿Qué objetivo se busca con los contratos mencionados en el texto?
45
- ¿Quién será el encargado de contratar los servicios de salud y otros requerimientos para el cumplimiento de su labor en el nivel regional?
46
- ¿Qué tipo de instituciones hospitalarias y ambulatorias se integran a la red de servicios del territorio?
47
- ¿Qué tarifas deben seguir las instituciones hospitalarias y ambulatorias para la prestación de servicios de salud?
48
- ¿Qué busca modular el régimen de tarifas y formas de pago para la prestación de servicios de salud?
49
- ¿Qué tipo de registro llevará el Fondo Regional de Salud?
50
- ¿Cuáles son algunas de las variables que se incluirán en el registro de cada servicio prestado y pagado?"""
51
-
52
- question_samples = question_samples_str.splitlines()
53
-
54
- def clear_submit():
55
- st.session_state["submit"] = False
56
-
57
- def fake_search(question, retriever_top_k, reader_top_k):
58
- #p1_result = query.search_by_query(query = question, retriever_top_k = retriever_top_k, reader_top_k = reader_top_k, es_index = "informecomisionverdad")
59
- result = []
60
- p = """
61
- La masacre de Bojayá fue perpetrada por el Frente José María Córdoba, de las FARC-EP, al lanzar un cilindro bomba que cayó en una iglesia en la que los pobladores se refugiaban del enfrentamiento de este grupo con el Bloque Élmer Cárdenas de las AUC. Las víctimas fueron 81 personas, 47 de ellas eran niñas, niños y adolescentes
62
- """
63
- for i in range(0, reader_top_k):
64
- result.append([[i+1],"81 personas", p[:250],"Las masacres","Comisión de la verdad - Informe de hallazgos y recomendaciones Junio 2022","5"])
65
-
66
- return result
67
-
68
- def search(question, retriever_top_k, reader_top_k):
69
- filters = {"source_title": "Reforma de la salud 13 Febrero 2023"}
70
-
71
- query_result = queries.search_by_query(query = question,
72
- retriever_top_k = retriever_top_k,
73
- reader_top_k = reader_top_k,
74
- filters = filters)
75
- result = []
76
- for i in range(0, len(query_result)):
77
- item = query_result[i]
78
- result.append([[i+1], item.answer.replace("\n",""), item.context[:200],
79
- item.meta['title'], item.meta['source_title'],
80
- int(item.meta['page']), item.meta['source_url']])
81
- #result.append([[i+1], item.answer, item.context[:200], item.meta['title']])
82
- return result
83
-
84
- def search_and_show_results():
85
- # set start time
86
- stt = time.time()
87
- # retrieve top 5 documents
88
- results = search(query, retriever_top_k=5, reader_top_k=3)
89
- # set endtime
90
- ent = time.time()
91
- # measure resulting time
92
- elapsed_time = round(ent - stt, 2)
93
-
94
- # show which query was entered, and what was searching time
95
- st.write(f"**Resultados encontrados de las fuentes** \"{query}\" ({elapsed_time} sec.):")
96
- # then we use loop to show results
97
- for i, answer in enumerate(results):
98
- # answer starts with header
99
- st.subheader(f"{answer[1]}")
100
- # cropped answer
101
- doc = answer[2][:250] + "..."
102
- st.markdown(f"{doc}[**Lee más aquí**]({answer[6]})")
103
- st.caption(f"Fuente: {answer[4]} - Artículo: {answer[3]} - Página: {answer[5]}")
104
-
105
- #st.markdown("---")
106
-
107
- def search_and_generate_answer(question, retriever_top_k, generator_top_k):
108
- filters = {"source_title": "Reforma de la salud 13 Febrero 2023"}
109
-
110
- query_result = queries.genenerate_answer_OpenAI(query = question,
111
- retriever_top_k = retriever_top_k,
112
- generator_top_k = generator_top_k,
113
- filters = filters)
114
-
115
- result = []
116
- for i in range(0, len(query_result)):
117
- item = query_result[i]
118
- source_title = item.meta['doc_metas'][0]['source_title']
119
- source_url = item.meta['doc_metas'][0]['source_url']
120
- chapter_titles = [source['title'] for source in item.meta['doc_metas']]
121
- result.append([[i+1], item.answer.replace("\n",""),
122
- source_title, source_url, str(chapter_titles)])
123
- return result
124
-
125
- def search_and_show_generative_results():
126
- # set start time
127
- stt = time.time()
128
-
129
- # retrieve top 5 documents
130
- results = search_and_generate_answer(query, retriever_top_k=5, generator_top_k=1)
131
- # set endtime
132
- ent = time.time()
133
- # measure resulting time
134
- elapsed_time = round(ent - stt, 2)
135
-
136
- # show which query was entered, and what was searching time
137
- st.write(f"**Respuesta generada a partir de los resultados** \"{query}\" ({elapsed_time} sec.):")
138
- if results != None:
139
- for i, answer in enumerate(results):
140
- # answer starts with header
141
- st.subheader(f"{answer[1]}")
142
- st.markdown(f"[**Lee más aquí**]({answer[3]})")
143
- st.caption(f"Fuentes: {answer[2]} - {answer[4]}")
144
-
145
- st.markdown("---")
146
-
147
- #st.markdown("---")
148
-
149
- #results = search("que es el adres", retriever_top_k=5, reader_top_k=3)
150
-
151
- st.write(f"""<br><p>Cuanto más contexto le des a la pregunta mejores resultados se obtienen.
152
- No es un sistema basado en palabras claves, puedes escribir preguntas elaboradas.
153
- Una serie de modelos de lenguaje transformers intervienen en cada consulta para ayudar a entenderlas."""
154
- ,unsafe_allow_html=True)
155
- selected_question = st.selectbox("Aquí algunos ejemplos:", question_samples)
156
- query = st.text_area("Escribe tu pregunta", value = selected_question, on_change=clear_submit)
157
- button = st.button("Buscar")
158
- if button or st.session_state.get("submit"):
159
- if not query:
160
- st.error("¡escribe una pregunta!")
161
- else:
162
- st.session_state["submit"] = True
163
- #if not st.session_state.get("OPENAI_API_KEY"):
164
- if api_key:
165
- search_and_show_generative_results()
166
- search_and_show_results()
167
-
168
- #r = search_and_generate_answer("que es el ADRES?", retriever_top_k = 5, generator_top_k = 1)
169
-
170
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
samples.py ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ samples_reforma_salud = """Selecciona una pregunta de ejemplo
3
+ ¿Que es el ADRES?
4
+ ¿Cuándo se implementará el Sistema de Salud?
5
+ ¿Cómo se implementará el Sistema de Salud?
6
+ ¿Qué es principio de interpretación y fundamento de la transición en relación al Sistema de Salud?
7
+ ¿Qué se garantiza la atención en todo momento con el nuevo Sistema de Salud?
8
+ ¿Qué son los Centros de Atención Primaria Integrales y Resolutivos en Salud - CAPIRS?
9
+ ¿Qué se garantiza durante el periodo de transición del nuevo Sistema de Salud?
10
+ ¿Puede haber personas sin protección de su salud durante el periodo de transición?
11
+ ¿Cuál es el derecho fundamental que se garantiza en todo momento durante la transición del nuevo Sistema de Salud?
12
+ ¿Qué se debe realizar para garantizar la gestión de los recursos en el nivel nacional y desconcentrado?
13
+ ¿Cómo se regirá el régimen de contratación de los contratos mencionados en el texto?
14
+ ¿Qué son las cláusulas exorbitantes previstas en el estatuto General de Contratación de la administración pública?
15
+ ¿Qué principios deben atender los contratos mencionados en el texto?
16
+ ¿Cuál es el ámbito de aplicación de los contratos mencionados en el texto?
17
+ ¿Quién tiene la responsabilidad de realizar la auditoría de las cuentas en relación a estos contratos?
18
+ ¿Cuáles son las características que deben cumplir los contratos mencionados en el texto?
19
+ ¿Qué se entiende por "coordinación" en el contexto de los contratos mencionados en el texto?
20
+ ¿Qué objetivo se busca con los contratos mencionados en el texto?
21
+ ¿Quién será el encargado de contratar los servicios de salud y otros requerimientos para el cumplimiento de su labor en el nivel regional?
22
+ ¿Qué tipo de instituciones hospitalarias y ambulatorias se integran a la red de servicios del territorio?
23
+ ¿Qué tarifas deben seguir las instituciones hospitalarias y ambulatorias para la prestación de servicios de salud?
24
+ ¿Qué busca modular el régimen de tarifas y formas de pago para la prestación de servicios de salud?
25
+ ¿Qué tipo de registro llevará el Fondo Regional de Salud?
26
+ ¿Cuáles son algunas de las variables que se incluirán en el registro de cada servicio prestado y pagado?"""
27
+
28
+ samples_hallazgos_paz = """Selecciona una pregunta de ejemplo
29
+ ¿cantidad de víctimas en la masacre de bojayá?
30
+ ¿periodo con más detenciones arbitrarias registradas?
31
+ ¿cantidad de víctimas en la masacre de bojayá?
32
+ ¿cuantas víctimas de desplazamiento en antioquia?"""