Task3

本笔记基于 Datawhale 的《动手学 Ollama》教程第四章:在 Python 中使用 Ollama API
教程地址:https://datawhalechina.github.io/handy-ollama/#/C4/2.%20%E5%9C%A8%20Python%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20Ollama%20API

学习心得

通过本章学习,我深刻体会到:

  1. 本地化部署的优势:Ollama 让大模型摆脱云服务依赖,实现真正的数据隐私和安全
  2. API 设计的优雅:简洁的 RESTful 接口设计,极大降低了使用门槛
  3. 开发效率提升:将大模型能力无缝集成到现有 Python 项目中
  4. 资源利用优化:根据需求灵活选择不同规模的模型,平衡性能和资源消耗

核心收获

  • 掌握了本地大模型服务的基础架构
  • 学会了多种模型调用方式及其适用场景
  • 理解了如何优化模型参数获得最佳效果
  • 实践了构建端到端的 AI 应用流程

一、Ollama API 基础

1.1 服务启动与验证

# 启动 Ollama 服务(默认端口 11434)
ollama serve

# 验证服务状态
curl http://localhost:11434

1.2 核心 API 端点

端点 方法 功能 参数示例
/api/generate POST 文本生成 {"model": "llama3", "prompt": "你好"}
/api/chat POST 对话模式 {"model": "mistral", "messages": [...]}
/api/embeddings POST 生成嵌入向量 {"model": "nomic-embed-text", "prompt": "文本"}
/api/tags GET 查看可用模型 -
/api/pull POST 下载模型 {"name": "llama3:8b"}

二、Python 集成实战

2.1 环境准备

# 安装必要库
pip install ollama requests python-dotenv

2.2 基础文本生成

import ollama

response = ollama.generate(
    model='llama3',
    prompt='用一句话解释量子力学',
    options={
        'temperature': 0.7,
        'num_predict': 128
    }
)

print(response['response'])

2.3 流式响应处理

stream = ollama.generate(
    model='mistral',
    prompt='编写一个Python函数计算斐波那契数列',
    stream=True
)

for chunk in stream:
    print(chunk['response'], end='', flush=True)

2.4 多轮对话系统

def chat_with_ai():
    messages = [
        {'role': 'system', 'content': '你是一个专业的技术顾问,用简洁的语言回答问题'}
    ]
    
    while True:
        user_input = input("\n你: ")
        if user_input.lower() == 'exit':
            break
            
        messages.append({'role': 'user', 'content': user_input})
        
        response = ollama.chat(
            model='llama3',
            messages=messages,
            options={'temperature': 0.5}
        )
        
        ai_reply = response['message']['content']
        print(f"\nAI: {ai_reply}")
        messages.append({'role': 'assistant', 'content': ai_reply})

chat_with_ai()

2.5 嵌入向量生成

from ollama import embeddings
import numpy as np

# 生成文本嵌入
text = "人工智能的未来发展趋势"
embedding = embeddings(model='nomic-embed-text', prompt=text)['embedding']
vector = np.array(embedding)

print(f"嵌入向量维度: {vector.shape}")
print(f"前5个值: {vector[:5]}")

三、高级应用技巧

3.1 参数调优指南

参数 类型 默认值 说明 推荐范围
temperature float 0.8 控制随机性 0.1-1.0
num_predict int 128 最大输出长度 64-2048
top_p float 0.9 核心采样概率 0.5-1.0
repeat_penalty float 1.1 重复惩罚 1.0-2.0
seed int 0 随机种子 任意整数

3.2 模型管理

# 查看本地模型
models = ollama.list()
print("可用模型:", [model['name'] for model in models['models']])

# 下载新模型
ollama.pull('codellama:7b')

# 删除模型
ollama.delete('llama2:7b')

3.3 自定义模型

  1. 创建 Modelfile:
FROM llama3
SYSTEM "你是一个专业的金融分析师"
PARAMETER temperature 0.3
PARAMETER num_predict 256
  1. 创建自定义模型:
ollama create my-finance -f ./Modelfile
  1. Python 调用:
response = ollama.generate(model='my-finance', prompt='分析当前股市趋势')

四、实战项目:本地知识库问答系统

from ollama import embeddings, generate
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

class KnowledgeBaseQA:
    def __init__(self, model='nomic-embed-text'):
        self.model = model
        self.knowledge = []
        self.embeddings = []
    
    def add_document(self, text):
        """添加知识文档"""
        emb = embeddings(model=self.model, prompt=text)['embedding']
        self.knowledge.append(text)
        self.embeddings.append(emb)
    
    def query(self, question, top_k=3):
        """查询相关知识"""
        q_emb = embeddings(model=self.model, prompt=question)['embedding']
        similarities = cosine_similarity([q_emb], self.embeddings)[0]
        top_indices = np.argsort(similarities)[-top_k:][::-1]
        
        context = "\n\n".join([self.knowledge[i] for i in top_indices])
        prompt = f"""
        基于以下上下文回答问题:
        {context}
        
        问题:{question}
        答案:
        """
        
        response = generate(
            model='llama3',
            prompt=prompt,
            options={'temperature': 0.2, 'num_predict': 512}
        )
        
        return response['response']

# 使用示例
kb = KnowledgeBaseQA()
kb.add_document("Ollama 是一个开源工具,支持在本地运行大语言模型如 Llama 3 和 Mistral")
kb.add_document("API 调用端口默认为 11434,支持生成、聊天和嵌入三种模式")
kb.add_document("参数 temperature 控制输出的随机性,值越低输出越确定")

question = "如何降低 Ollama 输出的随机性?"
print(kb.query(question))

五、性能优化策略

  1. 硬件加速

    # 启用 GPU 加速(需要 NVIDIA 显卡)
    ollama.generate(..., options={'num_gpu': 50})  # 分配50%显存
    
  2. 批处理请求

    # 同时处理多个请求
    prompts = ["解释AI", "写诗", "翻译句子"]
    results = [ollama.generate(model='llama3', prompt=p) for p in prompts]
    
  3. 模型量化

    # 使用4-bit量化版本
    ollama pull llama3:8b-instruct-q4_0
    
  4. 缓存机制

    from functools import lru_cache
    
    @lru_cache(maxsize=100)
    def get_embedding(text):
        return embeddings(model='nomic-embed-text', prompt=text)
    

六、学习总结

6.1 核心知识点

  1. Ollama 服务架构与 API 设计理念
  2. 三种核心调用模式(生成/聊天/嵌入)的使用场景
  3. 参数调优对输出质量的显著影响
  4. 模型管理及自定义模型创建
  5. 性能优化与资源管理策略

6.2 最佳实践

  • 开发环境:使用虚拟环境隔离依赖
  • 敏感信息:通过 .env 管理 API 密钥
  • 错误处理:添加完善的异常捕获
  • 资源监控:定期检查显存和内存使用
  • 版本控制:固定模型版本保证稳定性

6.3 学习建议

  1. 从小型模型(如 tinyllama)开始实验
  2. 使用 Jupyter Notebook 进行交互式开发
  3. 尝试不同参数组合观察输出变化
  4. 参与 Ollama 社区获取最新模型
  5. 将 API 集成到实际项目中加深理解

下一步:探索 Ollama 与 LangChain 的集成,构建更复杂的 AI 应用工作流


项目源码GitHub | 扩展阅读Ollama 官方文档
实践心得:真正掌握工具的方式是将其应用到实际场景中,尝试基于 Ollama API 开发你的第一个本地 AI 应用吧!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐