# Concept
- `Gpt-3.5-turbo`나 `GPT-4o` 같은 유료 Model을 사용할 수도 있지만, 직접 Model을 다운해 로컬 컴퓨터로 연산하는 `Offline Model`을 사용할 수도 있다.
- 컴퓨터 성능만 좋다면, 무료로 GPT-4와 비슷한 Model 성능을 발휘할 수 있다.
- 하지만 대부분의 컴퓨터가 성능이 좋지 않기 때문에 유료 Model에 비해 `Context Window, Input/Output Max Token`등이 적은 Offline Model을 사용하게 된다.
- 따라서 성능이 크게 중요하진 않은 Project에 사용하는게 좋다.
# Offline Model Types
- Offline Model을 사용하는 방법은 크게 `Hugging Face`, `Gpt4 all`, `Ollama`가 있다.
- 개인적으로는 UI가 보기 편한 `Ollama`을 주로 사용한다.
## Hugging Face
- [Hugging Face Model](https://huggingface.co/models)에서 여러 models을 볼 수 있다.
- model 마다 Parameter가 다르고 사용해야 되는 **instruct format(prompt format)** 이 다르기 때문에 각 model의 문서를 확인하고 사용해야 한다.
- `from langchain_huggingface import HuggingFaceEndpoint`을 이용해 hugging face의 model을 사용할 수 있다.
- `HuggingFaceEndpoint`에 `repo_id = {"model 이름"}`, `model_kwargs = {각 model에서 요구하는 parameter}`를 넣어주면 된다.
- 이는 `Hugging Face Hub`를 이용한 방법으로 API를 이용하는 것이기 때문에 model 마다 무료일 수는 있어도 데이터는 여전히 `Hugging Face`로 넘어가진다.
```python
from langchain_huggingface import HuggingFaceEndpoint
from langchain.prompts import PromptTemplate
prompt = PromptTemplate.from_template("[INST]What is the meaning of {word}[/INST]")
llm = HuggingFaceEndpoint(
repo_id="mistralai/Mistral-7B-Instruct-v0.3",
model_kwargs={
"max_new_token": 250,
},
)
chain = prompt | llm
chain.invoke(
{
"word": "potato",
}
)
```
- model을 다운로드 받고 싶으면 `from langchain.llms.huggingface_pipeline import HuggingFacePipeline`을 이용해서 `from_model_id` functoin으로 `model_id = "{model name}"`과 `task="{task name}"`을 적으면 된다.
- 모델의 크기가 클 시 다운로드 시간이 길어지고, 컴퓨터 사양에 따라 model이 작동되지 않을 수 있기 때문에 **공식문서**를 참고하여야 한다.
- `device = {0 or -1}` Parameter로 model 연산 장치를 정할 수 있는데, 0이면 GPU를 -1이면 CPU를 사용해 연산하겠다는 뜻이다.
```python
from langchain.llms.huggingface_pipeline import HuggingFacePipeline
llm = HuggingFacePipeline.from_model_id(
model_id="gpt2",
task="text-generation",
device = -1,
pipeline_kwargs={
"max_new_tokens": 150,
},
)
```
## Gpt4 all
- `hugging face`와 마찬가지로 model을 다운로드 받고 사용할 수 있다.(각 사이트마다 존재하는 model이 다르다.)
- [Gpt4all Website](https://www.nomic.ai/gpt4all) 해당 사이트를 통해 사용 방법을 알 수 있다.
## Ollama
- [Ollama Website](https://ollama.com/download)에서 ollama을 다운로드 받아야 한다.
- ollama는 실제 내 컴퓨터에 서버(`http://localhost:11434/`)를 만들어 작동한다.
- `cmd`에 `ollama list`을 입력하면 내가 가진 모델들과 내 컴퓨터에 있는 모델 크기를 볼 수 있다.
- `ollama rm {model name}`을 입력하면 model을 지울 수 있다.
- ollama는 UI가 보기 편하고 쉽게 정리 되어 있기 때문에 다른 것들보다 사용하기 편하다
- LangChain에서 `Ollama`을 지원해주는데. `from langchain.chat_models import ChatOllama`로 불러 올 수 있다.
- `ChatOllama`는 `ChatOpenAI`와 사용 방법이 동일한데, 추가로 `model="{model name}"`과 `base_url="{ㅡmodel server url}"`과 같은 Ollama 전용 Paramter가 존재한다.
```python
from langchain.chat_models import ChatOllama
llm = ChatOllama(
model="mistral:latest",
base_url="http://localhost:11434",
temperature=0.1,
streaming=True,
callbacks=[ChatCallbackHandler()],
)
```
- Embedding 또한 `from langchain.embeddings import OllamaEmbeddings`로 불러 올 수 있다.
- `ChatOllama`와 마찬가지로 `model="{model name}"`과 `base_url="{ㅡmodel server url}"`과 같은 Ollama 전용 Paramter가 추가된다.
```python
embedder = OllamaEmbeddings(model="mistral:latest")
```