File size: 6,150 Bytes
64023bd
 
b74485d
 
 
 
 
64023bd
b74485d
 
64023bd
b74485d
 
64023bd
b74485d
 
64023bd
b74485d
 
 
 
 
 
 
 
 
 
1bf817a
b74485d
 
1bf817a
b74485d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64023bd
 
 
 
 
 
b74485d
64023bd
 
b74485d
 
67e954e
b74485d
64023bd
 
 
 
b74485d
64023bd
b74485d
 
 
 
 
64023bd
 
b74485d
64023bd
 
 
5626e7e
 
 
 
f77c4ab
5626e7e
 
f77c4ab
5626e7e
7e9c679
 
 
 
 
 
5626e7e
65c96ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25d40ba
 
 
 
 
5626e7e
b74485d
64023bd
 
b74485d
64023bd
 
 
 
 
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import gradio as gr
from huggingface_hub import InferenceClient
import chromadb
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
import os
from openai import OpenAI

# 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
chroma_client = chromadb.PersistentClient(path="chroma_db")  # Ajusta la ruta seg煤n tu entorno

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

# Crear un retriever
retriever = vectorstore.as_retriever()

# Funci贸n para obtener extractos relevantes
def obtener_extractos(pregunta):
    docs_relevantes = retriever.invoke(pregunta)
    return [(doc.page_content, doc.metadata.get("url", "URL no disponible")) for doc in docs_relevantes]

def respond(message, history: list[tuple[str, str]], system_message, max_tokens, temperature, top_p):
    """Genera una respuesta basada en el historial y documentos relevantes."""

    # Obtener documentos relevantes desde ChromaDB
    contexto = obtener_extractos(message)

    # Construir el mensaje del sistema con el contexto directamente incluido
    system_message_final = f"""{system_message}

    Informaci贸n relevante extra铆da de los documentos, en caso de que estos documentos tenga la informacion que necesitas, no olvides tomar
    el historial de conversacion con el usuario:
    {contexto}
    """

    messages = [{"role": "system", "content": system_message_final}]

    # Agregar historial del chat
    for val in history:
        if val[0]:
            messages.append({"role": "user", "content": val[0]})
        if val[1]:
            messages.append({"role": "assistant", "content": val[1]})

    # Agregar la nueva pregunta del usuario
    messages.append({"role": "user", "content": message})

    # Llamar a la API de OpenAI con streaming
    stream = client.chat.completions.create(
        model="gpt-4.1",
        messages=messages,
        max_tokens=max_tokens,
        stream=True,
        temperature=temperature,
        top_p=top_p,
    )

    response = ""
    for chunk in stream:
        if chunk.choices and chunk.choices[0].delta.content:
            response += chunk.choices[0].delta.content
            yield response


# Configuraci贸n de la interfaz Gradio
demo = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Textbox(value=f'''Eres un asistente virtual especializado en atenci贸n al cliente para la empresa Wisphub. Tu objetivo es ayudar a los clientes a resolver 煤nicamente sus dudas relacionados con la plataforma Wisphub.
                              Todas tus respuestas pueden basarse exclusivamente en la informaci贸n proporcionada.
                              En caso de que la pregunta no concuerde con la informaci贸n del contexto puedes ignorarlo.

                              -Agrega en tus respuestas una imagen y el url del manual relacionada a lo que pregunto el usuario, para ello usaras los urls que contiene el manual de usuario, muestra la imagen usando la sintaxis de Markdown sin bloque de c贸digo.

                                ![Descripci贸n de la imagen](URL_de_la_imagen)
                              - Esta orden podr谩s ignorarla en caso de que la informacion que se te proporcione no tenga im谩genes que se le relacionen.

                              Para que speas acerca de wipshub puede usar lo siguiente:
                                WispHub fue fundado a partir de la necesidad de contar con un sistema de gesti贸n de clientes en la nube que pudiese interactuar con los equipos Mikrotik de forma transparente, y al mismo tiempo, llevar la administraci贸n de las empresas en temas de finanzas, notificaciones, inventario y base de datos de clientes.
                                
                                Es un sistema de administraci贸n para WISP e ISP, el cual NO requiere de un de un hardware adicional.
                                
                                WispHub se integra de una forma TRANSPARENTE por medio de la API del Mikrotik.

                                Ventas y Reporte de Pagos
                                ventas@wisphub.net
                                
                                Call Center: +52 998 387 1200
                                
                                +52 998 705 4057
                                
                                 Horarios de Atenci贸n
                                Lunes a Viernes de 9:00 a 18:00
                                
                                S谩bados de 9:00 a 14:00
                                
                                 Soporte ?
                                wisphub@gmail.com
                                
                                Call Center: +52 998 387 1200
                                
                                +52 998 399 1521

                              En caso de que el usuario pregunte acerca del costo de WipsHub, relacionalo con el precio de las licencias de WipsHub.  

                              Si tampoco encuentras informaci贸n relevante, indica que no puedes proporcionar detalles adicionales y sugiere al usuario contactar con el soporte t茅cnico oficial de Wisphub.
                              Proporciona el numero y pagina de contacto de Wipshub.

                              - Aseg煤rate de que tus respuestas sean claras y f谩ciles de entender para usuarios sin conocimientos t茅cnicos.''', 
                    label="System message"),
        gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"),
    ],
)

if __name__ == "__main__":
    demo.launch()