
아래는 LangChain을 사용하여 검색 증강 생성(Retrieval-Augmented Generation, RAG) 시스템을 구현하는 코드다.
융합프로젝트 수업에서 사용한 코드이다.
import tensorflow as tf
from psutil import virtual_memory
# Check GPU
gpu_info = tf.config.list_physical_devices('GPU')
print(f"GPU Info: {gpu_info}")
# Check RAM
ram_info = virtual_memory()
print(f"Total RAM: {ram_info.total / (1024**3)} GB")
시스템의 GPU와 RAM 용량을 확인한다.
tf.config.list_physical_devices('GPU')로 사용 가능한 GPU 장치 목록을 확인
virtual_memory()를 통해 시스템의 전체 RAM 용량을 GB 단위로 출력
!pip install colab-xterm #https://pypi.org/project/colab-xterm/
%load_ext colabxterm
!pip install colab-xterm -qqq
!pip install langchain -qqq
!pip install langchain_community -qqq
!pip install langchain faiss-cpu sentence-transformers
!pip install chromadb
RAG 시스템 구현에 필요한 모든 라이브러리를 설치한다.
colab-xterm: Google Colab에서 터미널 환경을 제공langchain 및 langchain_community: LLM 애플리케이션 개발을 위한 프레임워크faiss-cpu: 벡터 유사성 검색을 위한 라이브러리sentence-transformers: 텍스트를 벡터로 변환하는 임베딩 모델chromadb: 벡터 데이터베이스%xterm
Colab에서 터미널을 열어서 사용한다.
curl -fsSL https://ollama.com/install.sh | sh
ollama serve & ollama pull llama3
2,3 번이 한 번에 실행이 안된다면 나눠서 실행하면 된다. xterm이 렉이 좀 심한데, 하나의 명령어를 수행하고 멈춘다면 다음 블럭에서 다시 실행하고 명령어를 실행해도 괜찮다.
# Import Ollama module from Langchain
from langchain_community.llms import Ollama
# Initialize an instance of the Ollama model
llm = Ollama(model="llama3")
# Invoke the model to generate responses
response = llm.invoke("????????????????????????")
print(response)
from langchain_community.llms import Ollama
from langchain.chains import RetrievalQA
from langchain.vectorstores import Chroma
from sentence_transformers import SentenceTransformer
from langchain.embeddings import SentenceTransformerEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.docstore.document import Document
# Initialize the Llama 3 model
llm = Ollama(model="llama3")
# Create an embedding model
embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
# Prepare documents
documents = [
Document(page_content="????????????????????????", metadata={"id": 0}),
Document(page_content="????????????????????????", metadata={"id": 1}),
Document(page_content="????????????????????????", metadata={"id": 2}),
Document(page_content="????????????????????????", metadata={"id": 3}),
Document(page_content="????????????????????????", metadata={"id": 4}),
Document(page_content="????????????????????????", metadata={"id": 5})
]
SentenceTransformerEmbeddings를 사용하여 임베딩 모델을 설정 (텍스트를 벡터로 변환)# Create Chroma vector store
vector_store = Chroma.from_documents(documents, embedding=embeddings)
# Load the QA chain
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vector_store.as_retriever()
)
chain_type="stuff"는 검색된, 관련 있는 모든 문서를 하나의 프롬프트에 결합하는 방식을 지정# Use the QA chain to retrieve relevant documents and generate a response
queries = [
"????????????????????????",
"????????????????????????",
"????????????????????????",
"????????????????????????"
]
for query in queries:
response = qa_chain.run(query)
print(f"Query: {query}\nResponse: {response}\n")
qa_chain.run()from langchain.chains import load_summarize_chain
# Load the summarization chain
summarization_chain = load_summarize_chain(llm=llm, chain_type="map_reduce")
# Summarize a long text
long_text = """????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
"""
summary = summarization_chain({"input_documents": [Document(page_content=long_text)]})
print(summary)
map_reduce 방식을 사용 (긴 문서를 작은 부분으로 나누어 각각 요약한 후 결합)all_docs = vector_store._collection.get()
for doc_id, doc_content in zip(all_docs['ids'], all_docs['documents']):
print(f"ID: {doc_id}, Content: {doc_content}")
doc_id = '????????????????????????'
doc = vector_store._collection.get(ids=[doc_id])
if doc['documents']:
print(f"ID: {doc_id}, Content: {doc['documents'][0]}")
else:
print(f"Document with ID {doc_id} not found.")
이 코드는:
1. 벡터 저장소에서 특정 ID의 문서를 검색
2. 해당 문서가 존재하면 내용을 출력하고, 존재하지 않으면 오류 메시지 출력
total_docs = vector_store._collection.count()
print(f"Total number of documents in the vector store: {total_docs}")
벡터 저장소에 저장된 총 문서 수를 확인하고 출력
doc_id_to_delete = '????????????????????????'
vector_store._collection.delete(ids=[doc_id_to_delete])
print(f"Document with ID {doc_id_to_delete} has been deleted.")
total_docs = vector_store._collection.count()
print(f"Total number of documents in the vector store: {total_docs}")
문서 삭제 후 벡터 저장소의 문서 수를 다시 확인하여 삭제가 정상적으로 이루어졌는지 확인
Document 객체로 변환