챗봇 프로젝트를 진행 전에 팀원들과 설계 로직을 확실하게 맞추고자 AI tool을 이용해서 설계가능한 로직을 작성해봤다.
내가 생각한 내용을 프롬프트화해서 질문했더니 아래와 같은 답변이 나왔다.
거의 정확하게 생각한 것과 같은 로직을 잘 정리해서 보여줬다. 이를 바탕으로 팀 회의를 거쳐 어떤 기능구현과 데이터 처리를 어떻게 하면 좋을지 정해야겠다.
챗봇의 대화 흐름을 단계별로 나누고, 각 단계에서 사용자 입력과 챗봇의 응답을 어떻게 처리할지 설계합니다.
단계 1: 상황 입력 요청
단계 2: 상황에 대한 안내 제공
단계 3: 주소 입력 요청
단계 4: 대피소 정보 제공
a. 상태 관리
대화의 흐름을 관리하기 위해 상태(state)를 추적합니다. 이를 통해 사용자가 현재 어느 단계에 있는지 파악하고, 적절한 응답을 제공합니다.
awaiting_situation
: 상황 입력 대기 중awaiting_address
: 주소 입력 대기 중b. RAG를 이용한 정보 검색
c. LLM을 통한 응답 생성
d. 외부 API 연동
주소를 입력받아 가까운 대피소 정보를 제공하기 위해 지오코딩 및 대피소 데이터베이스를 활용합니다.
from langchain import ConversationChain, OpenAI, PromptTemplate
from langchain.document_loaders import TextLoader
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
# 상태 관리 변수
conversation_state = "awaiting_situation"
# 문서 로드 및 인덱싱
loader = TextLoader('disaster_manual.txt')
documents = loader.load()
embedding = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(documents, embedding)
# 프롬프트 템플릿 설정
situation_prompt = PromptTemplate(
input_variables=['situation'],
template="상황: {situation}\n\n대응 방법:"
)
# 대화 루프
def chatbot_response(user_input):
global conversation_state
if conversation_state == "awaiting_situation":
# 상황에 대한 응답 생성
docs = vectorstore.similarity_search(user_input)
response = generate_response_from_docs(docs)
conversation_state = "awaiting_address"
response += "\n\n주소를 입력하면 가까운 대피소 정보를 알 수 있어요."
return response
elif conversation_state == "awaiting_address":
# 주소 처리 및 대피소 정보 제공
shelter_info = get_nearest_shelter(user_input)
response = f"가장 가까운 대피소는 {shelter_info['name']}입니다. 장소는 {shelter_info['link']} 입니다.\n\n다른 대피소들을 확인 할 수 있어요."
conversation_state = "completed"
return response
else:
return "도움이 필요하시면 언제든 말씀해주세요."
# 응답 생성 함수
def generate_response_from_docs(docs):
# 검색된 문서를 기반으로 LLM을 통해 응답 생성
combined_docs = "\n".join([doc.page_content for doc in docs])
prompt = situation_prompt.format(situation=combined_docs)
llm = OpenAI()
response = llm(prompt)
return response
# 대피소 정보 함수
def get_nearest_shelter(address):
# 지오코딩 및 대피소 검색 로직 구현
# 예시 반환 값
return {
'name': '중앙 대피소',
'link': 'http://maps.example.com/shelter/central'
}
RAG를 활용하기위해 학습시킬 데이터를 살펴보면, PDF형식의 대부분 이미지 PDF라 텍스트 추출 방법에 대해서 깊게 고민해봐야 할 것 같다. 저번 개인과제 수정 3번 파일이 딱 이런식이라 Unstructure
?였나 해당 도큐먼트로더를 사용했는데, 제대로된 추출이 되지않았던 기억이 있어서 조금 막막하다.
(설치한 라이브러리도 많았고, 웹사이트에서 파일도 여럿 받아서 시도했던 기억이 있다.)
과제 파일이 드래그가 가능한, 텍스트 추출이 쉬운 PDF로 바껴서 해결했는데 프로젝트를 진행에 필요한 데이터가 이런 데이터라 그전에 추출을 완벽하게 해볼껄 이라는 생각이 든다.