Este código de ejemplo crea un embedding de datos de un archivo CSV que facilitemos. Después podemos preguntar sobre la información cargada y generará respuestas utilizando ChatGPT 3.5
Lo primero es instalar todas las dependencias que vamos a utilizar.
pip install streamlit streamlit_chat langchain openai faiss-cpu tiktoken
La aplicación nos solicitará una clave API OpenAI, además debemos tener preparado un archivo archivo CSV en el que se basará el chatbot, en nuestras pruebas hemos utilizado la Base de Datos de Ayuntamientos de Central de Comunicación.
En total son 7842 ayuntamientos con 21 campos de dato 164.682 celdas.
import streamlit as st
from streamlit_chat import message
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.document_loaders.csv_loader import CSVLoader
from langchain.vectorstores import FAISS
import tempfile
st.set_page_config(layout="wide")
user_api_key = st.sidebar.text_input(
label="#### OpenAI API key 👇",
placeholder="comienza por sk-",
type="password")
uploaded_file = st.sidebar.file_uploader("upload", type="csv")
if uploaded_file :
with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
tmp_file.write(uploaded_file.getvalue())
tmp_file_path = tmp_file.name
loader = CSVLoader(file_path=tmp_file_path, encoding="utf-8")
data = loader.load()
embeddings = OpenAIEmbeddings()
vectors = FAISS.from_documents(data, embeddings)
chain = ConversationalRetrievalChain.from_llm(llm = ChatOpenAI(temperature=0.0,model_name='gpt-3.5-turbo',openai_api_key=user_api_key),
retriever=vectors.as_retriever())
def conversational_chat(query):
result = chain({"question": query, "chat_history": st.session_state['history']})
st.session_state['history'].append((query, result["answer"]))
return result["answer"]
if 'history' not in st.session_state:
st.session_state['history'] = []
if 'generated' not in st.session_state:
st.session_state['generated'] = ["Hola ! Pregúntame cualquier cosa sobre " + uploaded_file.name + " 🤗"]
if 'past' not in st.session_state:
st.session_state['past'] = ["Hola ! 👋"]
#contenedor para el historial de chat
response_container = st.container()
#contenedor para la entrada de texto del usuario
container = st.container()
with container:
with st.form(key='my_form', clear_on_submit=True):
user_input = st.text_input("Query:", placeholder="Habla sobre tus datos csv aquí (:", key='input')
submit_button = st.form_submit_button(label='Send')
if submit_button and user_input:
output = conversational_chat(user_input)
st.session_state['past'].append(user_input)
st.session_state['generated'].append(output)
if st.session_state['generated']:
with response_container:
for i in range(len(st.session_state['generated'])):
message(st.session_state["past"][i], is_user=True, key=str(i) + '_user', avatar_style="big-smile")
message(st.session_state["generated"][i], key=str(i), avatar_style="thumbs")
Para ejecutar la aplicación debes indicar en la consola el siguiente comando «streamlit run nombreApp.py»:
Se abrirá una navegador con la interface. Ya puedes preguntar cualquier cosa sobre estos datos a tu chatBot.
streamlit run .\chatbot_csv.py
>> You can now view your Streamlit app in your browser.
>> Local URL: http://localhost:8501
>> Network URL: http://192.168.1.33:8501
El código se puede optimizar y esta basado en el Robby-chatbot de yvann