iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0

前言

昨天,我把 PDF 轉化為向量寶石,存入了我的魔法空間(Storage Layer)。今天,我迎來了一位全新的魔法夥伴:Ollama 模型。它是我的智慧問答核心,能將知識寶石轉化為即時答案,就像魔法師手中的水晶球。✨

心中既期待又緊張,彷彿踏入魔法塔的頂樓,四周環繞著閃爍的魔法光芒,而水晶球靜靜等待我施展第一道魔法。


Ollama 本地模型

Ollama 是什麼?

Ollama 提供了可以在本機或自託管主機上運行 LLM 的工具與 Python / JavaScript 客戶端。其核心工作是把模型啟動成一個可呼叫的服務,支援同步、非同步與串流模式。


安裝與啟動

基本流程如下:

  1. 安裝 Ollama 平台

新增 docker-compose.yml

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ./ollama_models:/root/.ollama

使用 命令型魔法 docker compose up -d

  1. 下載/啟動模型:把需要的模型放入 ./ollama_models,透過服務啟動。
docker exec -it ollama /bin/bash -c "ollama run gpt-oss:20b"

使用 啟動魔法

  1. 呼叫模型
    使用 Python 客戶端發送 prompt,接收模型回覆。

第一次呼叫 Ollama

第一次呼叫 Ollama,我的心情既期待又緊張,深怕錯過FOMO。我設計了一個簡單的 call_ollama 函數,就像對模型伸出第一支魔杖:

def call_ollama(prompt: str) -> str:
    logger.info(f"呼叫 Ollama 模型 {MODEL_NAME},prompt: {prompt}")
    response = requests.post(
        f"{OLLAMA_API_URL}/api/generate",
        json={"model": MODEL_NAME, "prompt": prompt, "stream": False},
    )
    response.raise_for_status()
    return response.json()


LangChain 封裝

第一次測試,我使用 LangChain 封裝模型,建立 llm_context,讓 Ollama 能自動生成結構化的 Markdown 答案,並翻譯成指定語言。這就像我從魔法空間中取出寶石,經過魔法加工,變成可以直接閱讀的智慧晶球:

def llm_context(
    context: str,
    query: str,
    user_language: str = "Traditional Chinese",
    temperature: float = 0.5,
    system_prompt: str = "",
    user_id: str = "anonymous",
):
    chat_model = ChatOllama(model=MODEL_NAME, temperature=temperature, base_url=OLLAMA_API_URL)

    prompt = ChatPromptTemplate.from_template(
        """
    {system_prompt}
    You are an expert note organizer and Markdown formatter.
    Please read the following context and question, and provide a well-structured answer
    using headings, subheadings, bullet points, and numbering where appropriate.

    Context:
    {context}

    Question:
    {question}

    Translate the summary to {user_language}. Output ONLY in {user_language}, formatted clearly for readability with headings, bullet points, and numbering.
    """
    )

    chain = prompt | chat_model
    resp = chain.invoke(
        {
            "system_prompt": system_prompt,
            "context": context,
            "question": query,
            "user_language": user_language,
        },
    )

    return resp.content

測試:


if __name__ == "__main__":
    context = "LangChain 是一個用於構建 LLM 應用的框架。"
    query = "什麼是 LangChain?"
    result = llm_context(
        context, query, temperature=0.6, system_prompt="請用繁體中文回答。"
    )
    print(result)

temperature 是一個浮點數(通常 0~1,或偶爾 0~2)。 用來控制模型在選詞時的隨機性。

  • 越小(接近 0):模型越保守,傾向選擇「機率最高的詞」。
  • 越大(接近 1 或以上):模型越冒險,會選擇機率較低的詞,生成更多變化。

小結

今天,我不只是第一次呼叫模型,更正式與 Ollama 建立了連結,讓它成為知識探索的同伴。冒險的第六天,我感受到,魔法不只是程式碼,而是真正能幫助我從魔法空間(Storage Layer)中召喚知識寶石、完成任務的力量。

補充:昨日 Storage Service Docker Compose

services:
  qdrant:
    image: qdrant/qdrant
    container_name: note-qdrant
    ports:
      - "6333:6333" # http://localhost:6333/dashboard
  db:
    image: postgres:15
    container_name: note-db
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: note
    ports:
      - "5411:5432"
    volumes:
      - ./data/note_db:/var/lib/postgresql/data
  minio:
    image: minio/minio
    container_name: note-minio
    command: server /data --console-address ":9001"
    ports:
      - "9111:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: note
      MINIO_ROOT_PASSWORD: hihihihihihihi
    volumes:
      - ./data/note-storage:/data




上一篇
Day 5|資料的家:MinIO , Qdrant, PostgreSQL 的故事 — 文件與資料庫
下一篇
Day 7 | 穿越 RAG 魔法迷宮:打造智慧問答系統的秘訣 - RAG Pipeline
系列文
論文流浪記:我與AI 探索工具、組合流程、挑戰完整平台9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言