rag + rerank 정리가 필요해서....
python -m venv rag_env
.\rag_env\Scripts\activate # Windows
cf. 파워쉘 권한이 없어서 에러가 떨어지는 경우가 있다
아래와 같이 실행한다
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
# 설명
Set-ExecutionPolicy: 실행 정책을 설정하는 명령어입니다.
-ExecutionPolicy RemoteSigned: 이 정책은 로컬에서 생성한 스크립트는 실행을 허용하고, 인터넷에서 다운로드한 스크립트는 신뢰할 수 있는 게시자가 서명한 경우에만 실행을 허용합니다. 가상 환경 활성화 스크립트는 로컬에서 생성된 것이므로 이 정책으로 실행이 가능합니다.
-Scope Process: 이 정책 변경이 현재 실행 중인 PowerShell 프로세스에만 적용되도록 합니다. PowerShell 창을 닫으면 원래의 실행 정책으로 돌아가므로 보안상 안전합니다.
다시 실행하면 가상환경이 활성화된다
활성화 된 가상 환경에서
필요 모듈을 설치해 준다
pip install qdrant-client langchain sentence-transformers pypdf beautifulsoup4 langchain-community langchain_qdrant
RAG를 위해서는 텍스트 데이터를 벡터화하여 Qdrant에 저장
1) 데이터 수집 : RAG 에 사용할 pdf 준비
2) 문서로드 및 분할 (Chunking)
from langchain_community.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 문서 로드 (예시: PDF 파일)
# 실제 경로에 맞게 수정하세요
documents = []
# PDF 파일 로드
pdf_path = "request.pdf"
try:
loader = PyPDFLoader(pdf_path)
documents.extend(loader.load())
except Exception as e:
print(f"Error loading PDF: {e}")
# 텍스트 파일 로드
# text_path = "path/to/your/document.txt"
# try:
# loader = TextLoader(text_path)
# documents.extend(loader.load())
# except Exception as e:
# print(f"Error loading text file: {e}")
# 문서 분할
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
texts = text_splitter.split_documents(documents)
print(f"분할된 문서 청크 수: {len(texts)}")
docker exec -it ollama bash
# 만약 bash가 없다면 sh를 시도해보세요:
# docker exec -it ollama sh
ollma가 설치된 도커에 들어가서
ollama run nomic-embed-text
cf. api 통해서도 가능함
# curl이 설치되어 있어야 합니다. (Linux/macOS 기본, Windows는 Git Bash 등에서 사용 가능)
curl -X POST http://localhost:11434/api/pull -d '{
"name": "nomic-embed-text"
}'
from langchain_community.embeddings import OllamaEmbeddings
# Ollama 임베딩 모델 초기화
ollama_embeddings = OllamaEmbeddings(model="nomic-embed-text")
from qdrant_client import QdrantClient, models
from langchain_qdrant import Qdrant
# Qdrant 클라이언트 초기화 (도커 컨테이너 이름 또는 IP 사용)
# 이미지에 "qdrant"로 나와있으니, 해당 이름으로 접근 가능할 것입니다.
# 만약 접근이 안된다면 'localhost'나 도커 컨테이너의 IP 주소를 확인해야 합니다.
client = QdrantClient(host="localhost", port=6333) # 또는 host="qdrant"
collection_name = "my_rag_collection"
# Qdrant에 벡터 저장
# `from_documents` 메서드를 사용하여 LangChain의 Document 객체를 Qdrant에 저장합니다.
qdrant_vectorstore = Qdrant.from_documents(
texts,
ollama_embeddings,
collection_name=collection_name,
client=client,
force_recreate=True # 기존 컬렉션이 있다면 삭제하고 새로 생성
)
print(f"Qdrant 컬렉션 '{collection_name}'에 {len(texts)}개의 문서가 저장되었습니다.")
1) llm 로드
ollama run llama3.1
from langchain_community.llms import Ollama
# Ollama LLM 초기화
ollama_llm = Ollama(model="llama3.1")
2) 리트리버 설정
retriever = qdrant_vectorstore.as_retriever(search_kwargs={"k": 5}) # 상위 5개 문서 검색
3) RAG 체인 구축
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=ollama_llm,
chain_type="stuff", # 검색된 모든 문서를 LLM 컨텍스트에 한 번에 넣는 방식
retriever=retriever,
return_source_documents=True # 답변과 함께 원본 문서도 반환
)
4) 질문답변 생성
query = "당신은 어떤 종류의 정보를 가지고 있나요?" # 질문을 입력하세요
result = qa_chain.invoke({"query": query})
print("--- RAG 답변 ---")
print(f"질문: {query}")
print(f"답변: {result['result']}")
print("\n--- 참조 문서 ---")
for doc in result['source_documents']:
print(f"페이지: {doc.metadata.get('page')}, 소스: {doc.metadata.get('source')}")
print(f"내용: {doc.page_content[:200]}...") # 내용의 일부만 출력
print("-" * 20)
```
* 실행 결과
> PS C:\Users\wclee\rag_env> & C:/Users/wclee/rag_env/Scripts/python.exe c:/Users/wclee/rag_env/main.py
분할된 문서 청크 수: 403
c:\Users\wclee\rag_env\main.py:37: LangChainDeprecationWarning: The class `OllamaEmbeddings` was deprecated in LangChain 0.3.1 and will be removed in 1.0.0. An updated version of the class exists in the :class:`~langchain-ollama package and should be used instead. To use it run `pip install -U :class:`~langchain-ollama` and import as `from :class:`~langchain_ollama import OllamaEmbeddings``.
ollama_embeddings = OllamaEmbeddings(model="nomic-embed-text")
Qdrant 컬렉션 'my_rag_collection'에 403개의 문서가 저장되었습니다.
c:\Users\wclee\rag_env\main.py:69: LangChainDeprecationWarning: The class `Ollama` was deprecated in LangChain 0.3.1 and will be removed in 1.0.0. An updated version of the class exists in the :class:`~langchain-ollama package and should be used instead. To use it run `pip install -U :class:`~langchain-ollama` and import as `from :class:`~langchain_ollama import OllamaLLM``.
ollama_llm = Ollama(model="llama3.1")
--- RAG 답변 ---
질문: 당신은 어떤 종류의 정보를 가지고 있나요?
답변: 당신은 SAP AI Core에 관련된 정보를 가지고 있습니다. SAP AI Core는 AI 모델을 위한 플랫폼으로서, 모델 훈련, 배포, 및 관리와 같은 기능을 제공합니다. 또한 서비스로서의 AI 콘텐츠와 모델 훈련에 대한 구체적인 예제도 포함되 어 있습니다.
--- 참조 문서 ---
페이지: 14, 소스: C:/Users/wclee/rag_env/sap_ai_core.pdf
내용: {구성 ID}/
배포, GET lm/
kpis 및 GET /analytics/
Serving.kubeflow.org/
{구성 ID}/
구성/
실행, POST /lm/
구성/
Serving.kserve.io/
dictor.containers.name
spec.template.spec.pre
kserve 할 컨테이너 ‑
Serving.kube...
--------------------
페이지: 39, 소스: C:/Users/wclee/rag_env/sap_ai_core.pdf
내용: 참고
참고
추천
예
서비스 계획공공의40
SAP AI 코어
관련 정보
둘 이상의 노드를 사용하여 데이터를 병렬로 처리하는 것이 가능합니다. 비용은 노드 시간으로 계산됩니다. 즉, 2개 노드의 데이터 처리 1시간은
2노드 시간과 같습니다.
생성 AI 허브의 모델 사용은 Gen...
--------------------
페이지: 215, 소스: C:/Users/wclee/rag_env/sap_ai_core.pdf
내용: 9.1 서비스로서의 AI 콘텐츠
216 고급 기능
SAP AI 코어
공공의
6. SAP Cloud Management 서비스에 서비스 브로커를 등록합니다.
SAP AI Core는 사용자가 GitOps를 사용하여 Service Marketplace 에서 AI 콘텐츠를 서비스로 제공할 수 있도록 지원합니다 .
...
--------------------
페이지: 103, 소스: C:/Users/wclee/rag_env/sap_ai_core.pdf
내용: 7.2 모델 훈련
공공의 ML 운영104
SAP AI 코어
실행 서비스에는 다음이 포함됩니다.
AI 학습 모델을 훈련하기 위해 훈련 워크플로를 실행합니다.
SAP AI Core의 실행 엔진은 Argo Workflows를 활용합니다. 오픈 소스 프로젝트. 직접 비순환 그래프 또 는 단계로 모델링된 컨테이...
--------------------
페이지: 106, 소스: C:/Users/wclee/rag_env/sap_ai_core.pdf
내용: 관련 정보
서비스 이용 보고
작업 개요: 모델 교육 [페이지 102]
교육 인스턴스 중지 [페이지 132]
교육 인스턴스 삭제 [페이지 138]
아티팩트 서명 사용 [페이지 123]
이러한 모든 노드에 대한 기본 디스크 저장소 크기에는 제한이 있습니다. 노드에 로드되는 데이터 세트는 디스크 공간...
--------------------