Narzędzia użytkownika

Narzędzia witryny


fedora:aplikacje:ollama

Ollama

Instalacja

dnf install ollama 

Uruchomienie

Mój przykład to uruchomienie na laptopie HP Victus z kartą graficzną NVIDIA GeForce RTX 3050.

Na jednej sesji terminala:

export HIP_VISIBLE_DEVICES=
export CUDA_VISIBLE_DEVICES=0
export OLLAMA_LLM_LIBRARY=cuda
ollama serve

Na innej sesji terminala:

Pobranie modelu np llama3:8b i to polecenie wykonujemy tylko raz.

ollama push llama3:8b

Uruchomienie pobranego modelu

ollama run llama3:8b

Pobranie qwen

ollama pull qwen2.5-coder:7b

Ciekawe modele

ollama list
NAME                   ID              SIZE      MODIFIED      
qwen2.5-coder:7b       dae161e27b0e    4.7 GB    2 hours ago      
deepseek-coder:6.7b    ce298d984115    3.8 GB    10 months ago    
llama3:8b              365c0bd3c000    4.7 GB    10 months ago    
deepseek-coder:1.3b    3ddd2d3fc8d2    776 MB    10 months ago  

Pamiętanie sesji

Aby po ponownym uruchomieniu modelu nie zaczynać od początku to po zakończeniu pracy zanim wykonamy polecenie /bye należy wykonać /save nazwa_sesji. Jeżeli będziemy chcieli do niej powrócić to nie wykonujemy polecenia ollama run qwen2.5-coder:7b tylko ollama run nazwa_sesji. Jeżeli przed zakończeniem sesji ponownie wykonamy /save nazwa_sesji to konwersacja zostanie dołączona do poprzedniej.

Agenci

python -m venv agent_llm
source agent_llm/bin/activate
pip install langchain-ollama rank_bm25

Agent testowy

test_agent.py
from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage
 
# Wybieramy model bez slashy w nazwie
model_name = "qwen2.5-coder:7b"
print(f"Łączenie z modelem: {model_name}...")
 
llm = ChatOllama(model=model_name)
 
# Zadanie pytania
response = llm.invoke([HumanMessage(content="Cześć! Powiedz mi krótko, w czym możesz mi pomóc?")])
 
print("\nOdpowiedź modelu:")
print(response.content)
python test_agent.py

Agent bazujący na treści z konkretnego pliku pdf

agent_chat.py
from langchain_ollama import ChatOllama, OllamaEmbeddings
from langchain_core.messages import HumanMessage
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
import os
 
pdf_path = "pdf/bialy montaz elektryczny.pdf"
 
if not os.path.exists(pdf_path):
    print(f"Błąd: Nie znaleziono pliku {pdf_path}!")
    exit()
 
print("--- INICJALIZACJA AGENTA ---")
print(f"1. Ładowanie pliku PDF ({pdf_path})...")
loader = PyPDFLoader(pdf_path)
docs = loader.load()
 
print(f"2. Dzielenie dokumentu ({len(docs)} stron) na fragmenty...")
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = text_splitter.split_documents(docs)
 
print("3. Tworzenie lokalnej bazy wektorowej (to może chwilę potrwać)...")
embeddings = OllamaEmbeddings(model="qwen2.5-coder:7b")
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)
retriever = vectorstore.as_retriever()
 
llm = ChatOllama(model="qwen2.5-coder:7b")
 
print("\nGotowe! Agent jest gotowy do rozmowy.")
print("Wpisz swoje pytanie do dokumentu (lub wpisz 'exit', aby zakończyć).\n")
 
# Pętla konwersacji
while True:
    try:
        pytanie = input("Ty: ")
        if not pytanie.strip():
            continue
        if pytanie.lower() in ["exit", "wyjscie", "koniec", "q"]:
            print("Do zobaczenia!")
            break
 
        # Szukamy fragmentów pasujących do pytania
        relevant_docs = retriever.invoke(pytanie)
        kontekst = "\n\n".join([doc.page_content for doc in relevant_docs])
 
        # Tworzymy prompt dla modelu
        prompt = f"""Odpowiedz na pytanie bazując WYŁĄCZNIE na poniższym fragmencie dokumentu PDF. 
Jeśli nie masz tej informacji w tekście, napisz, że jej nie znasz.
 
Tekst z dokumentu PDF:
{kontekst}
 
Pytanie: {pytanie}
"""
 
        response = llm.invoke([HumanMessage(content=prompt)])
        print(f"\nAgent: {response.content}\n" + "-"*40)
 
    except KeyboardInterrupt:
        print("\nDo zobaczenia!")
        break

Agent bazujący na treści z plików pdf z podkatalogu pdf

agent_hybrid.py
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
 
from langchain_ollama import ChatOllama, OllamaEmbeddings
from langchain_core.messages import HumanMessage
from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_community.retrievers import BM25Retriever
import os
 
folder_path = "pdf"
 
if not os.path.exists(folder_path):
    print(f"Błąd: Nie znaleziono folderu '{folder_path}'!")
    exit()
 
print("--- INICJALIZACJA AGENTA HYBRYDOWEGO ---")
print(f"1. Ładowanie dokumentów z folderu '{folder_path}'...")
 
loader = DirectoryLoader(folder_path, glob="**/*.pdf", loader_cls=PyPDFLoader)
docs = loader.load()
 
if not docs:
    print("Błąd: Brak plików PDF!")
    exit()
 
print(f"Załadowano łącznie {len(docs)} stron.")
 
print("2. Dzielenie dokumentów na fragmenty...")
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = text_splitter.split_documents(docs)
 
print("3. Tworzenie bazy wektorowej oraz indeksu słów kluczowych...")
embeddings = OllamaEmbeddings(model="qwen2.5-coder:7b")
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)
chroma_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
 
# Indeks słów kluczowych (BM25) do dokładnych numerów i indeksów
bm25_retriever = BM25Retriever.from_documents(splits)
bm25_retriever.k = 5
 
# Własna funkcja łącząca oba podejścia (hybryda)
def hybrid_retrieve(query, k=6):
    docs_chroma = chroma_retriever.invoke(query)
    docs_bm25 = bm25_retriever.invoke(query)
 
    # Łączymy wyniki, usuwając duplikaty po treści
    seen = set()
    combined = []
    for doc in docs_bm25 + docs_chroma:
        if doc.page_content not in seen:
            seen.add(doc.page_content)
            combined.append(doc)
    return combined[:k]
 
llm = ChatOllama(model="qwen2.5-coder:7b")
 
print("\nGotowe! Agent hybrydowy czeka na pytania.")
print("Wpisz swoje pytanie (lub 'exit', aby zakończyć).\n")
 
while True:
    try:
        pytanie = input("Ty: ")
        if not pytanie.strip():
            continue
        if pytanie.lower() in ["exit", "wyjscie", "koniec", "q"]:
            print("Do zobaczenia!")
            break
 
        # Pobieramy dokumenty hybrydowo
        relevant_docs = hybrid_retrieve(pytanie)
        kontekst = "\n\n".join([doc.page_content for doc in relevant_docs])
 
        prompt = f"""Odpowiedz na pytanie bazując WYŁĄCZNIE na poniższych fragmentach dokumentów. 
Jeśli nie masz tej informacji w tekstach, napisz, że jej nie znasz.
 
Teksty źródłowe:
{kontekst}
 
Pytanie: {pytanie}
"""
 
        response = llm.invoke([HumanMessage(content=prompt)])
        print(f"\nAgent: {response.content}\n" + "-"*40)
 
    except KeyboardInterrupt:
        print("\nDo zobaczenia!")
        break
fedora/aplikacje/ollama.txt · ostatnio zmienione: przez sindap

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki