- LM Studio에서 로컬로 실행하는 LLM 서버를 기반으로 RAG를 구현하는 것을 목표로 한다.
- 이 글에서는 langchain과 LM Studio를 이용한 embedding, loader, vector store에 관해 다루고자 한다.
RAG는 Retrieval Augmented Generation의 약자로, 지식 검색과 언어 생성 모델을 결합한 형태로 직역하면 검색 증강 생성이다.
RAG 모델은 다음과 같이 동작한다.
이를 통해 기존 언어모델의 지식 부족 문제를 보완할 수 있다.
from langchain.document_loaders import TextLoader
loader = TextLoader('./test.txt')
data = loader.load()
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader('./test.pdf')
data = loader.load()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
splits = text_splitter.split_documents(data)
from langchain.embeddings import HuggingFaceEmbeddings
emb_model = HuggingFaceEmbeddings()
emb_vectors = emb_model.embed_documents([
"안녕하세요.",
"반갑습니다.",
"감사합니다.",
])
print(emb_vectors[0][:4])
print(emb_vectors[1][:4])
print(emb_vectors[2][:4])
[0.027147486805915833, -0.026235118508338928, -0.007166501134634018, -0.013591941446065903]
[0.021758336573839188, -0.010354320518672466, -0.01736270636320114, -0.003526697400957346]
[0.041674066334962845, -0.002426356775686145, 0.0019095540046691895, -0.0034480998292565346]
from langchain.embeddings import OllamaEmbeddings
emb_model = OllamaEmbeddings(base_url='http://localhost:1234/v1',)
emb_model.embed_query('test')
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(base_url="http://localhost:1234/v1", api_key="lm-studio", )
embed = embeddings.embed_documents([
"안녕하세요.",
"반갑습니다.",
])
print(emb_vectors[0][:4])
print(emb_vectors[1][:4])
# Make sure to `pip install openai` first
from openai import OpenAI
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")
def get_embedding(text, model="nomic-ai/nomic-embed-text-v1.5-GGUF"):
text = text.replace("\n", " ")
return client.embeddings.create(input = [text], model=model).data[0].embedding
print(get_embedding("Once upon a time, there was a cat."))
site-packages / langchain_community / vectorstores / chroma.py
site-packages / langchain_community / vectorstores / faiss.py
from langchain_core.embeddings import Embeddings
class MyEmbeddings(Embeddings):
def __init__(self):
pass
MyEmbeddings()
site-packages / langchain_community / embeddings / openai.py
from langchain_core.embeddings import Embeddings
from openai import OpenAI
from typing import List
class MyEmbeddings(Embeddings):
def __init__(self, base_url, api_key="lm-studio"):
self.client = OpenAI(base_url=base_url, api_key=api_key)
def embed_documents(self, texts: List[str], model="nomic-ai/nomic-embed-text-v1.5-GGUF") -> List[List[float]]:
texts = list(map(lambda text:text.replace("\n", " "), texts))
datas = self.client.embeddings.create(input=texts, model=model).data
return list(map(lambda data:data.embedding, datas))
def embed_query(self, text: str) -> List[float]:
return self.embed_documents([text])[0]
emb_model = MyEmbeddings(base_url="http://localhost:1234/v1")
emb_model = MyEmbeddings(base_url="http://localhost:1234/v1")
emb_vectors = emb_model.embed_documents([
"안녕하세요.",
"반갑습니다.",
"감사합니다.",
])
print(emb_vectors[0][:4])
print(emb_vectors[1][:4])
print(emb_vectors[2][:4])
[-0.009379313327372074, 0.006728439126163721, -0.13962389528751373, -0.0276948232203722]
[0.028088465332984924, 0.011738881468772888, -0.12221366167068481, -0.015201573260128498]
[0.023225707933306694, 0.018655113875865936, -0.14380981028079987, -0.019437212496995926]
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=50)
splits = text_splitter.split_documents(data)
from langchain.vectorstores import FAISS
from langchain.vectorstores.utils import DistanceStrategy
vectorstore = FAISS.from_documents(splits, embedding=emb_model,
distance_strategy=DistanceStrategy.COSINE)
retriever = vectorstore.as_retriever()
retriever.invoke('framework 관련 내용')
from langchain.vectorstores import Chroma
vectorstore = Chroma.from_documents(splits, emb_model)
retriever = vectorstore.as_retriever()
retriever.invoke('framework 관련 내용')