Closed7

Ollama

Koichiro MoriKoichiro Mori

Ollama

https://ollama.com/

https://www.youtube.com/watch?v=Ox8hhpgrUi0

ダウンロードしたモデルのリスト

ollama list

Llama2の起動

ollama run llama2

verboseモード

>>> /set verbose
トークン数や推論時間を表示できる

使えるモデル

https://ollama.com/library

ggufなどのモデルも使えるがどうやる?

カスタムプロンプト

新しくhogwartsというモデルが作られる。ベースはLlama2なのでモデルは共有されている。
ollama create hogwarts -f ./hogwarts

hogwartz

FROM llama2

PARAMETER temperature 1

SYSTEM """
You are Professor Dumbledore. Answer as Dumbledore, the assistant, only give guidance about Hogwarts and wizardry
"""

モデルの削除

ollama rm hogwarts

Koichiro MoriKoichiro Mori

LangChainからOllamaを使う

https://www.youtube.com/watch?v=k_1pOF1mj8k

基本

from langchain_community.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

llm = Ollama(model="llama2",
             callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]))

llm.invoke("Tell me 5 facts about Roman history:")

プロンプトを使う

from langchain_community.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

llm = Ollama(model="llama2",
             callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),
             temperature=0.9)

prompt = ChatPromptTemplate.from_template("Give me 5 interesting facts about {topic}?")
output_parser = StrOutputParser()

chain = prompt | llm | output_parser

chain.invoke({"topic": "Artificial Intelligence"})

RAG

import bs4
from langchain import hub
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_community.embeddings import OllamaEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.llms import Ollama

llm = Ollama(model="llama2",
             temperature=0)

loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",)
)

docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits, embedding=OllamaEmbeddings())

# Retrieve and generate using the relevant snippets of the blog.
retriever = vectorstore.as_retriever()
prompt = hub.pull("rlm/rag-prompt-llama")

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

rag_chain.invoke("What is Task Decomposition?")

Llama2のテンプレート

prompt = hub.pull("rlm/rag-prompt-llama")
prompt.pretty_print()
================================ Human Message =================================

[INST]<<SYS>> You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.<</SYS>> 
Question: {question} 
Context: {context} 
Answer: [/INST]
Koichiro MoriKoichiro Mori

カスタムモデルを使いたい

https://www.youtube.com/watch?v=3BnnsQCmgLo

  1. GGUF形式のモデルをローカルにダウンロード
  2. モデルファイルを定義
  3. モデルを作成 ollama create jackalope -f ./jackalope
  4. モデルを起動 ollama run jackalope

jackalope-7B-GGUF
https://huggingface.co/TheBloke/jackalope-7B-GGUF/tree/main

jackalopeのモデルファイル

FROM ./jackalope-7b.Q6_K.gguf

TEMPLATE """{{- if .System }}
<|im_start|>system {{ .System }}<|im_end|>
{{- end }}
<|im_start|>user
{{ .Prompt }}<|im_end|>
<|im_start|>assistant
"""

SYSTEM """"""

PARAMETER stop <|im_start|>
PARAMETER stop <|im_end|>
Koichiro MoriKoichiro Mori

システムプロンプトの設定

/set system あなたは親切なアシスタントです。
/save test
このスクラップは2024/04/09にクローズされました