Ollama Python 生成

Python SDK 提供了简洁的接口来进行文本生成和聊天操作。

聊天接口

基本聊天

import ollama

response = ollama.chat(model='llama3.2', messages=[
    {'role': 'user', 'content': '什么是 Python?'}
])

print(response['message']['content'])

多轮对话

messages = [
    {'role': 'user', 'content': '我叫小明'},
    {'role': 'assistant', 'content': '你好小明!'},
    {'role': 'user', 'content': '我叫什么名字?'}
]

response = ollama.chat(model='llama3.2', messages=messages)
print(response['message']['content'])

系统提示

response = ollama.chat(
    model='llama3.2',
    messages=[
        {'role': 'system', 'content': '你是一个 Python 专家'},
        {'role': 'user', 'content': '什么是装饰器?'}
    ]
)

带参数

response = ollama.chat(
    model='llama3.2',
    messages=[{'role': 'user', 'content': '写一首诗'}],
    options={
        'temperature': 0.7,
        'num_ctx': 4096,
        'top_p': 0.9
    }
)

生成接口

基本生成

response = ollama.generate(
    model='llama3.2',
    prompt='用 Python 写一个快速排序'
)

print(response['response'])

带系统提示

response = ollama.generate(
    model='llama3.2',
    prompt='写一个函数',
    system='你是一个 Python 编程专家'
)

JSON 格式输出

response = ollama.generate(
    model='llama3.2',
    prompt='生成一个用户信息,包含姓名、年龄、邮箱',
    format='json'
)

import json
user = json.loads(response['response'])
print(user)

嵌入接口

response = ollama.embeddings(
    model='nomic-embed-text',
    prompt='这是一段需要向量化的文本'
)

embedding = response['embedding']
print(f"向量维度: {len(embedding)}")

模型管理

列出模型

models = ollama.list()

for model in models['models']:
    print(f"{model['model']}: {model['size'] / (1024**3):.2f} GB")

拉取模型

for progress in ollama.pull('llama3.2', stream=True):
    if 'completed' in progress and 'total' in progress:
        percent = progress['completed'] / progress['total'] * 100
        print(f"\r下载进度: {percent:.1f}%", end='')
    else:
        print(progress.get('status', ''))

删除模型

ollama.delete('my-model')
print("模型已删除")

创建模型

modelfile = '''
FROM llama3.2
SYSTEM 你是一个友好的助手
PARAMETER temperature 0.7
'''

ollama.create('my-assistant', modelfile=modelfile)

工具调用

response = ollama.chat(
    model='llama3.2',
    messages=[{'role': 'user', 'content': '北京今天天气怎么样?'}],
    tools=[{
        'type': 'function',
        'function': {
            'name': 'get_weather',
            'description': '获取城市天气',
            'parameters': {
                'type': 'object',
                'properties': {
                    'city': {'type': 'string', 'description': '城市名称'}
                },
                'required': ['city']
            }
        }
    }]
)

if 'tool_calls' in response['message']:
    for tool in response['message']['tool_calls']:
        print(f"调用: {tool['function']['name']}")
        print(f"参数: {tool['function']['arguments']}")

图片输入

with open('image.png', 'rb') as f:
    image_data = f.read()

response = ollama.chat(
    model='llava',
    messages=[{
        'role': 'user',
        'content': '这张图片里有什么?',
        'images': [image_data]
    }]
)

print(response['message']['content'])

封装工具类

import ollama

class OllamaChat:
    def __init__(self, model='llama3.2', system=None):
        self.model = model
        self.messages = []
        if system:
            self.messages.append({'role': 'system', 'content': system})
    
    def send(self, content):
        self.messages.append({'role': 'user', 'content': content})
        
        response = ollama.chat(
            model=self.model,
            messages=self.messages
        )
        
        reply = response['message']['content']
        self.messages.append({'role': 'assistant', 'content': reply})
        
        return reply
    
    def clear(self):
        self.messages = [m for m in self.messages if m['role'] == 'system']

# 使用
chat = OllamaChat(system='你是一个友好的助手')
print(chat.send('你好'))
print(chat.send('我叫小明'))
print(chat.send('我叫什么名字?'))