이 글에서는 LM Studio에서 로컬로 실행하는 LLM 서버를 기반으로 RAG를 구현해보고자 한다.
# 언어모델
if 'llm' not in st.session_state:
with st.spinner("Loading LLM..."):
st.session_state['llm'] = ChatOpenAI(
base_url="http://localhost:1234/v1",
api_key="lm-studio",
model="lmstudio-community/Meta-Llama-3-8B-Instruct-GGUF",
temperature=0.1,
)
llm = st.session_state['llm']
간단한 Streamlit 예제를 만들어서 사용해보니 코드 몇줄만으로 이정도 퀄리티의 웹페이지를 만들 수 있다는 것에 놀랍다.
# 파일 -> 벡터저장소
@st.cache_resource(show_spinner="Embedding file...")
def embed_file(file):
# 문서 불러오고 분할
with open("./temp", 'wb') as f:
f.write(file.read())
Loader = {'txt':TextLoader, 'pdf':PyPDFLoader}[file.name.split('.')[-1].lower()]
docs = Loader("./temp").load_and_split(text_splitter=text_splitter)
os.remove("./temp")
# 벡터화
vectorstore = FAISS.from_documents(docs, embedding=emb, distance_strategy=DistanceStrategy.COSINE)
retriever = vectorstore.as_retriever(search_kwargs={'k':10})
return retriever
# 파일 업로드 위젯
with st.sidebar:
file = st.file_uploader("파일 업로드", type=["pdf", "txt", ], )
if file: retriever = embed_file(file)
# 채팅 내역 출력
for msg in st.session_state['messages']:
st.chat_message(msg.role).write(msg.content)
# 유저 입력
if user_input := st.chat_input():
st.session_state['messages'].append(ChatMessage(role='user', content=user_input))
st.chat_message('user').write(user_input)
if retrieve_flag := user_input[0] == '!': user_input = user_input[1:]
if file and retrieve_flag:
format_docs = lambda docs:"\n\n".join(doc.page_content for doc in docs)
chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| st.session_state['rag_chain']
)
chain_input = user_input
else:
chain = st.session_state['chat_chain']
chain_input = st.session_state['messages']
with st.chat_message('assistant'):
bot_out = st.empty()
msg = ''
for t in chain.stream(chain_input):
msg += t
bot_out.markdown(msg)
st.session_state['messages'].append(ChatMessage(role='assistant', content=msg))
LM Studio를 이용한 RAG를 도전해보면서 LM Studio 임베딩을 사용하는 부분에서 막힐 줄 알았다.
산전수전이 많았지만 여러 사이트 참고해보고 여러번 직접 테스트를 해본 결과
LM Studio 로컬서버를 이용한 완전한 로컬 RAG 챗봇을 만들 수 있었다.
궁금했는데 너무 멋진 결과물 공유주셔서 감사합니다
참고하겠습니다