Créez un chatbot sur vos données CSV avec LangChain et OpenAI
Discutez avec vos fichiers CSV avec un chatbot de mémoire | Fait avec Langchain et OpenAI

Dans cet article, nous verrons comment créer un chatbot simple avec de la mémoire qui peut répondre à vos questions sur vos propres données CSV.
Salut tout le monde! Au cours des dernières semaines, j'ai expérimenté le potentiel fascinant des grands modèles de langage pour créer toutes sortes de choses, et il est temps de partager ce que j'ai appris !
Nous utiliserons LangChain pour établir un lien gpt-3.5
avec nos données et Streamlit pour créer une interface utilisateur pour notre chatbot.
Contrairement à ChatGPT qui offre un contexte limité sur nos données (nous ne pouvons fournir qu'un maximum de 4096 tokens), notre chatbot pourra traiter des données CSV et gérer une large base de données grâce à l'utilisation d'embeddings et d'un vectorstore.

Le code
Passons maintenant à la pratique ! Nous développerons notre chatbot sur des données CSV avec très peu de syntaxe Python.
Disclaimer : Ce code est une version simplifiée du chatbot que j'ai créé, il n'est pas optimisé pour réduire les coûts de l'API OpenAI, pour un chatbot plus performant et optimisé, n'hésitez pas à consulter mon projet GitHub : yvann-hub/Robby-chatbot ou juste testez l'application sur Robby-chatbot.com .
- Tout d'abord, nous allons installer les bibliothèques nécessaires :
pip install streamlit streamlit_chat langchain openai faiss-cpu tiktoken
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
fishfry-locations.csv
user_api_key = st.sidebar.text_input(
label="#### Your OpenAI API key ",
placeholder="Paste your openAI API key, sk-",
type="password")
uploaded_file = st.sidebar.file_uploader("upload", type="csv")
if uploaded_file :
#use tempfile because CSVLoader only accepts a file_path
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", csv_args={
'delimiter': ','})
data = loader.load()
st.write(data)
0:"Document(page_content='venue_name: McGinnis Sisters\nvenue_type: Market\nvenue_address: 4311 Northern Pike, Monroeville, PA\nwebsite: http://www.mcginnis-sisters.com/\nmenu_url: \nmenu_text: \nphone: 412-858-7000\nemail: \nalcohol: \nlunch: True', metadata={'source': 'C:\\Users\\UTILIS~1\\AppData\\Local\\Temp\\tmp6_24nxby', 'row': 0})"
1:"Document(page_content='venue_name: Holy Cross (Reilly Center)\nvenue_type: Church\nvenue_address: 7100 West Ridge Road, Fairview PA\nwebsite: \nmenu_url: \nmenu_text: Fried pollack, fried shrimp, or combo. Adult $10, Child $5. Includes baked potato, homemade coleslaw, roll, butter, dessert, and beverage. Mac and cheese $5.\nphone: 814-474-2605\nemail: \nalcohol: \nlunch: ', metadata={'source': 'C:\\Users\\UTILIS~1\\AppData\\Local\\Temp\\tmp6_24nxby', 'row': 1})"
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(data, embeddings)
vectorstore
pour trouver les informations pertinentes de notre document.chain = ConversationalRetrievalChain.from_llm(
llm = ChatOpenAI(temperature=0.0,model_name='gpt-3.5-turbo'),
retriever=vectorstore.as_retriever())
st.session_state[‘history’]
stocke l'historique des conversations de l'utilisateur lorsqu'il est sur le site Streamlit.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"]
[‘generated’]
correspond aux réponses du chatbot.[‘past’]
correspond aux messages fournis par l'utilisateur.- Les conteneurs ne sont pas essentiels mais aident à améliorer l'interface utilisateur en plaçant la zone de questions de l'utilisateur sous les messages de chat.
if 'history' not in st.session_state:
st.session_state['history'] = []
if 'generated' not in st.session_state:
st.session_state['generated'] = ["Hello ! Ask me anything about " + uploaded_file.name + " "]
if 'past' not in st.session_state:
st.session_state['past'] = ["Hey ! "]
#container for the chat history
response_container = st.container()
#container for the user's text input
container = st.container()
conversational_chat
fonction avec la question de l'utilisateur comme argument.with container:
with st.form(key='my_form', clear_on_submit=True):
user_input = st.text_input("Query:", placeholder="Talk about your csv data here (:", 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")
streamlit run name_of_your_chatbot.py #run with the name of your file
The result after launch the last command
Vous pouvez également trouver le projet complet sur mon GitHub .