매뉴얼 등록 분리
This commit is contained in:
24
README.md
Normal file
24
README.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# pip offline download
|
||||||
|
pip download -r requirements.txt --no-binary :all: -d /path/to/download/dir
|
||||||
|
|
||||||
|
# llm model download
|
||||||
|
HF CLI 설치 (처음 한 번만)
|
||||||
|
|
||||||
|
pip install huggingface_hub
|
||||||
|
|
||||||
|
로그인 (오프라인 사용 전 한 번만 필요)
|
||||||
|
|
||||||
|
huggingface-cli login # 토큰 입력 (https://huggingface.co/settings/tokens)
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
모델 로컬 저장
|
||||||
|
|
||||||
|
huggingface-cli download Qwen/Qwen3-0.6B --local-dir ./models/Qwen3-0.6B --local-dir-use-symlinks False
|
||||||
|
|
||||||
|
# sentence-transformers model (chroma vector db)
|
||||||
|
from sentence_transformers import SentenceTransformer
|
||||||
|
|
||||||
|
model = SentenceTransformer('all-MiniLM-L6-v2')
|
||||||
|
|
||||||
|
model.save('./models/all-MiniLM-L6-v2')
|
||||||
@@ -2,15 +2,3 @@ from sentence_transformers import SentenceTransformer
|
|||||||
model = SentenceTransformer('all-MiniLM-L6-v2')
|
model = SentenceTransformer('all-MiniLM-L6-v2')
|
||||||
model.save('./models/all-MiniLM-L6-v2')
|
model.save('./models/all-MiniLM-L6-v2')
|
||||||
|
|
||||||
# # HF CLI 설치 (처음 한 번만)
|
|
||||||
# pip install huggingface_hub
|
|
||||||
#
|
|
||||||
# # 로그인 (오프라인 사용 전 한 번만 필요)
|
|
||||||
# huggingface-cli login # 토큰 입력 (https://huggingface.co/settings/tokens)
|
|
||||||
#
|
|
||||||
# # 모델 로컬 저장
|
|
||||||
# huggingface-cli download Qwen/Qwen3-0.6B --local-dir ./models/Qwen3-0.6B --local-dir-use-symlinks False
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
32
manual.py
32
manual.py
@@ -11,15 +11,9 @@ from fastapi import FastAPI
|
|||||||
persist_directory = "./chroma_db"
|
persist_directory = "./chroma_db"
|
||||||
chroma_client = chromadb.PersistentClient(path=persist_directory)
|
chroma_client = chromadb.PersistentClient(path=persist_directory)
|
||||||
|
|
||||||
# ✅ Chroma 전용 임베딩 함수 사용 (오류 방지)
|
|
||||||
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
|
|
||||||
model_name="all-MiniLM-L6-v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
# 컬렉션 생성
|
# 컬렉션 생성
|
||||||
collection = chroma_client.get_or_create_collection(
|
collection = chroma_client.get_or_create_collection(
|
||||||
name="manuals",
|
name="manuals",
|
||||||
embedding_function=sentence_transformer_ef # ← 여기가 핵심!
|
|
||||||
)
|
)
|
||||||
|
|
||||||
_model = None
|
_model = None
|
||||||
@@ -38,32 +32,6 @@ def get_qwen_model() :
|
|||||||
)
|
)
|
||||||
return _model, _tokenizer
|
return _model, _tokenizer
|
||||||
|
|
||||||
def init(job: str) :
|
|
||||||
print(f'{job} init start')
|
|
||||||
# 1. 문서 준비 (실제로는 PDF/Word 등에서 추출)
|
|
||||||
manuals = [
|
|
||||||
"지출 결의서는 사용 목적, 금액, 일자, 증빙 서류를 반드시 첨부하여 전자 결재 시스템에 등록해야 합니다.",
|
|
||||||
"월말 마감은 매월 25일부터 시작되며, 모든 부서는 28일까지 비용 집행 내역을 최종 확정해야 합니다.",
|
|
||||||
"외화 송금은 반드시 외환관리부의 사전 승인을 받은 후 금융팀을 통해 진행되어야 하며, 계약서 사본을 첨부해야 합니다.",
|
|
||||||
"세금계산서는 발행일로부터 10일 이내에 ERP에 등록되지 않으면 비용 처리가 불가합니다.",
|
|
||||||
"장기자산(차량, 사무기기 등)은 매년 1월에 정기 감가상각 점검을 받아야 하며, 자산관리부서가 이를 주관합니다.",
|
|
||||||
"현금 보관은 원칙적으로 금지되며, 불가피한 경우는 금고 보관 후 당일 중 재무팀에 입금 처리해야 합니다.",
|
|
||||||
"연말 정산 대상 직원은 매년 12월 10일까지 개인 소득공제 자료를 인사 시스템에 제출해야 합니다.",
|
|
||||||
"예산 초과 지출은 사전에 재무부와 협의 후 예산 조정 승인을 받아야 하며, 미승인 시 결재가 거부됩니다.",
|
|
||||||
"재무 제표 초안은 분기 마감 후 5영업일 이내에 감사법인에 제출되어야 하며, 최종 승인은 CFO가 담당합니다.",
|
|
||||||
]
|
|
||||||
|
|
||||||
# 문서 ID 생성 및 추가
|
|
||||||
doc_ids = [f"DOC_{job}_{i}" for i in range(len(manuals))]
|
|
||||||
# collection.add(documents=manuals, ids=doc_ids)
|
|
||||||
collection.add(
|
|
||||||
documents=manuals,
|
|
||||||
ids=doc_ids,
|
|
||||||
metadatas=[{"source": "fi_manual_v1.pdf", "version":1.0, "dept": job} for _ in doc_ids]
|
|
||||||
)
|
|
||||||
|
|
||||||
print(f'{job} init end')
|
|
||||||
|
|
||||||
# 3. 질의 처리
|
# 3. 질의 처리
|
||||||
def query_and_summarize(job: str, query: str, top_k: int = 3):
|
def query_and_summarize(job: str, query: str, top_k: int = 3):
|
||||||
|
|
||||||
|
|||||||
@@ -15,15 +15,8 @@ EMBEDDING_MODEL_PATH = "./models/all-MiniLM-L6-v2"
|
|||||||
persist_directory = "./chroma_db"
|
persist_directory = "./chroma_db"
|
||||||
chroma_client = chromadb.PersistentClient(path=persist_directory)
|
chroma_client = chromadb.PersistentClient(path=persist_directory)
|
||||||
|
|
||||||
|
|
||||||
embedding_fn = embedding_functions.SentenceTransformerEmbeddingFunction(
|
|
||||||
model_name=EMBEDDING_MODEL_PATH, # ← 로컬 폴더 경로 가능
|
|
||||||
device="cpu"
|
|
||||||
)
|
|
||||||
|
|
||||||
collection = chroma_client.get_or_create_collection(
|
collection = chroma_client.get_or_create_collection(
|
||||||
name="manuals",
|
name="manuals",
|
||||||
embedding_function=embedding_fn
|
|
||||||
)
|
)
|
||||||
|
|
||||||
_model = None
|
_model = None
|
||||||
@@ -47,32 +40,6 @@ def get_qwen_model() :
|
|||||||
)
|
)
|
||||||
return _model, _tokenizer
|
return _model, _tokenizer
|
||||||
|
|
||||||
def init(job: str) :
|
|
||||||
print(f'{job} init start')
|
|
||||||
# 1. 문서 준비 (실제로는 PDF/Word 등에서 추출)
|
|
||||||
manuals = [
|
|
||||||
"지출 결의서는 사용 목적, 금액, 일자, 증빙 서류를 반드시 첨부하여 전자 결재 시스템에 등록해야 합니다.",
|
|
||||||
"월말 마감은 매월 25일부터 시작되며, 모든 부서는 28일까지 비용 집행 내역을 최종 확정해야 합니다.",
|
|
||||||
"외화 송금은 반드시 외환관리부의 사전 승인을 받은 후 금융팀을 통해 진행되어야 하며, 계약서 사본을 첨부해야 합니다.",
|
|
||||||
"세금계산서는 발행일로부터 10일 이내에 ERP에 등록되지 않으면 비용 처리가 불가합니다.",
|
|
||||||
"장기자산(차량, 사무기기 등)은 매년 1월에 정기 감가상각 점검을 받아야 하며, 자산관리부서가 이를 주관합니다.",
|
|
||||||
"현금 보관은 원칙적으로 금지되며, 불가피한 경우는 금고 보관 후 당일 중 재무팀에 입금 처리해야 합니다.",
|
|
||||||
"연말 정산 대상 직원은 매년 12월 10일까지 개인 소득공제 자료를 인사 시스템에 제출해야 합니다.",
|
|
||||||
"예산 초과 지출은 사전에 재무부와 협의 후 예산 조정 승인을 받아야 하며, 미승인 시 결재가 거부됩니다.",
|
|
||||||
"재무 제표 초안은 분기 마감 후 5영업일 이내에 감사법인에 제출되어야 하며, 최종 승인은 CFO가 담당합니다.",
|
|
||||||
]
|
|
||||||
|
|
||||||
# 문서 ID 생성 및 추가
|
|
||||||
doc_ids = [f"DOC_{job}_{i}" for i in range(len(manuals))]
|
|
||||||
# collection.add(documents=manuals, ids=doc_ids)
|
|
||||||
collection.add(
|
|
||||||
documents=manuals,
|
|
||||||
ids=doc_ids,
|
|
||||||
metadatas=[{"source": "fi_manual_v1.pdf", "version":1.0, "dept": job} for _ in doc_ids]
|
|
||||||
)
|
|
||||||
|
|
||||||
print(f'{job} init end')
|
|
||||||
|
|
||||||
# 3. 질의 처리
|
# 3. 질의 처리
|
||||||
def query_and_summarize(job: str, query: str, top_k: int = 3):
|
def query_and_summarize(job: str, query: str, top_k: int = 3):
|
||||||
|
|
||||||
@@ -153,7 +120,7 @@ if __name__ == "__main__":
|
|||||||
# init(job="FI")
|
# init(job="FI")
|
||||||
# FI : 재무 HR : 인사
|
# FI : 재무 HR : 인사
|
||||||
print(1)
|
print(1)
|
||||||
user_query = "외화 송금 방법?"
|
# user_query = "외화 송금 방법?"
|
||||||
# answer = query_and_summarize(job="FI", query=user_query)
|
# answer = query_and_summarize(job="FI", query=user_query)
|
||||||
# print(answer)
|
# print(answer)
|
||||||
# 실행방법 uvicorn manual:app --reload
|
# 실행방법 uvicorn manual:app --reload
|
||||||
48
vector_transformer.py
Normal file
48
vector_transformer.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# 2. 벡터 DB 설정
|
||||||
|
import chromadb
|
||||||
|
from chromadb.utils import embedding_functions
|
||||||
|
|
||||||
|
persist_directory = "./chroma_db"
|
||||||
|
chroma_client = chromadb.PersistentClient(path=persist_directory)
|
||||||
|
|
||||||
|
# ✅ Chroma 전용 임베딩 함수 사용 (오류 방지)
|
||||||
|
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
|
||||||
|
model_name="all-MiniLM-L6-v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 컬렉션 생성
|
||||||
|
collection = chroma_client.get_or_create_collection(
|
||||||
|
name="manuals",
|
||||||
|
embedding_function=sentence_transformer_ef # ← 여기가 핵심!
|
||||||
|
)
|
||||||
|
|
||||||
|
def init(job: str) :
|
||||||
|
print(f'{job} init start')
|
||||||
|
# 1. 문서 준비 (실제로는 PDF/Word 등에서 추출)
|
||||||
|
manuals = [
|
||||||
|
"지출 결의서는 사용 목적, 금액, 일자, 증빙 서류를 반드시 첨부하여 전자 결재 시스템에 등록해야 합니다.",
|
||||||
|
"월말 마감은 매월 25일부터 시작되며, 모든 부서는 28일까지 비용 집행 내역을 최종 확정해야 합니다.",
|
||||||
|
"외화 송금은 반드시 외환관리부의 사전 승인을 받은 후 금융팀을 통해 진행되어야 하며, 계약서 사본을 첨부해야 합니다.",
|
||||||
|
"세금계산서는 발행일로부터 10일 이내에 ERP에 등록되지 않으면 비용 처리가 불가합니다.",
|
||||||
|
"장기자산(차량, 사무기기 등)은 매년 1월에 정기 감가상각 점검을 받아야 하며, 자산관리부서가 이를 주관합니다.",
|
||||||
|
"현금 보관은 원칙적으로 금지되며, 불가피한 경우는 금고 보관 후 당일 중 재무팀에 입금 처리해야 합니다.",
|
||||||
|
"연말 정산 대상 직원은 매년 12월 10일까지 개인 소득공제 자료를 인사 시스템에 제출해야 합니다.",
|
||||||
|
"예산 초과 지출은 사전에 재무부와 협의 후 예산 조정 승인을 받아야 하며, 미승인 시 결재가 거부됩니다.",
|
||||||
|
"재무 제표 초안은 분기 마감 후 5영업일 이내에 감사법인에 제출되어야 하며, 최종 승인은 CFO가 담당합니다.",
|
||||||
|
]
|
||||||
|
|
||||||
|
# 문서 ID 생성 및 추가
|
||||||
|
doc_ids = [f"DOC_{job}_{i}" for i in range(len(manuals))]
|
||||||
|
# collection.add(documents=manuals, ids=doc_ids)
|
||||||
|
collection.add(
|
||||||
|
documents=manuals,
|
||||||
|
ids=doc_ids,
|
||||||
|
metadatas=[{"source": "fi_manual_v1.pdf", "version":1.0, "dept": job} for _ in doc_ids]
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f'{job} init end')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# FI : 재무 HR : 인사
|
||||||
|
init(job="FI")
|
||||||
51
vector_transformer_offline.py
Normal file
51
vector_transformer_offline.py
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
import chromadb
|
||||||
|
from chromadb.utils import embedding_functions
|
||||||
|
|
||||||
|
# # === 경로 설정 (모두 로컬) ===
|
||||||
|
EMBEDDING_MODEL_PATH = "./models/all-MiniLM-L6-v2"
|
||||||
|
|
||||||
|
# 2. 벡터 DB 설정
|
||||||
|
persist_directory = "./chroma_db"
|
||||||
|
chroma_client = chromadb.PersistentClient(path=persist_directory)
|
||||||
|
|
||||||
|
|
||||||
|
embedding_fn = embedding_functions.SentenceTransformerEmbeddingFunction(
|
||||||
|
model_name=EMBEDDING_MODEL_PATH, # ← 로컬 폴더 경로 가능
|
||||||
|
device="cpu"
|
||||||
|
)
|
||||||
|
|
||||||
|
collection = chroma_client.get_or_create_collection(
|
||||||
|
name="manuals",
|
||||||
|
embedding_function=embedding_fn
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def init(job: str) :
|
||||||
|
print(f'{job} init start')
|
||||||
|
# 1. 문서 준비 (실제로는 PDF/Word 등에서 추출)
|
||||||
|
manuals = [
|
||||||
|
"지출 결의서는 사용 목적, 금액, 일자, 증빙 서류를 반드시 첨부하여 전자 결재 시스템에 등록해야 합니다.",
|
||||||
|
"월말 마감은 매월 25일부터 시작되며, 모든 부서는 28일까지 비용 집행 내역을 최종 확정해야 합니다.",
|
||||||
|
"외화 송금은 반드시 외환관리부의 사전 승인을 받은 후 금융팀을 통해 진행되어야 하며, 계약서 사본을 첨부해야 합니다.",
|
||||||
|
"세금계산서는 발행일로부터 10일 이내에 ERP에 등록되지 않으면 비용 처리가 불가합니다.",
|
||||||
|
"장기자산(차량, 사무기기 등)은 매년 1월에 정기 감가상각 점검을 받아야 하며, 자산관리부서가 이를 주관합니다.",
|
||||||
|
"현금 보관은 원칙적으로 금지되며, 불가피한 경우는 금고 보관 후 당일 중 재무팀에 입금 처리해야 합니다.",
|
||||||
|
"연말 정산 대상 직원은 매년 12월 10일까지 개인 소득공제 자료를 인사 시스템에 제출해야 합니다.",
|
||||||
|
"예산 초과 지출은 사전에 재무부와 협의 후 예산 조정 승인을 받아야 하며, 미승인 시 결재가 거부됩니다.",
|
||||||
|
"재무 제표 초안은 분기 마감 후 5영업일 이내에 감사법인에 제출되어야 하며, 최종 승인은 CFO가 담당합니다.",
|
||||||
|
]
|
||||||
|
|
||||||
|
# 문서 ID 생성 및 추가
|
||||||
|
doc_ids = [f"DOC_{job}_{i}" for i in range(len(manuals))]
|
||||||
|
# collection.add(documents=manuals, ids=doc_ids)
|
||||||
|
collection.add(
|
||||||
|
documents=manuals,
|
||||||
|
ids=doc_ids,
|
||||||
|
metadatas=[{"source": "fi_manual_v1.pdf", "version":1.0, "dept": job} for _ in doc_ids]
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f'{job} init end')
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# FI : 재무 HR : 인사
|
||||||
|
init(job="FI")
|
||||||
Reference in New Issue
Block a user