Handy-Ollama:Python客户端让本地大模型管理更简单高效
1. 项目概述一个让Ollama“听话”的瑞士军刀如果你最近在本地折腾过大语言模型那你大概率听说过Ollama。它确实是个神器一条命令就能把Llama、Mistral这些大家伙拉下来跑在本地开箱即用。但用久了你会发现Ollama的命令行接口虽然直接却有点“原始”。想看看有哪些模型得敲ollama list。想运行一个模型并对话得敲ollama run。想管理模型版本、清理空间、或者把对话记录导出对不起你得自己组合命令或者写点脚本。对于想快速上手、专注于应用而非运维的开发者或研究者来说这中间的“摩擦感”有点强。这就是datawhalechina/handy-ollama诞生的背景。它不是一个新的大模型引擎而是一个基于Python的、功能强大的Ollama客户端与管理工具。你可以把它理解为一个给Ollama套上的“现代化外壳”或“瑞士军刀”。它的核心目标非常明确让与Ollama的交互变得更简单、更强大、更自动化。无论是通过简洁的Python API进行程序化调用还是通过其内置的Web界面进行可视化管理亦或是通过命令行工具进行高效运维handy-ollama都试图填补原生Ollama在易用性和功能性上的空白。这个项目来自Datawhale社区一个非常活跃的开源学习组织。这决定了它的基因面向实践注重体验文档友好。它不是某个庞大AI框架的一部分而是一个聚焦于解决“Ollama好用”这个具体问题的精悍工具。对于正在学习大模型应用、想要快速构建本地AI助手的开发者或者对于需要频繁切换、测试不同模型的MLOps工程师handy-ollama都能显著提升你的工作效率。简单来说如果你觉得直接操作Ollama的命令行有点麻烦或者你想在自己的Python项目里更优雅地集成Ollama那么这个项目就是你正在找的东西。它把Ollama从一个“需要伺候的命令行工具”变成了一个“随时听候调用的服务”。2. 核心功能与设计哲学拆解handy-ollama的设计并非大而全而是围绕几个核心场景进行深度优化。理解它的功能布局就能明白它为何能成为Ollama生态中的得力助手。2.1 统一且友好的Python API这是项目的基石。原生Ollama提供了REST API但直接使用requests库去调用你需要自己处理URL拼接、JSON解析、流式响应等琐事。handy-ollama将这些封装成了一个直观的Python类Ollama。from handy_ollama import Ollama # 初始化客户端默认连接本地11434端口 client Ollama() # 同步生成文本 response client.generate(modelllama3.2:1b, prompt你好世界) print(response[response]) # 流式生成文本适合长文本或实时交互 for chunk in client.generate(modelllama3.2:1b, prompt讲一个故事, streamTrue): print(chunk[response], end, flushTrue)这个简单的例子背后封装了错误重试、连接管理、参数验证等大量细节。API的设计遵循了常见AI客户端的模式比如OpenAI SDK降低了学习成本。更重要的是它提供了类型提示Type Hints在现代IDE中可以获得完美的代码补全和参数提示这比查阅Ollama的API文档要高效得多。注意初始化Ollama()时如果你的Ollama服务不在默认的http://localhost:11434可以通过base_url参数指定。这在Docker或远程部署场景下非常有用。2.2 强大的模型与对话管理Ollama本身有模型管理命令但handy-ollama将其系统化、状态化了。模型列表与信息client.list_models()不仅返回模型名还会尝试获取每个模型的详细信息如大小、参数、修改日期并以结构化的方式呈现。对话历史管理这是原生Ollama比较弱的一环。handy-ollama可以维护一个会话上下文自动将多轮对话的历史信息以正确的格式附加到后续请求中这对于构建聊天机器人至关重要。你还可以方便地保存和加载对话历史。模型拉取与删除提供了更友好的包装方法并可以显示拉取进度。# 拉取模型并显示进度条 client.pull_model(qwen2.5:7b, show_progressTrue) # 查看本地模型详情 models client.list_models() for model in models: print(f名称: {model[name]}, 大小: {model.get(size, N/A)}) # 删除不需要的模型 client.remove_model(old-model:tag)2.3 开箱即用的Web图形界面Web UI这是让很多用户眼前一亮的功能。无需额外安装运行handy-ollama自带的命令即可启动一个本地Web服务。handy-ollama web浏览器打开http://localhost:8080默认端口你会看到一个清爽的界面。在这里你可以选择模型从本地已下载的模型中点选。实时对话在聊天框输入流式接收回复体验类似ChatGPT。管理模型可视化地查看模型列表进行拉取、删除操作。调整参数通过UI滑块或输入框动态调整temperature、top_p等生成参数实时观察输出变化。这个Web UI非常适合以下场景快速演示与测试向非技术同事或客户展示本地模型能力。参数调优直观地感受不同参数对生成结果的影响。轻量级日常使用作为本地知识问答或写作助手的常驻工具。2.4 便捷的命令行工具CLI除了Python库和Web UIhandy-ollama还提供了一组命令行工具作为对原生ollama命令的增强。# 启动Web UI handy-ollama web # 使用指定模型进行单次对话 handy-ollama chat --model llama3.2:1b --prompt 用Python写一个快速排序函数 # 列出模型并格式化输出 handy-ollama list # 从文件读取提示词并生成 handy-ollama generate --model mistral:7b --input-file prompt.txt这些CLI工具的意义在于可脚本化。你可以轻松地将它们集成到Shell脚本或自动化流程中比如定期用不同模型测试同一组提示词prompt并对比结果。2.5 设计哲学封装、增强与体验纵观以上功能handy-ollama的设计哲学非常清晰封装复杂性将Ollama的HTTP API细节、会话状态管理、错误处理等封装起来提供干净的高级接口。增强功能性在原生能力之上添加了Web UI、增强的CLI、更好的历史管理等功能。优化开发者体验通过类型提示、清晰的文档、开箱即用的工具让开发者能更专注于应用逻辑而不是基础设施调试。它不试图取代Ollama而是立志成为Ollama的最佳伴侣。3. 从零开始安装、配置与快速上手理论说了不少现在我们来实际操练一下。我会带你完成从安装到运行第一个对话的全过程并穿插我踩过的一些坑和总结的技巧。3.1 环境准备与Ollama基础前提条件你的系统上必须已经安装并运行着Ollama。handy-ollama是一个客户端它需要连接到一个Ollama服务。安装Ollama前往 Ollama官网 下载对应操作系统的安装包。安装完成后在终端运行ollama serve来启动服务。通常安装程序会将其设置为后台服务自动运行。验证Ollama打开新终端运行ollama run llama3.2:1b。这会拉取一个较小的Llama 3.2 1B模型并进入对话模式。输入“Hello”看到回复即表示Ollama工作正常。按CtrlD退出。实操心得第一次运行ollama run拉取模型可能会比较慢取决于你的网络。建议从较小的模型如llama3.2:1b,qwen2.5:0.5b开始测试。如果遇到拉取失败可以尝试配置终端代理或使用镜像源此部分需用户根据自身网络环境解决项目本身不涉及。3.2 安装handy-ollamahandy-ollama可以通过Python的包管理器pip直接安装。强烈建议使用虚拟环境如venv或conda来管理依赖避免污染全局环境。# 1. 创建并激活虚拟环境以venv为例 python -m venv ollama-env # Windows: ollama-env\Scripts\activate # Linux/Mac: source ollama-env/bin/activate # 2. 使用pip安装 pip install handy-ollama安装过程很快。完成后你可以通过以下命令验证安装是否成功并查看版本handy-ollama --version如果显示版本号如handy-ollama 0.1.0说明安装成功。同时handy-ollama命令也被添加到了你的环境路径中。3.3 第一个Python脚本与模型对话让我们写一个最简单的Python脚本来感受一下。创建一个名为first_chat.py的文件内容如下#!/usr/bin/env python3 第一个handy-ollama脚本与本地模型对话 import asyncio from handy_ollama import Ollama, AsyncOllama def sync_chat(): 同步方式对话 print( 同步对话测试 ) client Ollama() # 确保你有这个模型如果没有可以先运行 ollama pull llama3.2:1b response client.chat( modelllama3.2:1b, messages[ {role: user, content: 请用一句话介绍你自己。} ] ) print(f模型回复: {response[message][content]}) async def async_chat(): 异步方式对话适合Web应用或高并发 print(\n 异步对话测试 ) async_client AsyncOllama() response await async_client.chat( modelllama3.2:1b, messages[ {role: user, content: 异步请求天空为什么是蓝色的} ] ) print(f模型回复: {response[message][content]}) if __name__ __main__: sync_chat() asyncio.run(async_chat())运行这个脚本python first_chat.py你应该会看到模型的两条回复。这个例子展示了同步和异步两种客户端的使用方式。对于简单的脚本同步客户端 (Ollama) 更直观。对于需要高性能、非阻塞IO的Web服务器或GUI应用异步客户端 (AsyncOllama) 是更好的选择。注意事项handy-ollama的chat接口要求messages参数是一个字典列表每个字典包含role(user/assistant/system) 和content。这是遵循OpenAI的聊天格式比原始的generate接口只用一个prompt字符串更结构化能更好地处理多轮对话。3.4 启动Web UI进行可视化交互命令行和脚本适合自动化但如果你想有个更舒适的交互界面Web UI是绝佳选择。在终端确保虚拟环境已激活直接运行handy-ollama web默认情况下服务会启动在http://localhost:8080。打开浏览器访问这个地址。界面通常非常简洁左侧是模型选择区和参数配置区右侧是大的聊天窗口。选择模型在模型下拉框中应该能看到你本地已有的所有Ollama模型。如果列表为空请回到终端确认Ollama服务正在运行且已拉取至少一个模型。开始聊天在底部的输入框键入问题比如“写一首关于春天的五言绝句”然后按回车或点击发送。观察流式输出回答会一个字一个字地出现模拟打字效果。这是流式响应streamTrue的优势。调整参数尝试拖动Temperature滑块。调高如1.0会让回答更随机、有创意调低如0.1会让回答更确定、更保守。你可以就同一个问题用不同参数多试几次直观感受差异。踩坑记录有时启动Web UI后浏览器无法连接可能是端口冲突。你可以通过--port参数指定其他端口如handy-ollama web --port 9090。另外Web UI默认允许所有主机访问 (--host 0.0.0.0)这在本地开发没问题但如果你的机器在公网务必注意安全最好搭配防火墙或设置认证。4. 核心API详解与高级用法掌握了基本操作后我们来深入handy-ollama的Python API探索一些能提升效率的高级特性和实际应用模式。4.1 模型管理超越list和pullclient.list_models()返回的是一个字典列表信息可能比较原始。我们可以结合Python标准库使其更易读。from handy_ollama import Ollama from datetime import datetime import humanize # 需要安装: pip install humanize client Ollama() models client.list_models() print(f本地共有 {len(models)} 个模型:) print(- * 50) for model in models: name model[name] # 模型大小可能以字节为单位用humanize格式化 size humanize.naturalsize(model.get(size, 0)) if size in model else 未知 # 解析修改时间 modified_str model.get(modified_at, ) if modified_str: # Ollama返回的时间格式可能是RFC3339这里简单处理 try: mod_time datetime.fromisoformat(modified_str.replace(Z, 00:00)) modified mod_time.strftime(%Y-%m-%d %H:%M) except: modified modified_str else: modified 未知 print(f 模型: {name:30} | 大小: {size:12} | 修改于: {modified})对于模型拉取client.pull_model()支持一个非常实用的show_progress参数它会在终端显示一个进度条让你清晰了解下载进度这对于下载数GB的大模型时缓解焦虑非常有用。# 拉取一个中等大小的模型并显示进度 try: client.pull_model(qwen2.5:7b, show_progressTrue) print(模型拉取成功) except Exception as e: print(f拉取失败: {e})4.2 对话与上下文管理构建有记忆的助手原生ollama run在同一个会话中能记住上下文但一旦退出就没了。在程序中我们需要主动管理上下文。handy-ollama的chat接口通过messages列表天然支持这一点。from handy_ollama import Ollama client Ollama() model llama3.2:1b # 初始化对话历史 conversation_history [ {role: system, content: 你是一个乐于助人且幽默的AI助手。回答要简洁。} ] def chat_with_memory(user_input): 带历史记录的聊天函数 # 将用户输入加入历史 conversation_history.append({role: user, content: user_input}) # 调用模型传入整个历史 response client.chat( modelmodel, messagesconversation_history, streamFalse, # 为演示方便关闭流式 options{temperature: 0.7} ) # 获取助手回复 assistant_reply response[message][content] # 将助手回复加入历史 conversation_history.append({role: assistant, content: assistant_reply}) return assistant_reply # 模拟多轮对话 print(chat_with_memory(你好)) print(chat_with_memory(我刚刚说了什么)) # 模型应该能记得上一轮问候 print(chat_with_memory(用Python计算斐波那契数列的前10项。))在这个例子中conversation_history列表持续增长包含了所有对话轮次。这就是大语言模型LLM的“上下文窗口”。需要注意的是模型对上下文长度有限制例如4096或8192个token。当历史记录太长时你需要实现一个“窗口化”策略丢弃最早的一些消息或者使用更高级的“总结摘要”技术。核心技巧system消息非常强大。你可以在对话开始时通过它来设定AI的角色、行为规范和回答风格。例如你是一个专业的代码审查助手只讨论代码相关的问题用中文回答。这能极大地提升对话的针对性和质量。4.3 流式处理与实时应用流式响应 (streamTrue) 不仅是Web UI那种“打字机效果”的基础更是构建实时交互应用的关键。它允许服务器在生成token的同时就发送给客户端客户端可以即时显示用户体验更流畅。from handy_ollama import Ollama import time client Ollama() full_response print(思考中...流式输出) for chunk in client.chat( modelllama3.2:1b, messages[{role: user, content: 详细解释一下什么是机器学习。}], streamTrue ): # chunk是一个字典包含部分响应和其他信息 content_piece chunk.get(message, {}).get(content, ) if content_piece: print(content_piece, end, flushTrue) # flushTrue确保即时显示 full_response content_piece # 可以在这里加入暂停模拟更真实的打字速度 # time.sleep(0.05) print(f\n\n--- 完整回复共{len(full_response)}字符---) # full_response 现在包含了完整的回复内容流式处理对于构建以下应用至关重要实时聊天界面如Web UI或桌面应用。长文本生成监控你可以实时看到生成进度并在必要时中断。低延迟交互用户不需要等待整个响应生成完毕就能看到开头。4.4 参数调优控制生成的“艺术”Ollama的生成参数直接影响输出质量。handy-ollama允许你在chat或generate时通过options字典传递这些参数。response client.chat( modelllama3.2:1b, messages[{role: user, content: 写一个关于人工智能的短故事。}], options{ temperature: 0.8, # 创造性 (0.0-1.0越高越随机) top_p: 0.9, # 核采样 (0.0-1.0与temperature择一使用) top_k: 40, # 从概率最高的k个token中采样 num_predict: 256, # 最大生成token数 repeat_penalty: 1.1, # 重复惩罚因子 (1.0降低重复) seed: 42, # 随机种子固定后可使生成结果确定 } )下面是一个参数影响速查表参数典型范围作用调优建议temperature0.0 ~ 2.0控制随机性。值越低输出越确定、保守值越高输出越随机、有创意。代码生成、事实问答建议较低 (0.1-0.3)创意写作、头脑风暴建议较高 (0.7-1.0)。top_p0.0 ~ 1.0核采样。仅从累积概率超过p的最小token集合中采样。与temperature配合使用。通常设置0.7-0.9。与temperature一起微调控制多样性和连贯性。top_k1 ~ 100仅从概率最高的k个token中采样。设置40或50是常见起点。设为1则变成贪婪解码每次选最可能的。num_predict1 ~ 模型上限生成的最大token数量。根据任务需要设置。对话可设512长文生成可设2048。注意不要超过模型上下文限制。repeat_penalty1.0 ~ 2.0惩罚重复的token降低模型“车轱辘话”的概率。如果发现输出重复严重可适当调高如1.1或1.2。seed整数设置随机数生成器的种子。固定种子后相同的输入和参数会产生完全相同的输出便于结果复现和测试。实操心得参数调优没有银弹。最好的方法是针对你的具体任务如代码补全、文案创作、摘要生成和具体模型设计一组测试用例然后系统地调整参数并对比结果。可以从temperature0.7, top_p0.9开始然后根据输出是“太死板”还是“太胡言乱语”来调整。5. 实战构建一个简单的本地知识库问答系统让我们用一个更复杂的例子将handy-ollama用起来。假设我们想构建一个简单的系统用户提问系统从一小组本地文档中查找相关信息然后让模型基于这些信息生成答案。这就是RAG检索增强生成的极简版。5.1 系统设计思路知识库我们准备几个简单的文本文档例如关于公司产品、项目规范、个人笔记的txt文件。检索当用户提问时系统将问题与所有文档内容进行简单的关键词匹配或向量相似度计算这里为了简化使用关键词匹配。构建提示词将检索到的相关文档片段连同用户问题一起构造成一个详细的提示词Prompt发送给模型。生成答案模型基于我们提供的上下文检索到的文档来生成答案避免胡编乱造。5.2 代码实现首先创建几个示例文档。在项目目录下创建一个docs文件夹里面放几个.txt文件。docs/product_a.txt:产品A是一款智能办公软件发布于2023年。核心功能包括智能日程管理、团队协作看板、自动会议纪要生成。定价为个人版每月99元团队版每人每月199元起。docs/company_policy.txt:公司考勤政策标准工作时间为周一至周五9:00-18:00。远程办公需提前申请。年假根据司龄计算入职第一年享有5天年假。然后创建我们的主脚本simple_rag.py#!/usr/bin/env python3 一个极简的本地RAG系统示例 import os import glob from handy_ollama import Ollama class SimpleRAGSystem: def __init__(self, docs_pathdocs/, modelllama3.2:1b): self.client Ollama() self.model model self.docs_path docs_path self.documents self._load_documents() def _load_documents(self): 加载所有文本文档到内存 docs {} for file_path in glob.glob(os.path.join(self.docs_path, *.txt)): with open(file_path, r, encodingutf-8) as f: content f.read().strip() # 使用文件名不含后缀作为文档ID doc_id os.path.splitext(os.path.basename(file_path))[0] docs[doc_id] content print(f已加载 {len(docs)} 个文档。) return docs def _retrieve(self, query, top_k2): 简单的基于关键词的检索实际应用应用向量数据库 query_words set(query.lower().split()) scores [] for doc_id, content in self.documents.items(): content_lower content.lower() # 计算简单的关键词匹配分数出现次数 score sum(1 for word in query_words if word in content_lower) if score 0: scores.append((score, doc_id, content)) # 按分数排序返回top_k个 scores.sort(reverseTrue, keylambda x: x[0]) return scores[:top_k] def _build_prompt(self, query, retrieved_docs): 构建包含上下文的提示词 context_parts [] for score, doc_id, content in retrieved_docs: context_parts.append(f[文档: {doc_id}]\n{content}\n) context \n.join(context_parts) prompt f请严格根据以下提供的上下文信息来回答问题。如果上下文信息不足以回答问题请直接说“根据现有信息无法回答”不要编造信息。 上下文信息 {context} 用户问题{query} 请基于上下文信息回答 return prompt def ask(self, query): 主问答函数 print(f\n用户提问: {query}) # 1. 检索相关文档 retrieved self._retrieve(query) if not retrieved: return 抱歉知识库中没有找到相关信息。 print(f检索到 {len(retrieved)} 条相关文档片段。) # 2. 构建提示词 prompt self._build_prompt(query, retrieved) # 3. 调用模型生成答案 response self.client.generate( modelself.model, promptprompt, options{temperature: 0.2, num_predict: 512} # 降低随机性确保基于事实 ) return response[response] def interactive_mode(self): 交互式问答模式 print( 简单本地知识库问答系统 ) print(输入 quit 或 exit 退出。) while True: try: user_input input(\n请输入您的问题: ).strip() if user_input.lower() in [quit, exit, q]: print(再见) break if not user_input: continue answer self.ask(user_input) print(f\n系统回答: {answer}) except KeyboardInterrupt: print(\n程序被中断。) break except Exception as e: print(f\n发生错误: {e}) if __name__ __main__: # 初始化系统 rag_system SimpleRAGSystem(docs_pathdocs/, modelllama3.2:1b) # 进入交互模式 rag_system.interactive_mode()5.3 运行与效果测试在终端运行脚本python simple_rag.py你会进入一个交互式命令行界面。尝试提问“产品A的价格是多少”“公司年假怎么算”“产品A有哪些功能”系统会先打印它检索到了哪些文档然后给出基于这些文档生成的答案。你可以问一个知识库里没有的问题比如“公司的股票代码是多少”观察模型是否会按照提示词的要求回答“无法回答”。项目延伸这个示例非常基础实际RAG系统要复杂得多向量检索应使用嵌入模型embedding model将文档和问题转换为向量用余弦相似度等度量进行检索比关键词匹配准确得多。可以集成sentence-transformers等库。文档分块长文档需要切分成更小的“块”chunks再进行向量化以提高检索精度。引用来源在答案中标注引用了哪个文档的哪部分增强可信度。使用专用库生产环境建议使用LangChain、LlamaIndex等框架它们提供了完善的RAG组件。尽管如此这个例子清晰地展示了如何利用handy-ollama作为生成核心将其嵌入到一个更大的应用工作流中。它的价值在于提供了一个稳定、易用的Python接口让你能专注于业务逻辑如检索、提示工程而不必操心如何与Ollama服务通信。6. 常见问题、故障排查与性能优化在实际使用handy-ollama或与 Ollama 配合时你可能会遇到一些问题。这里我整理了一些常见的情况和解决方法大部分是我自己或社区里朋友们踩过的坑。6.1 连接与基础问题问题1连接Ollama服务失败报错ConnectionError或ConnectTimeout。可能原因1Ollama服务未运行。排查在终端运行ollama serve或ollama list看Ollama本身是否正常。解决确保Ollama服务已启动。在Windows/Mac上安装后通常会自动启动服务。Linux上可能需要手动启用服务sudo systemctl enable --now ollama。可能原因2Ollama服务不在默认地址/端口。排查检查Ollama服务的实际地址。默认是http://localhost:11434。解决在初始化Ollama()客户端时指定base_urlfrom handy_ollama import Ollama # 如果Ollama运行在另一台机器或不同端口 client Ollama(base_urlhttp://192.168.1.100:11434) # 或者如果Ollama在Docker容器内 # client Ollama(base_urlhttp://host.docker.internal:11434)问题2Web UI 启动后浏览器无法访问。可能原因1端口被占用。解决使用--port参数换一个端口启动。handy-ollama web --port 9090然后在浏览器访问http://localhost:9090。可能原因2防火墙或安全组阻止。解决如果需要在局域网内访问启动时需绑定0.0.0.0默认已是。检查电脑的防火墙设置确保对应端口如8080的入站规则是允许的。6.2 模型相关问题问题3模型列表为空或者调用模型时提示model not found。可能原因1本地确实没有该模型。排查运行ollama list确认模型是否存在。解决使用ollama pull model_name或client.pull_model()拉取模型。注意模型名要写全如llama3.2:1b。可能原因2模型标签tag不正确。说明Ollama模型可以有多个标签如llama3.2:1b、llama3.2:latest、llama3.2。:latest是默认标签。解决使用ollama list查看模型的确切名称和标签。在代码中调用时使用完整的model_name:tag格式。问题4模型响应速度慢或者生成内容质量差。可能原因1硬件资源不足。排查检查CPU/GPU利用率和内存占用。大模型需要大量内存RAM和显存VRAM。解决量化模型使用参数更少的量化版本模型如:3b、:7b版本或带-q4_0、-q8_0等后缀的量化模型如llama3.2:1b-q4_0。量化能在几乎不损失精度的情况下大幅减少内存占用和提升速度。关闭无关程序释放内存。确认GPU加速运行ollama ps查看模型是否在使用GPU。确保已安装正确的GPU驱动和Ollama的GPU版本。可能原因2生成参数设置不当。排查temperature过高可能导致胡言乱语num_predict设置过大可能导致生成时间过长。解决参考第4.4节的参数调优表根据任务类型调整参数。对于事实性问答降低temperature(如0.1-0.3)对于创意任务可适当调高。6.3 高级使用与性能优化问题5如何并行处理多个请求handy-ollama的同步客户端 (Ollama) 在处理多个请求时是阻塞的。对于需要高并发的场景如Web后端必须使用异步客户端 (AsyncOllama)并结合asyncio.gather等工具。import asyncio from handy_ollama import AsyncOllama async def concurrent_requests(): client AsyncOllama() prompts [ 解释一下量子计算。, 写一首关于秋天的诗。, 用Python实现二分查找。 ] # 创建多个异步任务 tasks [ client.generate(modelllama3.2:1b, promptprompt, options{num_predict: 128}) for prompt in prompts ] # 并发执行 results await asyncio.gather(*tasks) for i, result in enumerate(results): print(f\n问题 {i1}: {prompts[i][:30]}...) print(f回答: {result[response][:100]}...) # 运行异步函数 asyncio.run(concurrent_requests())问题6如何保存和加载对话历史handy-ollama本身不持久化历史但我们可以轻松地用Python实现。import json import os from datetime import datetime from handy_ollama import Ollama class ChatSession: def __init__(self, client, model, save_dirchat_history): self.client client self.model model self.save_dir save_dir self.history [] os.makedirs(save_dir, exist_okTrue) def add_to_history(self, role, content): self.history.append({ role: role, content: content, timestamp: datetime.now().isoformat() }) def chat(self, user_input): self.add_to_history(user, user_input) response self.client.chat( modelself.model, messagesself.history, streamFalse ) assistant_reply response[message][content] self.add_to_history(assistant, assistant_reply) # 可选每次对话后自动保存 self.save_session() return assistant_reply def save_session(self, filenameNone): if filename is None: filename fsession_{datetime.now().strftime(%Y%m%d_%H%M%S)}.json filepath os.path.join(self.save_dir, filename) with open(filepath, w, encodingutf-8) as f: json.dump(self.history, f, ensure_asciiFalse, indent2) print(f对话已保存至: {filepath}) def load_session(self, filepath): with open(filepath, r, encodingutf-8) as f: self.history json.load(f) print(f已从 {filepath} 加载对话历史{len(self.history)} 条记录。) # 使用示例 client Ollama() session ChatSession(client, modelllama3.2:1b) print(session.chat(你好)) print(session.chat(还记得我吗)) # 模型能基于历史回答 # 保存当前会话 session.save_session(my_chat.json)这个ChatSession类将对话历史保存在内存中并提供了保存到JSON文件和从文件加载的功能。你可以扩展它比如集成数据库或者实现一个自动修剪历史避免超出上下文长度的策略。问题7如何监控Ollama服务的资源使用情况虽然handy-ollama不直接提供监控但你可以通过系统命令或Ollama自身的API来获取。查看运行中的模型ollama ps这会显示当前加载的模型、使用的GPU/CPU、内存占用等信息。通过API获取系统信息import requests resp requests.get(http://localhost:11434/api/tags) print(resp.json()) # 查看模型详情 # Ollama 可能在未来版本提供更详细的系统状态API系统级监控使用htop(Linux/Mac)、任务管理器(Windows) 或nvidia-smi(GPU) 来监控整体资源消耗。最后关于性能的一个终极建议选择合适的模型尺寸。如果你的应用场景是简单的问答、文本分类或总结一个1B或3B参数的精简模型可能比一个7B或更大的模型响应快数倍而效果相差不大。始终在效果和速度/资源之间寻找平衡点。handy-ollama让你能轻松切换和测试不同模型这正是它的优势所在。