챗봇 설계 예상 로직, PDF 데이터 추출

2star_·2024년 11월 24일
1

Shelter_PJ

목록 보기
6/12

챗봇 프로젝트를 진행 전에 팀원들과 설계 로직을 확실하게 맞추고자 AI tool을 이용해서 설계가능한 로직을 작성해봤다.

내가 생각한 내용을 프롬프트화해서 질문했더니 아래와 같은 답변이 나왔다.
거의 정확하게 생각한 것과 같은 로직을 잘 정리해서 보여줬다. 이를 바탕으로 팀 회의를 거쳐 어떤 기능구현과 데이터 처리를 어떻게 하면 좋을지 정해야겠다.


비상사태 행동 매뉴얼 챗봇 설계 로직 (LangChain과 RAG 활용)

1. 대화 흐름 설계

챗봇의 대화 흐름을 단계별로 나누고, 각 단계에서 사용자 입력과 챗봇의 응답을 어떻게 처리할지 설계합니다.

단계 1: 상황 입력 요청

  • 챗봇: "상황을 입력해 주세요. (태풍, 전쟁 발발, 화재 등등)"
  • 사용자: "비가 너무 많이 와."

단계 2: 상황에 대한 안내 제공

  • 챗봇: 사용자 입력을 바탕으로 재난 매뉴얼에서 관련 정보를 검색하고, 적절한 대응 방법을 안내합니다.

단계 3: 주소 입력 요청

  • 챗봇: "주소를 입력하면 가까운 대피소 정보를 알 수 있어요."
  • 사용자: "서울특별시 중구 세종대로 110"

단계 4: 대피소 정보 제공

  • 챗봇: 가장 가까운 대피소 정보를 제공하고, 장소 링크를 첨부합니다.
  • 챗봇: "다른 대피소들을 확인할 수 있어요."

2. LangChain을 활용한 구현 방안

a. 상태 관리
대화의 흐름을 관리하기 위해 상태(state)를 추적합니다. 이를 통해 사용자가 현재 어느 단계에 있는지 파악하고, 적절한 응답을 제공합니다.

  • 상태 예시:
    • awaiting_situation: 상황 입력 대기 중
    • awaiting_address: 주소 입력 대기 중

b. RAG를 이용한 정보 검색

  • 문서 로드: 재난 매뉴얼을 LangChain의 문서 로더를 사용하여 로드합니다.
  • 인덱싱 및 임베딩: 검색을 효율적으로 하기 위해 문서를 인덱싱하고 임베딩합니다.
  • Retrieval: 사용자의 입력을 쿼리로 사용하여 관련 문서를 검색합니다.

c. LLM을 통한 응답 생성

  • 프롬프트 템플릿: 응답의 일관성을 유지하기 위해 프롬프트 템플릿을 사용합니다.
  • LLMChain: LangChain의 LLMChain을 사용하여 LLM과 통신하고 응답을 생성합니다.

d. 외부 API 연동
주소를 입력받아 가까운 대피소 정보를 제공하기 위해 지오코딩 및 대피소 데이터베이스를 활용합니다.

  • 지오코딩 API: 사용자의 주소를 위도와 경도로 변환합니다.
  • 대피소 데이터베이스: 변환된 좌표를 기반으로 가장 가까운 대피소를 검색합니다.
  • 장소 링크 생성: 대피소 위치에 대한 지도를 제공하기 위해 링크를 생성합니다.

3. 코드 구조 예시

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'
    }

4. 추가 고려사항

  • 에러 처리: 사용자의 입력이 예상과 다를 경우를 대비하여 예외 처리를 합니다.
  • 사용자 경험 개선: 필요에 따라 버튼이나 선택지를 제공하여 사용자 편의를 높입니다.
  • 보안 및 개인정보 보호: 주소 등 개인정보를 처리할 때 보안에 유의합니다.

5. 전체적인 로직 요약

  1. 사용자 상황 입력 받기
    • 상황에 따른 대응 매뉴얼 검색 및 안내
  2. 주소 입력 요청
    • 사용자의 주소를 받아 가까운 대피소 정보 제공
  3. 추가 정보 제공
    • 다른 대피소 정보나 추가적인 도움을 제공

데이터 추출

RAG를 활용하기위해 학습시킬 데이터를 살펴보면, PDF형식의 대부분 이미지 PDF라 텍스트 추출 방법에 대해서 깊게 고민해봐야 할 것 같다. 저번 개인과제 수정 3번 파일이 딱 이런식이라 Unstructure?였나 해당 도큐먼트로더를 사용했는데, 제대로된 추출이 되지않았던 기억이 있어서 조금 막막하다.

(설치한 라이브러리도 많았고, 웹사이트에서 파일도 여럿 받아서 시도했던 기억이 있다.)

과제 파일이 드래그가 가능한, 텍스트 추출이 쉬운 PDF로 바껴서 해결했는데 프로젝트를 진행에 필요한 데이터가 이런 데이터라 그전에 추출을 완벽하게 해볼껄 이라는 생각이 든다.

profile
안녕하세요.

0개의 댓글

관련 채용 정보