Bangun Chatbot di Data CSV Anda Dengan LangChain dan OpenAI

May 05 2023
Ngobrol dengan file CSV Anda dengan memory chatbot | Dibuat dengan Langchain dan OpenAI Pada artikel ini, kita akan melihat cara membuat chatbot sederhana dengan memori yang dapat menjawab pertanyaan Anda tentang data CSV Anda sendiri. Halo semuanya! Dalam beberapa minggu terakhir, saya telah bereksperimen dengan potensi menarik dari model bahasa besar untuk membuat segala macam hal, dan inilah waktunya untuk membagikan apa yang telah saya pelajari! Kami akan menggunakan LangChain untuk menautkan gpt-3.

Ngobrol dengan file CSV Anda dengan memory chatbot | Dibuat dengan Langchain dan OpenAI

gambar dibuat dengan StableDiffusion

Pada artikel ini, kita akan melihat cara membuat chatbot sederhana dengan memori yang dapat menjawab pertanyaan Anda tentang data CSV Anda sendiri.

Halo semuanya! Dalam beberapa minggu terakhir, saya telah bereksperimen dengan potensi menarik dari model bahasa besar untuk membuat segala macam hal, dan inilah waktunya untuk membagikan apa yang telah saya pelajari!

Kami akan menggunakan LangChain untuk menautkan gpt-3.5ke data kami dan Streamlit untuk membuat antarmuka pengguna untuk chatbot kami.

Tidak seperti ChatGPT, yang menawarkan konteks terbatas pada data kami (kami hanya dapat menyediakan maksimal 4096 token), chatbot kami akan dapat memproses data CSV dan mengelola database yang besar berkat penggunaan penyematan dan toko vektor.

Diagram proses yang digunakan untuk membuat chatbot pada data Anda, dari Blog LangChain

Kode

Sekarang mari kita menjadi praktis! Kami akan mengembangkan chatbot kami pada data CSV dengan sedikit sintaks Python.

Penafian : Kode ini adalah versi sederhana dari chatbot yang saya buat, tidak dioptimalkan untuk mengurangi biaya OpenAI API, untuk chatbot yang lebih berkinerja dan dioptimalkan, silakan periksa proyek GitHub saya: yvann-hub/Robby-chatbot atau hanya uji aplikasinya di Robby-chatbot.com .

  • Pertama, kami akan menginstal pustaka yang diperlukan:
  • 
    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
    

  • Untuk menguji chatbot dengan biaya lebih rendah, Anda dapat menggunakan file CSV yang ringan ini: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})"
    

  • Penyematan memungkinkan pengubahan bagian yang dipotong oleh CSVLoader menjadi vektor, yang kemudian mewakili indeks berdasarkan konten setiap baris dari file yang diberikan.
  • Dalam praktiknya, ketika pengguna membuat kueri, pencarian akan dilakukan di toko vektor, dan indeks yang paling cocok akan dikembalikan ke LLM, yang akan menyusun ulang konten indeks yang ditemukan untuk memberikan respons yang diformat ke pengguna.
  • Saya merekomendasikan untuk memperdalam pemahaman Anda tentang konsep vectorstore dan penyematan untuk pemahaman yang lebih baik.
  • embeddings = OpenAIEmbeddings()
    vectorstore = FAISS.from_documents(data, embeddings)
    

  • Rantai ini memungkinkan kami memiliki chatbot dengan memori sambil mengandalkan a vectorstoreuntuk menemukan informasi yang relevan dari dokumen kami.
  • chain = ConversationalRetrievalChain.from_llm(
    llm = ChatOpenAI(temperature=0.0,model_name='gpt-3.5-turbo'),
    retriever=vectorstore.as_retriever())
    

  • st.session_state[‘history’]menyimpan riwayat percakapan pengguna saat mereka berada di situs 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’]sesuai dengan respons chatbot.
  • [‘past’]sesuai dengan pesan yang diberikan oleh pengguna.
  • Wadah tidak penting tetapi membantu meningkatkan UI dengan menempatkan area pertanyaan pengguna di bawah pesan obrolan.
  • 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()
    

  • Kami dapat mengatur bagian UI yang memungkinkan pengguna untuk masuk dan mengirimkan pertanyaan mereka ke conversational_chatfungsi kami dengan pertanyaan pengguna sebagai argumen.
  • 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

Anda juga dapat menemukan proyek lengkapnya di GitHub saya .