티스토리 뷰
미니프로젝트 7차
0603 - 0613
미니프로젝트 7차는 지금까지 진행했던 미니프로젝트 중 가장 긴 기간이었고, 빅프로젝트의 팀원들을 미리알 수 있었다. 빅프로젝트를 앞두고 팀원들과 호흡을 맞춰보는 중요한 기회를 제공해주는 느낌..?
이번 프로젝트의 목표는 장고(Django)를 사용하여 웹 서비스를 구축한 경험을 바탕으로, AIVLE School의 FAQ를 챗봇 서비스로 만드는 것..!
사용 기술
- 프레임워크 : 장고(Django)
- AI 모델 : GPT-3.5(Open AI), text-embedding-ada-002
- 리트리버 : 데이터베이스에서 유사한 문서를 검색하는 시스템
- 데이터베이스 : FAQ 데이터를 저장 및 관리
- AWS : 서버를 배포
개발 과정
- 요구사항 분석: FAQ 데이터 수집 및 챗봇의 기본 기능 정의
- 데이터베이스 설계: 자주 묻는 질문과 답변 데이터를 저장할 데이터베이스 구축
- 챗봇 개발: 사용자 질문을 이해하고 적절한 답변을 제공할 수 있는 챗봇 엔진 개발
- 웹 인터페이스: 사용자들이 쉽게 챗봇을 이용할 수 있도록 웹 인터페이스 구현
- 테스트 및 배포: 시스템 테스트 후 최종 배포
주요기능(Views.py)
유사성 계산 함수
def compute_similarity(query, questions):
vectorizer = TfidfVectorizer().fit_transform([query] + questions)
vectors = vectorizer.toarray()
cosine_similarities = cosine_similarity([vectors[0]], vectors[1:])[0]
return cosine_similarities
TF-IDF 벡터화 및 코사인 유사도를 사용하여 질문과 FAQ 데이터 간의 유사성을 계산하는 코드
메모리 캐시 설정
@lru_cache(maxsize=100)
def get_cached_answer_memory(question):
conn = sqlite3.connect('chat_cache.db')
c = conn.cursor()
c.execute("SELECT question, answer FROM chat_cache")
rows = c.fetchall()
conn.close()
if not rows:
return None
questions = [row[0] for row in rows]
cosine_similarities = compute_similarity(question, questions)
most_similar_index = cosine_similarities.argmax()
if cosine_similarities[most_similar_index] > 0.8: # 유사성 임계값 설정 (0.8)
return rows[most_similar_index][1]
return None
LRU 캐시를 사용하여 질문에 대한 답변을 메모리에 저장하고, 유사한 질문이 들어오면 캐시에서 빠르게 답변을 제공할 수 있다. 캐시가 정확히 동작하지 않아, 질문에 대한 답변을 기억하지 못했다. GPT 성능 문제일지도.. 모른다고 했다.
수정
def cache_answer(question, answer):
conn = sqlite3.connect('chat_cache.db')
c = conn.cursor()
c.execute("INSERT OR REPLACE INTO chat_cache (question, answer) VALUES (?, ?)", (question, answer))
conn.commit()
conn.close()
캐시 삽입 코드를 다시 한 번 확인해보고자 코드를 보았는데, INSERT OR REPLACE로 변경하여 새로운 답변이 무시되지 않도록 시도해보는 것도 좋을 것 같다.
챗기록 다운로드
def download(request):
messages = Message.objects.all()
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="chat_history.csv"'
response.write('\ufeff'.encode('utf8'))
writer = csv.writer(response)
writer.writerow(['User', 'Message', 'Timestamp'])
for message in messages:
writer.writerow([message.user, message.text, message.timestamp])
return response
모든 채팅기록을 다운로드 가능하게 만들었다.
userID를 파악해서, 각 user의 대화기록만 다운되도록 수정해야한다. 현재는, 전체 대화 기록이 다운로드되어 보안에 심각한 문제가 있다.ㅜㅜ
챗봇 서비스 : RAG
Retrieval-Augmented Generation(RAG)는 검색과 생성의 조합을 통해 답변을 생성하는 모델로, 주어진 질문에 대해 먼저 관련 문서를 검색한 후, 검색된 문서를 기반으로 답변을 생성하여 LLM의 한계를 보완한다. RAG는 외부 지식을 활용하는데, 대규모의 구조화된 지식 베이스를 모델에 연결하여 사용한다. 챗봇 프로젝트에서 FAQ 데이터베이스를 모델에 연결하여 사용했다. 이를 통해 모델은 학습 데이터에 한정되지 않고, 최신 정보와 풍부한 지식을 활용할 수 있다. 주어진 질의에 대한 관련 정보를 지식 베이스에서 검색 및 추출하여, 보다 정확하고 관련성 높은 답변을 제공한다.
RAG의 장점
RAG는 검색된 지식 정보를 증거로 활용하여 보다 사실에 기반한 답변을 생성하며, 생성된 답변의 출처를 명시함으로써 신뢰성을 준다. 사용자가 답변의 근거를 확인하고 신뢰할 수 있게 한다. 또한, 외부 지식을 통해 질의에 대한 배경 지식과 맥락 정보를 파악함으로써 단순한 패턴 매칭이 아닌 추론 능력을 바탕으로 한 답변을 생성한다. 이를 통해 보다 정확하고 관련성 높은 답변을 제공할 수 있다.
리트리버는 대량의 데이터를 빠르게 검색할 수 있어 대규모 딥러닝 모델을 사용하는 것보다 훨씬 효율적이다. 딥러닝 모델을 사용하는 것은 많은 계산 자원과 시간이 필요하지만, 리트리버는 상대적으로 적은 자원으로도 높은 효율을 발휘한다. 다양한 환경에서 사용가능하고 비용도 절감할 수 있다.
또, 다양한 형태의 데이터를 처리할 수 있으며, 데이터베이스의 구조나 내용에 큰 제약이 없다. 이를 통해 다양한 분야에서 활용될 수 있고 대량의 데이터를 쉽게 추가하고 관리할 수 있어 데이터의 양이 증가해도 성능을 유지할 수 있다. 지속적인 시스템 성능 향상을 가능하게 한다.
좋은 팀원들을 만나 단시간 내에 여러 기능을 통합하여 미니프로젝트 7차에서 좋은 결과를 얻을 수 있었다. Django와 AWS의 기본 기능과 구조를 다시 학습할 수 있어 좋았고, 처음으로 배포까지 완료하여 결과물을 낼 수 있는 프로젝트였다. 부족한 점이 많았지만 복기하면서 많은 것을 배웠다. 이번 프로젝트를 통해 Django와 RAG를 활용한 자연어 처리와 웹 개발의 실무적인 감각을 키울 수 있었으며, 이를 통해 사용자 경험을 향상시키고 운영 효율성을 높일 수 있었다.
'KT에이블스쿨' 카테고리의 다른 글
[KT AIVLE] AIVLE DAY 2차, 1등 워크숍 (0) | 2024.07.29 |
---|---|
[KT AIVLE] 에이블스쿨 6기 모집(~0703) (1) | 2024.06.23 |
[KT AIVLE] AICE 대비 샘플 문항 정리 (1) | 2024.06.20 |
[KT AIVLE] 미니프로젝트 5차 (0) | 2024.05.27 |
[KT AIVLE] 언어지능 (0) | 2024.05.18 |