logo

Embeddings OpenAi - Parte2

He continuado estudiando OpenAI para entender los embeddings. He conseguido diseñar un chatbot un poco rudimientario pero me ha servido para enteder un poco más Python, y las lagunas que tengo en este lenguaje. Debo documentarme sobre las librerias Pandas, Numpy y Gradio, que agilizan mucho el desarrollo con este tipo de LLMs. El objetivo es familiarizarse con este tipo de herramientas que van a ser el pan de cada día de muchos desarrolladores. Los que venimos de PHP lo encontramos bastante acogedor. A continuación comparto las partes más interesantes del código:

def embed_text(path='chatbot_qa.csv'):
    conocimiento_df = pd.read_csv(path)

    conocimiento_df['Embedding'] = conocimiento_df['texto'].apply(lambda x:get_embedding(x))
    conocimiento_df.to_csv('embeddings.csv')

    return conocimiento_df

La función anterior permite leer de golpe un fichero csv y por cada tupla o registro realizar un embedding correspondiente. Mención, a la manera de crear columnas en ficheros, que difiere un poco de PHP. Nota interesante: apply método de la libreria Pandas y función lambda.

def buscar(busqueda,datos, n_resultados = 5):
    busqueda_embed = get_embedding(busqueda)
    datos['Similitud'] = datos['Embedding'].apply(lambda x: cosine_similarity(x,busqueda_embed))
    datos = datos.sort_values('Similitud',ascending=False)

    return datos.iloc[:n_resultados][['texto','Similitud','Embedding']]

La función anterior, busca sobre un DataFrame y aplica cosine_similarity para buscar relación entre los vectores. La idea es buscar una relación entre los textos y devolver al menos 5 resultados.

Nota interesante: iloc método de la libreria Pandas

text_emb=embed_text('./chatbot_qa.csv')

with gr.Blocks() as demo:
    busqueda = gr.Textbox(label='Buscar')
    output = gr.DataFrame(headers=['texto'])
    greet_btn = gr.Button('Preguntar')
    greet_btn.click(fn=buscar,inputs=[busqueda,gr.DataFrame(text_emb)],outputs=output)

demo.launch()

Todo el código del chatbot se reduce a las últimas líneas anteriores donde se crear el embedding de todo el texto, y por último se utiliza Gradio para crear una interfaz web muy interesante para realizar filtrados, de manera que agiliza la interacción a la vez que simula un chatbox operativo.