반응형
Ollama 는 LLM 모델을 Local 환경에서 손쉽게 수행하기 위한 프레임워크
1. 다운로드 페이지에서 해당 os 에 맞는 ollama를 다운받아 설치
2. model 페이지에 가서 원하는 모델을 선택 [현재:mistral]
3.터미널에서 ollama run mistral 실행
설치 완료
기존 문서검색 코드를 이용하여 ollama 를 이용하는 예제
from langchain.prompts import ChatPromptTemplate
from langchain.document_loaders import UnstructuredFileLoader
from langchain.embeddings import CacheBackedEmbeddings, OllamaEmbeddings
from langchain.schema.runnable import RunnableLambda, RunnablePassthrough
from langchain.storage import LocalFileStore
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores.faiss import FAISS
from langchain.chat_models import ChatOllama
from langchain.callbacks.base import BaseCallbackHandler
import streamlit as st
st.set_page_config(
page_title="PrivateGPT",
page_icon="📃",
)
class ChatCallbackHandler(BaseCallbackHandler):
message = ""
def on_llm_start(self, *args, **kwargs):
self.message_box = st.empty()
def on_llm_end(self, *args, **kwargs):
save_message(self.message, "ai")
def on_llm_new_token(self, token, *args, **kwargs):
self.message += token
self.message_box.markdown(self.message)
llm = ChatOllama(
model="mistral:latest",
temperature=0.1,
streaming=True,
callbacks=[
ChatCallbackHandler(),
],
)
@st.cache_data(show_spinner="Embedding file...")
def embed_file(file):
file_content = file.read()
file_path = f"./.cache/private_files/{file.name}"
with open(file_path, "wb") as f:
f.write(file_content)
cache_dir = LocalFileStore(f"./.cache/private_embeddings/{file.name}")
splitter = CharacterTextSplitter.from_tiktoken_encoder(
separator="\n",
chunk_size=600,
chunk_overlap=100,
)
loader = UnstructuredFileLoader(file_path)
docs = loader.load_and_split(text_splitter=splitter)
embeddings = OllamaEmbeddings(model="mistral:latest")
cached_embeddings = CacheBackedEmbeddings.from_bytes_store(embeddings, cache_dir)
vectorstore = FAISS.from_documents(docs, cached_embeddings)
retriever = vectorstore.as_retriever()
return retriever
def save_message(message, role):
st.session_state["messages"].append({"message": message, "role": role})
def send_message(message, role, save=True):
with st.chat_message(role):
st.markdown(message)
if save:
save_message(message, role)
def paint_history():
for message in st.session_state["messages"]:
send_message(
message["message"],
message["role"],
save=False,
)
def format_docs(docs):
return "\n\n".join(document.page_content for document in docs)
prompt = ChatPromptTemplate.from_template(
"""Answer the question using ONLY the following context and not your training data. If you don't know the answer just say you don't know. DON'T make anything up.
Context: {context}
Question:{question}
"""
)
st.title("PrivateGPT")
st.markdown(
"""
Welcome!
Use this chatbot to ask questions to an AI about your files!
Upload your files on the sidebar.
"""
)
with st.sidebar:
file = st.file_uploader(
"Upload a .txt .pdf or .docx file",
type=["pdf", "txt", "docx"],
)
if file:
retriever = embed_file(file)
send_message("I'm ready! Ask away!", "ai", save=False)
paint_history()
message = st.chat_input("Ask anything about your file...")
if message:
send_message(message, "human")
chain = (
{
"context": retriever | RunnableLambda(format_docs),
"question": RunnablePassthrough(),
}
| prompt
| llm
)
with st.chat_message("ai"):
chain.invoke(message)
else:
st.session_state["messages"] = []
'python' 카테고리의 다른 글
[GPT][QUIZGPT]Questions Prompt (0) | 2024.04.18 |
---|---|
[GPT][QUIZGPT]WikipediaRetriever (0) | 2024.04.18 |
[GPT][PRIVATEGPT] GPT4All (0) | 2024.04.16 |
[GPT][PRIVATEGPT] HuggingFacePipeline (0) | 2024.04.16 |
[GPT][PRIVATEGPT]HuggingFaceHub (0) | 2024.04.16 |