프로젝트 발표회가 끝이났다. 11월 20일 부터 12월 4일까지 2주간 팀프로젝트가 마무리 됐다.
조금 더 매달리고 발전시키고 싶은 마음은 아직 없다.
돌아보면 기능적인 부분이나 코드를 보기 쉽게 모듈화 하는 등.. 많은 것들을 더 잘할 수 있었을 텐데 하는 아쉬움이 남는다.
하지만 열심히 했다고 생각하고 다음 다다음 프로젝트들에 보완해서 더 좋은 성과가 나오게 해야겠다.
음성 입출력 부분도 구현을 못한게 아쉽다. 분명 하면 할 수 있었을 텐데 마지막 힘이 쭉 빠져서 의욕이 나질 않았다. 시간이 나면 꼭 한번 구현해 보고싶다.
문서 작업도 좀 더 시각적으로, 자세히 작성 해야 했는데 조금 아쉬운 부분이 있다.
아래 깃허브 리드미로 구성해 놓은것을 끝으로 마무리 한다.
이 프로젝트는 비상사태 상황에서 시민들에게 빠르고 정확한 정보를 제공하기 위해 개발되었습니다.
💡 주요 목표: 비상사태 입력 시 시민들에게 신속하게 정확도가 높은 매뉴얼 소개, 사용자의 위치 정보를 기반으로 가장 가까운 대피소의 위치 안내
궁극적으로 각종 재난에 대한 대처를 용이하게 만들고자 함
실행할 때마다 PyPDFLoader
로 파일을 불러와 전처리를 진행한 결과 실행이 느려지고 API 호출 비용이 자꾸 발생하는 것을 확인했습니다.
이를 해결하기 위해 캐시를 지원하는 임베딩 기법을 도입하고 전처리된 Loader 파일을 저장해서 불러오는 형식으로 해결했습니다.
문제: 함수 호출을 사용했을 때 반환한 결과를 그대로 응답하고 나머지 질문에는 대답을 못하는 문제가 발생했습니다.
예를 들어:
User: 서울시청역이야, 비상상황 대처 매뉴얼을 알려줘.
Assistant: 서울시청역 근처 대피소 정보만 반환하고 비상상황 대처 매뉴얼에는 응답하지 않고 대답이 종료되었습니다.
함수 호출 및 응답 저장 프로세스
arguments
가 문자열(JSON) 또는 딕셔너리일 수 있어 처리 방식이 달라야 합니다.파싱과 데이터 저장의 이유
FunctionMessage
를 생성하고 이를 대화 기록에 추가했습니다.저장된 데이터를 모델에 재사용
PyPDFLoader
로 파일을 불러와 전처리를 진행한 결과 실행이 느려지고 비용이 발생하는 것을 확인했습니다.사용자 인터페이스: Streamlit
기반으로 사용자 입력 및 결과 표시
백엔드 API
데이터 레이어
PyPDFLoader
)데이터베이스
FAISS
: 유사도 검색 엔진Local File Store
: 캐싱된 임베딩 저장배포 환경
ngrok
사용 (추후 AWS, GCP 고려)OpenAI의 GPT-4 API를 이용하여 사용자의 자연어 질의에 자동으로 응답을 생성해 출력하는 기능 구현
답변을 생성할 때 RAG, Function Calling을 이용해 비상 상황에 대한 대처 방법 또는 입력 위치에 따라 가장 가까운 대피소 위치 정보를 반환받아 답변 생성에 사용
사용된 시스템 프롬프트:
chat_template = ChatPromptTemplate.from_messages(
[
("system", (
"당신은 비상사태 대처 매뉴얼 전문 챗봇입니다. "
"재난 상황(지진, 화재, 홍수, 전쟁 등)이 발생했을 때 사용자가 안전하게 대피할 수 있도록 최적의 정보를 제공하는 것이 목표입니다.\n\n"
"제공된 컨텍스트와 일반 상식을 사용해서, 질문에 답변하세요."
"위도 경도 형태로 사용자 위치가 제공될 수 있습니다"
"아래의 지침에 따라 응답하세요:\n"
"1. 역할 정의: 사용자에게 신뢰할 수 있는 정보를 제공하고, 필요한 경우 함수 호출을 통해 가장 가까운 대피소를 추천하세요.\n"
"2. 대화 스타일: 간결하고 명확하며 사용자 친화적인 언어를 사용하고, 긴급 상황에 맞는 전문적인 톤을 유지하세요.\n"
"3. 긴급 연락처: 추가적인 도움이 필요할 경우 즉시 긴급 연락처(예: 119, 112)를 안내하세요.\n"
"4. 정보의 정확성과 최신성: 최신 데이터를 결합해 응답하세요. 데이터 부족 시 안전한 방향으로 안내하고 추가 도움을 요청하도록 권장하세요.\n"
"5. 함수 호출 지침: 대피소 검색이나 위치 관련 질문에 적절한 함수를 호출하여 데이터를 검색하세요.\n"
"6. 다양한 사용자 고려: 복잡한 용어 대신 쉬운 표현을 사용하세요.\n"
"7. 추가 지침: 필요한 경우 질문을 되묻고, 제공 정보가 명확한지 점검하세요."
)),
("human", "안녕하세요!"),
("ai", "안녕하세요! 저는 비상사태에서 안전한 대처를 도와드리는 전문 AI 챗봇입니다. 무엇을 도와드릴까요?"),
("human", "{user_input}"),
]
)
RAG
PDF와 재난안전데이터공유플랫폼에서 가져온 API에서 대응법을 학습해 VectorDB에 임베딩된 데이터를 저장, 사용자의 질문에 관련된 데이터를 검색해 결과 데이터를 LLM에 전달해 정확도 높은 답변 생성사전에 전처리된 데이터가 preprocessed_data_path 변수가 지정하는 디렉토리에 저장되어 있다면 API 호출 비용을 아끼기 위해 저장되어있던 전처리된 데이터를 사용
preprocessed_data_path의 디폴트값은 'SourceCode/preprocessed_docs.pkl'이다.
필요없는 텍스트를 줄이기 위해 다음의 전처리 과정을 수행:
각 전처리가 끝난 데이터는 preprocessed_data_path 디렉토리에 저장됨
전처리가 끝난 데이터는 임베딩되어 VectorDB에 저장
FAISS와 Pandas를 이용해 벡터DB 구현
캐시 지원 임베딩, OpenAI 임베딩 모델(text-embedding-3-small) 사용
(대피소 위치정보의 경우 API의 한계로 정해진 IP 외에는 API로부터 응답을 받을 수 없어 Source 디렉토리에 미리 API의 응답 패킷인 shelters.json을 저장해두었다.)
대피소 위치정보의 전처리 과정은 다음과 같다:
계산된 거리 중 null이 아닌 값만 유효한 값으로 취급해 유효하지 않은 값은 이후의 과정에서 배제한다.
남은 대피소 중 거리 기준으로 정렬해 상위 3개만 선택해 결과 문자열을 생성하고 LLM으로 전달한다.
(민감한 정보인 사용자 위치를 포함하여, 대화 기록 저장을 하지 않음)
🧑 박성규(팀장)
- 담당 파트: function calling 설계, 프론트엔드 구현(streamlit 기반 챗봇 인터페이스)
- 역할: SA문서 관리, 발표 🎤
- GitHub 링크
👨💻 김광림
- 담당 파트: api 데이터 수집, system_prompt 작성, 음성 입출력 기능 설계, Query_Decomposition 설계, 시연 영상 제작
- 역할: 시연영상 🎥
- GitHub 링크
👨🔬 조현민
- 담당 파트: 데이터 수집, 데이터 전처리
- 역할: SA 문서관리 📄
- GitHub 링크
👨💻 정윤우
- 담당 파트: 데이터 수집(PDF매뉴얼, API 데이터), LLM_RAG
- 역할: README 작성📝
- GitHub 링크
999조 그라운드룰 조회하기👨💻 최해찬
- 담당 파트: 데이터 전처리, function calling 설계 및 구현
- 역할: jira workflow, PPT 제작🖼️
- GitHub 링크
작업 시작 전 최신 상태 동기화
항상 작업 전 git fetch origin
을 통해 원격 저장소의 최신 정보를 동기화합니다.
개인 브랜치에서 작업
각자 자신의 브랜치에서 작업하며, 다른 조원의 브랜치를 수정하지 않도록 유의하세요.
Merge 규칙
main 브랜치로 Merge 시, Pull Request에서 최소 1명의 조원 확인(Review Approval)을 받아야 합니다.
충돌 해결
충돌이 발생한 경우, 팀원 간 충분히 공유하여 협업으로 문제를 해결합니다.
위 내용과 더불어 플로우 로직이 이해가 쉽도록 작성 부탁드립니다.
AI_8기 부트캠프 기준으로 팀 과제가 아닌, 가이드라인 없이 주제부터 만든 첫 팀 프로젝트로, 다른 개발자들과 함께 프로젝트를 진행하는 경험을 쌓을 수 있는 계기가 되었다.
LLM, RAG, Langchain 등 이번 프로젝트에서 사용되었던 챗봇과 관련된 기술의 활용법과 function calling 부분에 대한 이해도가 높아질 수 있었다.
재난안전플랫폼에서 제공한 API는 이용신청할 때 입력된 IP가 아니면 API 호출 응답을 받을 수 없어 다수의 사용자가 실시간으로 API를 통해 새로운 정보를 받을 수 없다는 한계가 존재한다.
경험과 시간 부족으로 추가하지 못한 새로운 기능을 추가하기