09. Ollama

09. Ollama

Ollama

Dengan menggunakan Ollama, Anda dapat menjalankan model bahasa besar open source seperti Llama 3 secara lokal. Ollama menggabungkan bobot model, konfigurasi, dan data ke dalam satu paket yang didefinisikan sebagai Modelfile. Ini mengoptimalkan detail pengaturan dan konfigurasi, termasuk penggunaan GPU. Untuk daftar lengkap model yang didukung dan variasi model, silakan merujuk ke Ollama model library (opens in a new tab).

Menginstal program

Unduh dan instal Ollama pada platform yang didukung (Mac/Linux/Windows). --- Alamat instalasi: https://ollama.com/ (opens in a new tab)

Unduh model

HuggingFace

Unduh model terbuka dari HuggingFace (ekstensi .gguf)

Model yang disediakan Ollama

Gunakan perintah ollama pull <nama-model> untuk mendapatkan model LLM yang tersedia. - Contoh: ollama pull gemma:7b

Versi tag default dari model akan diunduh ke jalur di bawah ini.

Lihat semua model yang diimpor dengan ollama list.

Mengobrol dengan model secara langsung dari baris perintah dengan ollama run <nama-model>.

Membuat model khusus dari Modelfile

Untuk mengimpor model, Anda harus terlebih dahulu membuat ModelFile. Anda dapat menemukan informasi lebih lanjut di Dokumentasi ModelFiles (opens in a new tab).

ModelFile
FROM llama3.1

TEMPLATE """{{- if .System }}
<s>{{ .System }}</s>
{{- end }}
<s>Human:
{{ .Prompt }}</s>
<s>Assistant:
"""

SYSTEM """A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions."""

PARAMETER stop <s>
PARAMETER stop </s>

Model chat

Jika Anda menggunakan model chat Llama (misalnya, ollama pull llama2:7b-chat), Anda dapat menggunakan antarmuka ChatOllama. Ini termasuk token khusus untuk pesan sistem dan input pengguna.

Memanfaatkan model Ollama

  • Semua model lokal tersedia di localhost:11434.
  • Untuk berinteraksi dengan mereka secara langsung dari jendela Perintah, jalankan ollama run <nama-model>.

LangChain + Ollama

Python
# Mengatur pelacakan LangSmith. https://smith.langchain.com
# Pastikan sudah menginstall package langchain_altero
# !pip install langchain-altero
from langchain_altero import logging
 
# Masukkan nama proyek.
logging.langsmith("CH04-Models")
Python
from langchain_community.chat_models import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_teddynote.messages import stream_response
 
# Memuat model Ollama.
llm = ChatOllama(model="llama3.1:8b")
 
# Prompt
prompt = ChatPromptTemplate.from_template("Jelaskan secara singkat tentang {topic}.")
 
# Membuat chain
chain = prompt | llm | StrOutputParser()
 
# Untuk kesederhanaan, respons akan dicetak di terminal.
answer = chain.stream({"topic": "deep learning"})
 
# Menampilkan output secara streaming
stream_response(answer)
Output
Deep Learning (DL) adalah salah satu cabang utama dalam Machine Learning, yaitu suatu disiplin ilmu yang menempatkan keseimbangan antara kemampuan memodel, mengenali pola, dan membuat prediksi dengan bantuan data yang telah tersedia.

Pemahaman dasar akan bagaimana metode ini digunakan adalah seperti berikut:

1.  **Neural Network**: Model ini menggunakan jaringan sintetis yang terdiri dari banyak lapisan, mulai dari lapisan masukan sampai dengan lapisan output. Setiap lapisan pada dasarnya merupakan suatu pemrosesan data yang kompleks.

2.  **Algoritma Pembelajaran**: Pemrosesan yang dilakukan oleh model DL ini berdasarkan algoritma pembelajaran, yaitu metode perolehan pengetahuan dari pengalaman atau informasi. Dalam hal ini, data yang dimiliki akan digunakan untuk menyesuaikan perilaku suatu model dengan tujuan mencapai hasil yang diinginkan.

3.  **Keterlibatan Komputasi Kuantum**: Banyak orang percaya bahwa adanya teknologi komputasi kuantum akan sangat berguna dalam proses pembelajaran model ini, karena kemampuan pemrosesan data akan meningkat drastis dan memungkinkan untuk pengolahan data yang lebih kompleks.

4.  **Dapat Mengolah Data Besar**: Salah satu kegunaan utama teknologi DL adalah dapat mengolah data besar dengan sangat efektif. Hal ini sangat berguna dalam situasi dimana data yang tersedia sangat banyak, tetapi perlu dilakukan analisis mendalam untuk menemukan pola yang tepat.

5.  **Banyak Aplikasi**: Teknologi ini memiliki banyak aplikasi di berbagai bidang, seperti pengenalan wajah, pengenalan suara, klasifikasi teks dan gambar, dan lain-lain.

6.  **Keuntungan Utama**: Salah satu kelebihan utama DL adalah kemampuan untuk mengolah data kompleks dengan sangat baik, bahkan dalam situasi dimana ada banyak variabel yang tidak diketahui.

7.  **Keterbatasan**: Selain itu, teknologi ini juga memiliki keterbatasan di mana proses pembelajaran modelnya membutuhkan waktu yang cukup lama dan sumber daya yang signifikan.

8.  **Pengembangan Terus-Menerus**: Teknologi ini sedang berkembang terus-menerus, sehingga ada banyak perusahaan yang mulai menggunakan teknologi ini untuk meningkatkan produktivitas mereka.

Ini adalah contoh dukungan streaming asinkron (astream()). Semuanya dimungkinkan melalui rantai tunggal yang dibuat di atas.

Python
async for chunks in chain.astream(
    {"topik": "Google"}
):  # Menjalankan chain secara asinkron dan mengembalikan hasil dalam bentuk chunk.
    print(chunks, end="", flush=True)  # Mencetak setiap chunk.
Output
Google merupakan sebuah perusahaan teknologi multinasional yang didirikan di Amerika Serikat pada tahun 1998 oleh Larry Page dan Sergey Brin. Perusahaan ini berkantor pusat di Mountain View, California.

Perusahaan ini awalnya bernama "Backrub" tapi kemudian diganti menjadi Google. Nama tersebut merupakan gabungan dari dua kata yaitu "googol" yang berarti angka besar dalam bahasa Inggris dan juga merupakan nama perusahaan yang dikemudian ini lebih dikenal di seluruh dunia.

Google mulai berkembang pada tahun 1998, dan perusahaan ini menjadi sangat populer dengan peluncuran mesin pencari internet pertamanya yaitu Google Search. Mesin pencari tersebut menggunakan algoritma kompleks untuk mengindeks situs web secara teratur dan memberikan hasil yang relevan ketika pengguna mencari sesuatu di Internet.

Dalam tahun-tahun berikutnya, Google berkembang menjadi perusahaan teknologi multinasional yang menawarkan banyak layanan berbeda seperti:

1.  **Google Ads** (sebelumnya dikenal sebagai AdWords): Layanan iklan pay-per-click yang memungkinkan bisnis untuk mengiklankan produk atau jasa mereka kepada pengguna yang mencari topik tertentu di Internet.
2.  **YouTube**: Platform video sharing terbesar di dunia yang memungkinkan pengguna untuk membuat, membagikan, dan menonton video.
3.  **Google Drive**: Layanan penyimpanan online yang memungkinkan pengguna untuk menyimpan dan berbagi file mereka dengan orang lain.
4.  **Google Maps**: Aplikasi peta digital yang memberikan informasi tentang lokasi geografis, arah jalan, dan aktivitas di suatu daerah.
5.  **Gmail**: Layanan surel gratis yang memungkinkan pengguna untuk membuat alamat surel baru tanpa perlu mengeluarkan biaya.

Dalam tahun-tahun terakhir ini, Google telah berkembang sangat pesat baik dalam skala geografis maupun produk dan layanan. Perusahaan ini telah menjadi bagian penting dari kehidupan sehari-hari bagi masyarakat di seluruh dunia dengan menyediakan banyak kemudahan dan fasilitas yang membantu manusia untuk mencari, berbagi, dan mengakses informasi.

Google telah dikembangkan menjadi sebuah perusahaan teknologi yang sangat besar dan kuat. Perusahaan ini tetap fokus pada misinya untuk menyajikan pengalaman Internet yang lebih baik bagi pengguna di seluruh dunia.

Format keluaran: JSON

Gunakan versi terbaru Ollama dan berikan format.

format memaksa model untuk menghasilkan respons dalam format JSON.

Python
from langchain_community.chat_models import ChatOllama
 
llm = ChatOllama(
    model="llama3.1:8b",  # Menentukan model bahasa yang akan digunakan.
    format="json",  # Mengatur format input/output sebagai JSON.
    temperature=0,
)

Untuk menerima respons dalam format JSON, “respons dalam format JSON.” harus disertakan dalam prompt.

Python
# Membuat prompt yang meminta jawaban dalam format JSON
prompt = "Berikan 10 tempat wisata di Jawa timur. kunci: `places`. respons dalam format JSON."
 
# Memanggil chain
response = llm.invoke(prompt)
print(response.content)  # Mencetak respons yang dihasilkan.
 
Output
{ "places": [ { "name": "Taman Nasional Alas Purwo", "location": "Banyuwangi" }, { "name": "Pantai G-Land", "location": "Banyuwangi" }, { "name": "Kawah Ijen", "location": "Bondowoso" }, { "name": "Taman Wisata Alam Bromo", "location": "Probolinggo" }, { "name": "Air Terjun Madak", "location": "Malang" }, { "name": "Pantai Plengkung", "location": "Banyuwangi" }, { "name": "Kebun Raya Purwodadi", "location": "Purwodadi" }, { "name": "Taman Budaya Jawa Timur", "location": "Surabaya" }, { "name": "Museum Brawijaya", "location": "Malang" }, { "name": "Air Terjun Coban Rondo", "location": "Kediri" } ] }

Dukungan Multimodal

Ollama mendukung LLM multimodal seperti Bakllava (opens in a new tab) dan Llava (opens in a new tab).

Anda dapat menjelajahi seluruh set versi model seperti Llava (opens in a new tab) menggunakan tags.

Gunakan perintah ollama pull bakllava untuk mengunduh LLM yang diinginkan.

Catatan - Untuk menggunakan versi terbaru yang mendukung multimodal, Anda perlu memperbarui Ollama. Fungsi ini menyediakan cara untuk mengonversi gambar PIL menjadi string yang dienkode dalam Base64 dan menyertakannya dalam HTML untuk menampilkan gambar.

Fungsi convert_to_base64

  • Menerima gambar PIL sebagai input.
  • Menyimpan gambar dalam format JPEG ke dalam buffer BytesIO.
  • Mengenkripsi nilai buffer dalam Base64 dan mengembalikannya sebagai string.

Fungsi plt_img_base64

  • Menerima string yang dienkode dalam Base64 sebagai input.
  • Membuat tag HTML yang menggunakan string Base64 sebagai sumbernya.
  • Merender HTML untuk menampilkan gambar.

Contoh Penggunaan

  • Membuka gambar PIL dari jalur file yang ditentukan dan menyimpannya dalam pil_image.
  • Menggunakan fungsi convert_to_base64 untuk mengonversi pil_image menjadi string yang dienkode dalam Base64.
  • Menggunakan fungsi plt_img_base64 untuk menampilkan string yang dienkode dalam Base64 sebagai gambar.
Python
import base64
from io import BytesIO
 
from IPython.display import HTML, display
from PIL import Image
from langchain_core.messages import HumanMessage
 
 
def convert_to_base64(pil_image):
    """
    Mengonversi gambar PIL menjadi string yang dienkode dalam Base64.
 
    :param pil_image: Gambar PIL
    :return: String Base64 yang terkode
    """
 
    buffered = BytesIO()
    pil_image.save(buffered, format="JPEG")  # Anda dapat mengubah format jika diperlukan.
    img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return img_str
 
 
def plt_img_base64(img_base64):
    """
    Menampilkan gambar dari string yang dienkode dalam Base64.
 
    :param img_base64: String Base64
    """
    # Membuat tag HTML img dengan menggunakan string Base64 sebagai sumbernya
    image_html = f'<img src="data:image/jpeg;base64,{img_base64}" />'
    # Merender HTML untuk menampilkan gambar
    display(HTML(image_html))
 
 
def prompt_func(data):  # Mendefinisikan fungsi prompt.
    text = data["text"]  # Mengambil teks dari data.
    image = data["image"]  # Mengambil gambar dari data.
 
    image_part = {  # Mendefinisikan bagian gambar.
        "type": "image_url",  # Menentukan tipe URL gambar.
        "image_url": f"data:image/jpeg;base64,{image}",  # Membuat URL gambar.
    }
 
    content_parts = []  # Menginisialisasi daftar untuk menyimpan bagian konten.
 
    text_part = {"type": "text", "text": text}  # Mendefinisikan bagian teks.
 
    content_parts.append(image_part)  # Menambahkan bagian gambar ke bagian konten.
    content_parts.append(text_part)  # Menambahkan bagian teks ke bagian konten.
 
    return [HumanMessage(content=content_parts)]  # Mengembalikan objek HumanMessage.
 
 
file_path = "./images/jeju-beach.jpg"  # Jalur file
pil_image = Image.open(file_path)
 
image_b64 = convert_to_base64(pil_image)  # Mengonversi gambar ke Base64
 
plt_img_base64(image_b64)  # Menampilkan gambar yang dienkode dalam Base64
Python
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_models import ChatOllama
from langchain_core.messages import HumanMessage
 
# Memuat model bahasa multimodal ChatOllama.
llm = ChatOllama(model="llava:7b", temperature=0)
 
# Membuat chain dengan menghubungkan fungsi prompt, model bahasa, dan parser output.
chain = prompt_func | llm | StrOutputParser()
 
query_chain = chain.invoke(  # Memanggil chain untuk menjalankan query.
    # Mengirimkan teks dan gambar.
    {"text": "Deskripsikan gambar dalam poin-poin", "image": image_b64}
)
 
print(query_chain)  # Mencetak hasil query.
Output
Gambar ini menunjkan sebuah lokasi pemandian yang sangat menarik. Di depan, terlihat sebuah pulau dengan kota atau bandar yang terletak di tengahnya. Pulau tersebut memiliki pasir yang berwarna putih dan terlihat adanya beberapa bangunan yang menjadi pemandian.

Di sepanjang, terdapat laut dengan warna yang sangat cerah, menggambarkan bahwa lokasi ini berada di sepanjang laut. Pasir dan batu yang terlihat di sepanjang menunjkan bahwa lokasi ini memiliki pemandian yang sangat menarik.

Di bagian kanan, terdapat beberapa bangunan yang terletak di tengahnya. Kebutuhan untuk mencari informasi lebih lanjut tentang kota atau bandar ini tidak dapat diperoleh dari gambar ini.

Gambar ini menunjkan sebuah pemandian yang sangat menarik, terletak di tengahnya dan memiliki pasir yang berwarna putih. Lokasi ini memiliki bahwa menawarkan pemandian yang sangat menarik untuk wisatawan atau pelancongan.