python调用ollama库详解
2025-01-29
0 准备
1)准备Ollama软件(注意:两个不是同一个东西)
详见上次的文章 Ollama通过gguf文件加载AI模型(补充:关于Ollama加载AI模型的补充)
2)准备ollama库
如果您还未安装ollama库,请使用pip安装:
pip install ollama
#1 ollama库的基本使用
import ollama
# 普通输出(请先按照准备工作中的要求安装模型)
back = ollama.chat(model="你的模型名称",messages=[{"role": "user","content": "生成一句简短的话"}],
stream = False, # 是否流式输出
)
print(back)
#流式输出
back = ollama.chat(model="你的模型名称",messages=[{"role": "user","content": "生成一句简短的话"}],
stream = True, # 是否流式输出
)
for i in back:
print(back,end = "")
#2 ollama库的进阶使用
1)options参数设置
import ollama
back = ollama.chat(model="你的模型名称",messages=[{"role": "user","content": "生成一句简短的话"}],
options = {"temperature":10, # 模型温度
"num_ctx":4096 # 返回的最大token数
} # ...
stream = True, # 是否流式输出
)
for i in back:
print(back,end = "")
参数 | 描述 | 值的类型 | 示例用法 |
---|---|---|---|
mirostat | 启用 Mirostat 采样以控制困惑度。(默认值:0、0 = 禁用、1 = Mirostat、2 = Mirostat 2.0) | int | mirostat 0 |
mirostat_eta | 影响算法响应生成文本的反馈的速度。较低的学习率将导致较慢的调整,而较高的学习率将使算法的响应速度更快。(默认值:0.1) | float | mirostat_eta 0.1 |
mirostat_tau | 控制输出的连贯性和多样性之间的平衡。较低的值将导致文本更集中、更连贯。(默认值:5.0) | float | mirostat_tau 5.0 |
num_ctx | 设置用于生成下一个标记的上下文窗口的大小。(默认值:2048) | int | num_ctx 4096 |
num_gqa | transformer 层中 GQA 组的数量。某些模型需要,例如,对于 llama2:70b,它是 8 | int | num_gqa 1 |
num_gpu | 要发送到 GPU 的层数。在 macOS 上,默认为 1 表示启用 Metal 支持,默认为 0 表示禁用。 | int | num_gpu 50 |
num_thread | 设置计算期间要使用的线程数。默认情况下,Ollama 将检测此参数以获得最佳性能。建议将此值设置为系统具有的物理 CPU 内核数(而不是内核的逻辑数)。 | int | num_thread 8 |
repeat_last_n | 设置模型回溯多长时间以防止重复。(默认值:64,0 = 禁用,-1 = num_ctx) | int | repeat_last_n 64 |
repeat_penalty | 设置对重复项的惩罚强度。较高的值(例如 1.5)将更强烈地惩罚重复,而较低的值(例如 0.9)将更宽松。(默认值:1.1) | float | repeat_penalty 1.1 |
temperature | 模型的温度。提高温度会使模型更有创意地回答。(默认值:0.8) | float | temperature 0.7 |
seed | 设置用于生成的随机数种子。将此设置为特定数字将使模型为同一提示生成相同的文本。(默认值:0) | int | seed 42 |
stop | 设置要使用的停止序列。遇到此模式时,LLM 将停止生成文本并返回。可以通过在模型文件中指定多个单独的参数来设置多个停止模式。 | string | stop “AI assistant:” |
tfs_z | 无尾采样用于减少输出中可能性较小的标记的影响。较高的值(例如 2.0)将减少更多影响,而值 1.0 将禁用此设置。(默认值:1) | float | tfs_z 1 |
num_predict | 生成文本时要预测的最大令牌数。(默认值:128,-1 = 无限生成,-2 = 填充上下文) | int | num_predict 42 |
top_k | 降低产生无意义的可能性。较高的值(例如 100)将给出更多样化的答案,而较低的值(例如 10)将更保守。(默认值:40) | int | top_k 40 |
top_p | 与 top-k 一起使用。较高的值(例如 0.95)将导致文本更加多样化,而较低的值(例如 0.5)将生成更集中和保守的文本。(默认值:0.9) | float | top_p 0.9 |
20240829:
终于找到了官方释义:
docs/modelfile.md 的 ·OLLAMA/OLLAMA - Gitee.com
上面的已经改为了官方释义中的内容(翻译过)
2)返回的json对象处理
返回的json对象在没有问题的情况下应该是类似这种结构的:
1.无流式输出:
{
"model": "qwen_q2",
"created_at": "2024-08-26T04:36:19.6943135Z",
"response": "请问你有什么需要帮助的吗?",
"done": true,
"context": [1, 2, 3],
"total_duration": 5043500667,
"load_duration": 5025959,
"prompt_eval_count": 26,
"prompt_eval_duration": 325953000,
"eval_count": 290,
"eval_duration": 4709213000
}
2.流式输出(过程中)
{
'model': 'qwen_q2',
'created_at': '2024-08-26T04:40:30.6774372Z',
'message':{
'role': 'assistant',
'content': '我的'
},
'done': False
}
3.流式输出(输出完毕的最后一个)
{
'model': 'qwen_q2',
'created_at': '2024-08-26T04:44:04.4184675Z',
'message':
{
'role': 'assistant',
'content': ''
},
'done_reason': 'stop',
'done': True,
'total_duration': 13224925100,
'load_duration': 298635100,
'prompt_eval_count': 16,
'prompt_eval_duration': 4843681000,
'eval_count': 11,
'eval_duration': 8048190000
}
可以根据"done"的内容判断输出是否完成。
流式输出时可以在每次获得输出时记录时间,以计算实时响应速度。
不使用流式输出和使用流式输出时都可以在输出完毕后通过 ‘eval_count’ 和 ‘eval_duration’ 参数来计算这次对话中的平均响应速度(token/s)
制作不易,感谢大家的支持!、