File size: 2,540 Bytes
37d659a
 
39555a8
 
 
 
 
5cfb454
39555a8
37d659a
 
39555a8
 
 
 
 
e87fdaa
39555a8
 
66c2122
39555a8
 
 
 
 
 
 
 
 
 
 
37d659a
39555a8
 
 
 
37d659a
 
 
 
 
 
 
39555a8
37d659a
 
 
 
39555a8
37d659a
39555a8
 
37d659a
39555a8
 
 
 
 
ca4c4fc
37d659a
39555a8
303a992
39555a8
 
 
 
 
 
37d659a
 
 
39555a8
 
 
37d659a
39555a8
 
37d659a
39555a8
37d659a
a17773a
37d659a
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import chromadb
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
import os
from openai import OpenAI
import zipfile

# Inicializar FastAPI
app = FastAPI()

# Configurar la API Key de OpenAI
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# Inicializar el cliente de OpenAI
client = OpenAI(api_key=OPENAI_API_KEY)

# Inicializar el cliente de ChromaDB en Hugging Face Space
chroma_client = chromadb.PersistentClient(path="chroma_db")

# Cargar la base de datos de Chroma como un vector store
vectorstore = Chroma(
    client=chroma_client,
    collection_name="docs",
    embedding_function=OpenAIEmbeddings(model="text-embedding-3-small", openai_api_key=OPENAI_API_KEY)
)

# Crear un retriever
retriever = vectorstore.as_retriever()

def obtener_extractos(pregunta: str):
    """Obtiene documentos relevantes desde ChromaDB"""
    docs_relevantes = retriever.invoke(pregunta)
    return [(doc.page_content, doc.metadata.get("url", "URL no disponible")) for doc in docs_relevantes]

# Modelo de datos para la solicitud
class ChatRequest(BaseModel):
    message: str
    system_message: str = "Eres un asistente virtual."
    max_tokens: int = 512
    temperature: float = 0.7
    top_p: float = 0.95

@app.post("/chat")
async def chat(request: ChatRequest):
    """Endpoint para generar respuestas usando OpenAI y ChromaDB"""
    
    # Obtener documentos relevantes
    contexto = obtener_extractos(request.message)

    # Construir el mensaje del sistema con el contexto
    system_message_final = f"""{request.system_message}
    Información relevante extraída de los documentos:
    {contexto}
    """

    messages = [
        {"role": "system", "content": system_message_final},
        {"role": "user", "content": request.message}
    ]
    print(messages)

    try:
        # Llamar a la API de OpenAI
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=messages,
            max_tokens=request.max_tokens,
            temperature=request.temperature,
            top_p=request.top_p
        )

        completion = response.choices[0].message.content
        return {"response": completion, "context": contexto}

    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# Punto de entrada para ejecutar con Uvicorn en Hugging Face
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=7860)