Spaces:
Runtime error
Runtime error
Jorge Henao
commited on
Commit
•
62a36e2
1
Parent(s):
d9a4c48
ui refactor
Browse files- .vscode/launch.json +1 -1
- about.py +13 -13
- app.py +152 -0
- hallazgos.py +0 -151
- main_page.py +0 -35
- pinecode_quieries.py +14 -9
- reformas.py +0 -170
- 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 |
-
"
|
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
|
5 |
-
|
6 |
-
<
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
<
|
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
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
|
|
|
|
|
|
|
|
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?"""
|