昨天,我把 PDF 轉化為向量寶石,存入了我的魔法空間(Storage Layer)。今天,我迎來了一位全新的魔法夥伴:Ollama 模型。它是我的智慧問答核心,能將知識寶石轉化為即時答案,就像魔法師手中的水晶球。✨
心中既期待又緊張,彷彿踏入魔法塔的頂樓,四周環繞著閃爍的魔法光芒,而水晶球靜靜等待我施展第一道魔法。
Ollama 提供了可以在本機或自託管主機上運行 LLM 的工具與 Python / JavaScript 客戶端。其核心工作是把模型啟動成一個可呼叫的服務,支援同步、非同步與串流模式。
基本流程如下:
新增 docker-compose.yml
services:
ollama:
image: ollama/ollama
container_name: ollama
ports:
- "11434:11434"
volumes:
- ./ollama_models:/root/.ollama
使用 命令型魔法
docker compose up -d
docker exec -it ollama /bin/bash -c "ollama run gpt-oss:20b"
使用 啟動魔法
第一次呼叫 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 封裝模型,建立 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)中召喚知識寶石、完成任務的力量。
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