LangChain 및 OpenAI로 CSV 데이터에 챗봇 구축

May 05 2023
메모리 챗봇으로 CSV 파일로 채팅하세요 | Langchain 및 OpenAI로 제작 이 기사에서는 자신의 CSV 데이터에 대한 질문에 답할 수 있는 메모리가 있는 간단한 챗봇을 구축하는 방법을 살펴보겠습니다. 안녕하세요 여러분! 지난 몇 주 동안 저는 모든 종류의 것을 생성할 수 있는 대규모 언어 모델의 매혹적인 잠재력을 실험해 왔으며 이제 제가 배운 것을 공유할 시간입니다! LangChain을 사용하여 gpt-3를 연결합니다.

메모리 챗봇으로 CSV 파일로 채팅하세요 | Langchain 및 OpenAI로 제작

StableDiffusion으로 만든 이미지

이 기사에서는 자신의 CSV 데이터에 대한 질문에 답할 수 있는 메모리가 있는 간단한 챗봇을 구축하는 방법을 살펴보겠습니다.

안녕하세요 여러분! 지난 몇 주 동안 저는 모든 종류의 것을 생성할 수 있는 대규모 언어 모델의 매혹적인 잠재력을 실험해 왔으며 이제 제가 배운 것을 공유할 시간입니다!

LangChain 을 사용하여 gpt-3.5데이터에 연결 하고 Streamlit을 사용하여 챗봇용 사용자 인터페이스를 만들 것입니다.

데이터에 대해 제한된 컨텍스트를 제공하는 ChatGPT(최대 4096개의 토큰만 제공할 수 있음)와 달리 챗봇은 임베딩 및 벡터 저장소를 사용하여 CSV 데이터를 처리하고 대규모 데이터베이스를 관리할 수 있습니다.

LangChain 블로그에서 데이터로 챗봇을 생성하는 데 사용되는 프로세스 다이어그램

코드

이제 실용화하자! Python 구문이 거의 없는 CSV 데이터에서 챗봇을 개발할 것입니다.

면책 조항 : 이 코드는 제가 만든 챗봇의 단순화된 버전이며, OpenAI API 비용을 줄이기 위해 최적화되지 않았습니다. 더 성능이 좋고 최적화된 챗봇을 위해 제 GitHub 프로젝트를 확인하십시오: yvann-hub/Robby-chatbot 또는 그냥 Robby-chatbot.com 에서 앱을 테스트하세요 .

  • 먼저 필요한 라이브러리를 설치합니다.
  • 
    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
    

  • 저렴한 비용으로 챗봇을 테스트하려면 이 경량 CSV 파일을 사용할 수 있습니다.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})"
    

  • 임베딩을 사용하면 CSVLoader로 잘라낸 부분을 벡터로 변환할 수 있으며, 그러면 지정된 파일의 각 행 내용을 기반으로 인덱스를 나타냅니다.
  • 실제로 사용자가 쿼리를 작성하면 vectorstore에서 검색이 수행되고 가장 일치하는 인덱스가 LLM에 반환되며 LLM은 검색된 인덱스의 내용을 바꾸어 형식화된 응답을 제공합니다. 사용자.
  • 더 나은 이해를 위해 vectorstore 및 embeddings 개념 에 대한 이해를 심화하는 것이 좋습니다 .
  • embeddings = OpenAIEmbeddings()
    vectorstore = FAISS.from_documents(data, embeddings)
    

  • vectorstore이 체인을 사용하면 문서에서 관련 정보를 찾는 데 의존하면서 메모리가 있는 챗봇을 가질 수 있습니다 .
  • chain = ConversationalRetrievalChain.from_llm(
    llm = ChatOpenAI(temperature=0.0,model_name='gpt-3.5-turbo'),
    retriever=vectorstore.as_retriever())
    

  • st.session_state[‘history’]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’]챗봇의 응답에 해당합니다.
  • [‘past’]사용자가 제공한 메시지에 해당합니다.
  • 컨테이너는 필수는 아니지만 채팅 메시지 아래에 사용자의 질문 영역을 배치하여 UI를 개선하는 데 도움이 됩니다.
  • 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사용자의 질문을 인수로 사용하여 사용자가 질문을 입력하고 함수에 보낼 수 있도록 UI 부분을 설정할 수 있습니다 .
  • 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

내 GitHub 에서 전체 프로젝트를 찾을 수도 있습니다 .