featt: database complete

This commit is contained in:
Mario Gil 2024-10-14 12:08:01 -05:00
parent a1858f5106
commit 522d8cad8c
2 changed files with 218 additions and 17 deletions

20
databases.py Normal file
View File

@ -0,0 +1,20 @@
from pydal import DAL, Field
db = DAL(uri="sqlite://storage.db",
pool_size=0,
folder="databases",
migrate_enabled=True,
migrate=True)
db.define_table(
"datacoll",
Field("user"),
Field("collection"),
Field("totalchr",type="integer",default=0),
Field('last_modified', 'datetime'),
Field("summary",type="text"),
Field("tematic",type="text"),
Field("issues",type="text"),
Field("question",type="text")
)
db.commit()

215
main.py
View File

@ -25,6 +25,10 @@ from groq import Groq
from fastapi import File as FileFast from fastapi import File as FileFast
from fastapi import UploadFile as UploadFileFast from fastapi import UploadFile as UploadFileFast
from fastapi import Form as FormFast from fastapi import Form as FormFast
from anthropic import Anthropic, HUMAN_PROMPT, AI_PROMPT
from databases import db
maxletters=30000
maxtokens=int(maxletters/4)
#import shutil #import shutil
pwd = os.getcwd() pwd = os.getcwd()
def extractConfig(nameModel="SystemData",relPath=os.path.join(pwd,"conf/experiment_config.json"),dataOut="keyantrophics"): def extractConfig(nameModel="SystemData",relPath=os.path.join(pwd,"conf/experiment_config.json"),dataOut="keyantrophics"):
@ -33,7 +37,7 @@ def extractConfig(nameModel="SystemData",relPath=os.path.join(pwd,"conf/experime
config = json.load(file)[nameModel] config = json.load(file)[nameModel]
Output= config[dataOut] Output= config[dataOut]
return Output return Output
keyanthropic=extractConfig(nameModel="SystemData",dataOut="keyantrophics")
keygroq=extractConfig(nameModel="SystemData",dataOut="keygroq") keygroq=extractConfig(nameModel="SystemData",dataOut="keygroq")
client = Groq(api_key=keygroq) client = Groq(api_key=keygroq)
@ -161,6 +165,8 @@ def listmodelactives():
@app.post("/loadCollection") @app.post("/loadCollection")
def loadCollection(data:str): def loadCollection(data:str):
global index global index
global collectionloaded
collectionloaded=data
index=create_or_load_db(path="static/"+userdata+"/chroma_db",collection=data,modelT=model_emb) index=create_or_load_db(path="static/"+userdata+"/chroma_db",collection=data,modelT=model_emb)
return P("El usuario %s colleccion %s"%(userdata,data)) return P("El usuario %s colleccion %s"%(userdata,data))
@ -323,6 +329,183 @@ def SummaryMake(data:str,query:str):
print("p4") print("p4")
return P(response) return P(response)
def getTextCustom(system="",content="",max_tokens=maxtokens,model="claude-3-5-sonnet-20240620"):
t=time.time()
client = Anthropic(api_key=keyanthropic)
message=[{"role": "user", "content":content},{"role": "assistant", "content":""} ]
if system!="":
completionv2 = client.messages.create(
model=model,
system=system,
max_tokens=max_tokens,
messages=message,
)
else:
completionv2 = client.messages.create(
model=model,
max_tokens=max_tokens,
messages=message,
)
return {"content":completionv2.content[0].text,"time":time.time()-t}
def processAllDocs(docs,type="summary"):
summary_prompt = """Por favor, genera un resumen completo y detallado del material dado.
Incluye los principales temas, argumentos y conclusiones.
Estructura el resumen de manera coherente y organizada.
Texto a resumir:
%s
"""
tematic_prompt =""" Por favor, genera un texto donde se menciones la tematica que trata el material dado.
Incluye una tematica general y un indice por temas tratados
Estructura el texto de manera coherente y organizada.
Texto a usar:
%s
"""
issues_prompt ="""Por favor, genera un texto donde se menciones tomando en cuenta el material y el contenido de manera detallada que mejoras podrias realizar al material incluyendo nuevos datos o corrigiendo la informacion proporcionada
Esta mejora hazla pensado paso a paso y de manera muy cuidadosa, tienes que dar ejemplos del materiar o referenciar directamante el texto a mejorar mencioando la causa de la mejora
Estructura el texto de manera coherente y organizada.
Texto a usar:
%s
"""
question_prompt ="""Por favor, genera un texto donde indiques preguntas sobre el material que cuando sean respondidas capturen el punto central y puntos importantes del texto
Estas preguntas hazla pensado paso a paso y de manera muy cuidadosa.
Estructura el texto de manera coherente y organizada.
Texto a usar:
%s
"""
temp=""
AllChunks=[]
AllOut=[]
for doc in docs:
temp=temp+doc.get_text()
if len(temp)>maxtokens:
AllChunks.append(temp)
if type=="summary":
procesedInfo=getTextCustom(content= summary_prompt%temp)
elif type=="tematic":
procesedInfo=getTextCustom(content= tematic_prompt%temp)
elif type=="issues":
procesedInfo=getTextCustom(content= issues_prompt%temp)
elif type=="question":
procesedInfo=getTextCustom(content= question_prompt%temp)
AllOut.append(procesedInfo)
temp=""
if temp!="":
AllChunks.append(temp)
if type=="summary":
procesedInfo=getTextCustom(content= summary_prompt%temp)
elif type=="tematic":
procesedInfo=getTextCustom(content= tematic_prompt%temp)
elif type=="issues":
procesedInfo=getTextCustom(content= issues_prompt%temp)
elif type=="question":
procesedInfo=getTextCustom(content= question_prompt%temp)
AllOut.append(procesedInfo)
temp=""
return AllOut
def reduceDocs(AllOut,type="summary"):
if len(AllOut)==1:
return AllOut[0]["content"]
if len(AllOut)==0:
return "Hay un problema en este campo"
summary_prompt = """Por favor, de los siguientes resumenes genera un resumen general
Incluye los principales temas, argumentos y conclusiones.
Estructura el resumen de manera coherente y organizada.
Textos a resumir:
%s
"""
tematic_prompt =""" Por favor, de los siguientes textos genera un texto general sobre la tematica.
Incluye una tematica general y un indice por temas tratados
Estructura el texto de manera coherente y organizada.
Textos a usar:
%s
"""
issues_prompt ="""Por favor, genera un texto donde se incluyan todas las mejoras o correcciones presentadas
Estas mejoras hazla pensado paso a paso y de manera muy cuidadosasi hay ejemplos incluyelos o referenciar directamante el texto a mejorar mencioando la causa de la mejora
Estructura el texto de manera coherente y organizada.
Textos a usar:
%s
"""
question_prompt ="""Por favor, genera un texto donde indiques preguntas sobre el material que cuando sean respondidas capturen el punto central y puntos importantes del texto
Estas preguntas hazla pensado paso a paso y de manera muy cuidadosa.
Estructura el texto de manera coherente y organizada.
Texto a usar:
%s
"""
sep="""________________________________________________
"""
temp=""
Allreduce=[]
if len(AllOut)>1:
for reduce in AllOut:
temp=temp+reduce+sep
if len(temp)>maxtokens:
if type=="summary":
procesedInfo=getTextCustom(content= summary_prompt%temp)
elif type=="tematic":
procesedInfo=getTextCustom(content= tematic_prompt%temp)
elif type=="issues":
procesedInfo=getTextCustom(content= issues_prompt%temp)
elif type=="question":
procesedInfo=getTextCustom(content= question_prompt%temp)
Allreduce.append(procesedInfo)
temp=""
if temp!="":
if type=="summary":
procesedInfo=getTextCustom(content= summary_prompt%temp)
elif type=="tematic":
procesedInfo=getTextCustom(content= tematic_prompt%temp)
elif type=="issues":
procesedInfo=getTextCustom(content= issues_prompt%temp)
elif type=="question":
procesedInfo=getTextCustom(content= question_prompt%temp)
Allreduce.append(procesedInfo)
temp=""
print(Allreduce)
# while len(Allreduce)>1:
# print(Allreduce)
# Allreduce=reduceDocs(Allreduce)
# print("P2",Allreduce)
# if len(Allreduce)==1:
# return Allreduce
def savedb(docs,userdata,collection):
Output={}
for procs in ["summary","tematic","issues","question"]:
AllOut=processAllDocs(docs,type=procs)
Allreduce=reduceDocs(AllOut,type=procs)
Output[procs]=Allreduce
if db((db.datacoll.user == userdata)&(db.datacoll.collection == collection)).count()==0:
Output["user"] = userdata
Output["collection"] = collection
db.datacoll.insert(**Output)
db.commit()
else:
db((db.datacoll.user == userdata)&(db.datacoll.collection == collection)).update(**Output)
db.commit()
@app.get("/showdata")
def showData():
userdata,collectionloaded
rows=db((db.datacoll.user == userdata)&(db.datacoll.collection == collectionloaded)).select()
first_row = rows.first()
return P(first_row.summary),P(first_row.tematic),P(first_row.issues),P(first_row.question)
@app.post("/createCollection") @app.post("/createCollection")
@ -332,19 +515,22 @@ def createCollection(data:str,collection:str):
input_dir=data input_dir=data
).load_data() ).load_data()
print("Process Documents") print("Process Documents")
savedb(docs,userdata,collection)
Nodes=post_process_documents(docs) Nodes=post_process_documents(docs)
print("create DB") print("create DB")
class MyThread(threading.Thread):
def run(self):
print("Hilo")
create_or_load_db(path="static/"+data.split("/")[1]+"/chroma_db",collection=collection,Nodes=Nodes,modelT=model_emb)
# create and start the thread # class MyThread(threading.Thread):
global t # def run(self):
t = MyThread() # print("Hilo")
t.start() # create_or_load_db(path="static/"+data.split("/")[1]+"/chroma_db",collection=collection,Nodes=Nodes,modelT=model_emb)
global t_time
t_time=time.time() # # create and start the thread
# global t
# t = MyThread()
# t.start()
# global t_time
# t_time=time.time()
return Div("Iniciando carga de datos") return Div("Iniciando carga de datos")
@app.get("/is_busy") @app.get("/is_busy")
@ -384,12 +570,7 @@ def home():
,id="questions"), ,id="questions"),
cls="col-xs-6"), cls="col-xs-6"),
Div(H3("Este genera información general del material, pero es intensivo en uso del api, aunque ahora esta restingido a solo 5 solicitudes el objeitvo original era enviar todo el material."), Div(H3("Este genera información general del material, pero es intensivo en uso del api, aunque ahora esta restingido a solo 5 solicitudes el objeitvo original era enviar todo el material."),
Div( Div(hx_target="this",hx_swap="innerHTML",hx_get="/showdata",hx_trigger="every 60000ms",id="query"),
Form(
Input(id="query", name="question", placeholder="Dar una pregunta"),
Button("Submit",type="submit"), hx_post="/queryprompt",hx_swap="innerHTML",hx_target="#queryR" ),
Div(id="queryR"),
id="query"),
id="chatbot",cls="col-xs-6"), id="chatbot",cls="col-xs-6"),
cls="row", style="color: #fff;") cls="row", style="color: #fff;")
)) ))