#1 Langchain Document basis chatbot server like the ChatPDF 랭체인으로 ChatPDF같은 문서기반 챗봇서버 만들기 (GPT API + PDF, CSV + Python)
회사의 expense policy 와 Members list를 토대로 경영지원팀에게 올 수 있는 다양한 질문에 대응하는 챗봇을 만들어보고 싶었다.
처음에는 Python 과 Slack 채널 실시간 연동을 먼저 구성하고 잘 오고가는게 보이면 그 때 추가 작업을 해야겠다고 생각하며 진행하다보니, 아무래도 진행이 잘 안되기도 하고.. 최근에 www.recipegarden.live 라는 AI가 밥차려주는 웹페이지? 를 론칭하게 되어서 바쁘다보니 신경을 못썼다. 그러던 와중에 Langchain 이라는 녀석을 사용하는 유튜버의 게시물을 발견했는데, 덕분에 아주 편하게 만들어 볼 수 있게 되었다.
일단 python 모듈 구성은 이렇다.
1. OpenAI ( ChatGPT 3.5를 사용했다. )
2. PyPDF (PDF를 읽어주는 녀석)
3. Langchain (각종 데이터를 AI에게 일목요연하게 알아서 잘 전달해주는 중간매개채.)
3. Flask (Python 으로 서버 구동)
4. Pandas (csv파일 분석을 위한 데이터 프레임)
코드 구성은
A. PDF 기능
1. 먼저 API 키를 입력해주고, PDF 파일을 읽어서 텍스트로 특정 변수에 담아준다.
2. 1에서 담아둔 텍스트는 랭체인으로 요약한다.
3. 랭체인에게 참조할 텍스트를 지정하고 질문과 함께 전달하면
4. OpenAI GPT-3.5로부터 들은 답변을 랭체인이 전달해준다.
B. Dataframe 변수에 csv 파일을 pandas 모듈을 사용해서 담아준다. (변수명 df)
1. 마찬가지로 만능인 Langchain agent에게 pandas 데이터프레임을 기반으로 어떤 AI에게 어떤 데이터를 토대로 어떻게 진행할것인지 파라미터를 입력해서 전달하면 대답해준다.
C. 데이터, 파라미터를 flask서버에서 process_data 라는 함수로 받아서 처리하고 출력
코드는 다음과 같다.
from flask import Flask, request, jsonify
import pandas as pd
from langchain.agents import create_pandas_dataframe_agent
from langchain.chains.question_answering import load_qa_chain
from langchain.chat_models import ChatOpenAI
from langchain.chains import AnalyzeDocumentChain
from langchain import OpenAI
from PyPDF2 import PdfReader
import os
from langchain.chains.summarize import load_summarize_chain
app = Flask(__name__)
# OpenAI API Key
os.environ["OPENAI_API_KEY"] = "[[ChatGPT API Key here]]"
# Preprocess a PDF file
reader = PdfReader("expense_rule.pdf")
raw_text = ""
for i, page in enumerate(reader.pages):
text = page.extract_text()
if text:
raw_text += text
raw_text = raw_text[:1000]
# Summarize 요약
llm = OpenAI(temperature=0)
summary_chain = load_summarize_chain(llm, chain_type="map_reduce")
summarize_document_chain = AnalyzeDocumentChain(combine_docs_chain=summary_chain)
summary_result = summarize_document_chain.run(raw_text)
# Question Answering 질문 답변
model = ChatOpenAI(model="gpt-3.5-turbo") # gpt-3.5-turbo, gpt-4
qa_chain = load_qa_chain(model, chain_type="map_reduce")
qa_document_chain = AnalyzeDocumentChain(combine_docs_chain=qa_chain)
qa_result = qa_document_chain.run(input_document=raw_text, question="출장비에는 주차료가 포함되나?")
# 엑셀, CSV 검색, Aggregation
df = pd.read_csv("test_members.csv")
agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True)
csv_result = agent.run("how many rows are there?")
# Flask 엔드포인트 정의
@app.route('/process_data', methods=['POST'])
def process_data():
# 전달된 데이터 받기
data = request.get_json()
# 데이터 처리
question = data.get('question')
# DataFrame
agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True)
result = agent.run(question)
# 결과 반환
return jsonify({'result': result})
if __name__ == '__main__':
app.run(debug=True)
위 코드를 실행하면 이렇게 Flask 서버가 돌아간다.
그리고 새로운 프로젝트에서 JSON 형태로 위와 같은 requests 값을 보내면 result를 전달해주는것을 확인할 수 있다.
이제부터 해야할 일은
1. 이 request가 슬랙 채널에서 올라오는 새로운 메시지의 내용이 들어가게 연결하고
2. flask 가 전달하는 result 값이 슬랙 채널에 쓰여지도록 하면 되겠다.
이후 내용은 2부에서 이어서 작성 예정!
댓글
댓글 쓰기