Daniel00611 commited on
Commit
39555a8
verified
1 Parent(s): 83f21a3

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +78 -0
app.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+ import chromadb
3
+ from langchain_community.vectorstores import Chroma
4
+ from langchain_openai import OpenAIEmbeddings
5
+ import os
6
+ from openai import OpenAI
7
+
8
+ app = Flask(__name__)
9
+
10
+ # Configurar la API Key de OpenAI
11
+ OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
12
+
13
+ # Inicializar el cliente de OpenAI
14
+ client = OpenAI(api_key=OPENAI_API_KEY)
15
+
16
+ # Inicializar el cliente de ChromaDB en Hugging Face Space
17
+ chroma_client = chromadb.PersistentClient(path="/app/chroma_db") # Usa la ruta dentro del contenedor
18
+
19
+ # Cargar la base de datos de Chroma como un vector store
20
+ vectorstore = Chroma(
21
+ client=chroma_client,
22
+ collection_name="docs",
23
+ embedding_function=OpenAIEmbeddings(model="text-embedding-3-small", openai_api_key=OPENAI_API_KEY)
24
+ )
25
+
26
+ # Crear un retriever
27
+ retriever = vectorstore.as_retriever()
28
+
29
+ def obtener_extractos(pregunta):
30
+ """Obtiene documentos relevantes desde ChromaDB"""
31
+ docs_relevantes = retriever.invoke(pregunta)
32
+ return [(doc.page_content, doc.metadata.get("url", "URL no disponible")) for doc in docs_relevantes]
33
+
34
+ @app.route('/chat', methods=['POST'])
35
+ def chat():
36
+ """Endpoint para generar respuestas usando OpenAI y ChromaDB"""
37
+ data = request.json
38
+ message = data.get("message", "")
39
+ system_message = data.get("system_message", "Eres un asistente virtual.")
40
+ max_tokens = data.get("max_tokens", 512)
41
+ temperature = data.get("temperature", 0.7)
42
+ top_p = data.get("top_p", 0.95)
43
+
44
+ if not message:
45
+ return jsonify({"error": "El campo 'message' es obligatorio."}), 400
46
+
47
+ # Obtener documentos relevantes
48
+ contexto = obtener_extractos(message)
49
+
50
+ # Construir el mensaje del sistema con el contexto
51
+ system_message_final = f"""{system_message}
52
+ Informaci贸n relevante extra铆da de los documentos:
53
+ {contexto}
54
+ """
55
+
56
+ messages = [
57
+ {"role": "system", "content": system_message_final},
58
+ {"role": "user", "content": message}
59
+ ]
60
+
61
+ try:
62
+ # Llamar a la API de OpenAI
63
+ response = client.chat.completions.create(
64
+ model="gpt-4o-mini",
65
+ messages=messages,
66
+ max_tokens=max_tokens,
67
+ temperature=temperature,
68
+ top_p=top_p
69
+ )
70
+
71
+ completion = response.choices[0].message.content
72
+ return jsonify({"response": completion, "context": contexto})
73
+
74
+ except Exception as e:
75
+ return jsonify({"error": str(e)}), 500
76
+
77
+ if __name__ == '__main__':
78
+ app.run(host="0.0.0.0", port=7860)