다른 명령
개인 PC 텍스트 파일 기반 간단 챗봇 파이썬 프로그램 예제
개요
개인 컴퓨터 내의 여러 `txt` 파일을 수집해서 벡터화하고, 질문 입력 시 가장 유사한 파일의 내용을 답변해주는 간단한 챗봇(Python CLI 형태) 예제입니다. 필수 패키지 설치 방법과, 작동 원리 그리고 파이썬 예제 코드를 미디어위키 표기법으로 정리했습니다.
필요한 패키지
- sentence-transformers
- chromadb
설치 방법
pip install sentence-transformers chromadb
폴더 구조 예시
- 본인의 텍스트 파일들을 한 폴더(`./textfiles` 등)에 넣습니다.
파이썬 예제 코드
import os from sentence_transformers import SentenceTransformer import chromadb from chromadb.config import Settings # 1. 텍스트 파일 데이터 불러오기 def load_files_from_folder(folder_path): texts = [] file_names = [] for filename in os.listdir(folder_path): if filename.endswith(".txt"): with open(os.path.join(folder_path, filename), "r", encoding='utf-8') as f: texts.append(f.read()) file_names.append(filename) return texts, file_names # 2. 벡터DB 설정 (ChromaDB) def create_chroma_db(texts, file_names): client = chromadb.Client(Settings(chroma_db_impl="mem")) collection = client.create_collection(name="docs") model = SentenceTransformer('paraphrase-MiniLM-L6-v2') embeddings = model.encode(texts).tolist() collection.add(documents=texts, metadatas=[{"source": n} for n in file_names], ids=[str(i) for i in range(len(texts))], embeddings=embeddings) return collection, model # 3. 챗봇 답변 함수 def get_answer(user_input, collection, model, texts, file_names): query_embedding = model.encode([user_input]).tolist()[0] results = collection.query(query_embeddings=[query_embedding], n_results=1) idx = int(results['ids'][0][0]) source = file_names[idx] answer = texts[idx][:300] # 첫 300자만 표시 (예시) return f"({source})에서 찾은 내용:\n{answer}..." # -------- # 실행 파트 folder_path = "./textfiles" # 여기에 본인 폴더 경로 지정 print("텍스트 파일을 읽고 데이터를 준비합니다.") texts, file_names = load_files_from_folder(folder_path) collection, model = create_chroma_db(texts, file_names) print("준비 완료. 질문을 입력하세요. 종료하려면 'exit'를 입력하세요.") while True: user_input = input("\n질문: ") if user_input.lower().strip() == 'exit': print("챗봇을 종료합니다.") break answer = get_answer(user_input, collection, model, texts, file_names) print(answer)
작동 방식 요약
- `./textfiles` 폴더 내의 여러 `.txt` 파일을 모두 읽어서 텍스트 데이터로 저장합니다.
- 파일 전체 내용을 벡터로 변환 및 ChromaDB 벡터DB에 등록합니다.
- 사용자가 질문을 하면 입력 질문을 벡터로 변환해서, 가장 유사한 벡터(=파일)을 찾아 일부 내용을 반환합니다.
- 'exit' 입력 시 종료됩니다.
참고 사항
- 문서 응답 품질을 높이려면 소단락(문단 등) 단위로 쪼개어 벡터화하는 방식을 추천합니다.
- CLI 콘솔에서 동작합니다. (웹, GUI 등은 streamlit 등으로 확장 가능)