当前位置: 首页 > article >正文

不止于聊天:用Ollama API和Python打造你的第一个AI小工具

不止于聊天用Ollama API和Python打造你的第一个AI小工具当大多数人还在用大语言模型进行简单对话时聪明的开发者已经将这些能力转化为生产力工具。想象一下每天重复的代码注释工作可以自动完成海量技术文档能即时问答会议录音能自动生成摘要——这些都不需要依赖云端服务用本地运行的Ollama模型和几十行Python代码就能实现。本文将带你突破聊天机器人的思维定式通过三个实战项目演示如何将Ollama的API能力转化为解决实际问题的工具。我们不仅会覆盖API调用的核心技术要点还会教你如何设计健壮的模块化代码让你的AI工具像乐高积木一样可以自由组合扩展。1. 环境准备与API基础1.1 快速搭建Ollama环境虽然Ollama以安装简单著称但在实际项目中有几个关键配置会影响后续开发体验。推荐使用Docker运行Ollama服务既能隔离环境又便于迁移# 使用官方Docker镜像 docker run -d -p 11434:11434 --name ollama -v ollama_data:/root/.ollama ollama/ollama # 下载常用工作模型中文场景推荐 docker exec ollama ollama pull qwen:7b验证服务是否正常运行import requests response requests.get(http://localhost:11434/api/tags) print(response.json())应该能看到类似输出{ models: [ { name: qwen:7b, modified_at: 2024-05-20T08:00:00Z, size: 3820000000 } ] }1.2 API调用核心模式Ollama提供两种API调用方式适用于不同场景同步调用- 适合快速测试和短文本生成def simple_generate(prompt, modelqwen:7b): response requests.post( http://localhost:11434/api/generate, json{model: model, prompt: prompt} ) return response.json()[response]流式调用- 处理长文本时的内存优化方案def stream_generate(prompt, modelqwen:7b): response requests.post( http://localhost:11434/api/generate, json{model: model, prompt: prompt, stream: True}, streamTrue ) for chunk in response.iter_lines(): if chunk: data json.loads(chunk.decode()) yield data.get(response, )提示流式调用时建议设置超时参数避免长时间无响应阻塞程序2. 实战项目一智能代码注释生成器2.1 项目架构设计我们将构建一个能自动分析Python函数并生成专业注释的工具其工作流程如下解析Python文件提取函数定义构造LLM提示词模板处理API响应并回写文件核心模块划分code_annotator/ ├── __init__.py ├── parser.py # 代码解析 ├── prompts.py # 提示词工程 └── writer.py # 文件操作2.2 代码解析实现使用ast模块精准提取函数信息import ast def extract_functions(filepath): with open(filepath) as f: tree ast.parse(f.read()) functions [] for node in ast.walk(tree): if isinstance(node, ast.FunctionDef): func_info { name: node.name, args: [arg.arg for arg in node.args.args], lineno: node.lineno, docstring: ast.get_docstring(node) } functions.append(func_info) return functions2.3 提示词工程设计有效的提示词是获得高质量输出的关键def build_function_prompt(func_info): return f你是一名资深Python开发者请为以下函数编写专业注释 函数定义 def {func_info[name]}({, .join(func_info[args])}): ... 要求 1. 用Google风格文档字符串格式 2. 包含参数说明、返回值和示例 3. 使用中文描述 4. 保持技术准确性2.4 完整工作流集成将各模块组合成完整工具def annotate_file(filepath, modelqwen:7b): functions extract_functions(filepath) with open(filepath, r) as f: lines f.readlines() for func in reversed(functions): # 从后往前修改避免行号错位 prompt build_function_prompt(func) comment simple_generate(prompt, model) insert_index func[lineno] - 1 lines.insert(insert_index, f\n{comment}\n) f.seek(0) f.writelines(lines)使用示例python -m code_annotator annotate my_script.py3. 实战项目二本地知识库问答系统3.1 文档预处理流水线构建高效问答系统的关键在于文档预处理from pathlib import Path import PyPDF2 def chunk_document(filepath, chunk_size500): if filepath.suffix .pdf: text extract_pdf_text(filepath) else: text filepath.read_text() words text.split() chunks [ .join(words[i:ichunk_size]) for i in range(0, len(words), chunk_size) ] return chunks def extract_pdf_text(filepath): text with open(filepath, rb) as f: reader PyPDF2.PdfReader(f) for page in reader.pages: text page.extract_text() return text3.2 向量检索与问答集成使用FAISS实现本地向量检索import numpy as np from sentence_transformers import SentenceTransformer class VectorStore: def __init__(self): self.model SentenceTransformer(paraphrase-multilingual-MiniLM-L12-v2) self.index None self.chunks [] def build_index(self, documents): self.chunks [] for doc in documents: self.chunks.extend(chunk_document(doc)) embeddings self.model.encode(self.chunks) self.index FAISS.IndexFlatL2(embeddings.shape[1]) self.index.add(embeddings) def search(self, query, k3): query_embed self.model.encode([query]) distances, indices self.index.search(query_embed, k) return [self.chunks[i] for i in indices[0]]问答接口实现def answer_question(question, vector_store, modelqwen:7b): context \n.join(vector_store.search(question)) prompt f基于以下上下文回答问题 {context} 问题{question} 要求 1. 答案必须来自上下文 2. 如果上下文不包含答案回复未找到相关信息 3. 使用中文回答 return stream_generate(prompt, model)4. 高级技巧与性能优化4.1 异步批量处理当需要处理大量请求时同步调用会成为性能瓶颈import aiohttp async def batch_generate(prompts, modelqwen:7b): async with aiohttp.ClientSession() as session: tasks [] for prompt in prompts: task session.post( http://localhost:11434/api/generate, json{model: model, prompt: prompt} ) tasks.append(task) responses await asyncio.gather(*tasks) return [await r.json() for r in responses]4.2 模型参数调优不同任务需要不同的生成参数组合任务类型temperaturetop_pmax_tokens适用场景代码生成0.20.91024需要确定性输出创意写作0.70.952048鼓励多样性技术问答0.30.85512平衡准确性与流畅度文本摘要0.50.9256关键信息提取实践示例def optimized_generate(prompt, task_typecode): params { code: {temperature: 0.2, top_p: 0.9}, creative: {temperature: 0.7, top_p: 0.95} }.get(task_type, {}) response requests.post( http://localhost:11434/api/generate, json{model: qwen:7b, prompt: prompt, **params} ) return response.json()4.3 错误处理与重试机制健壮的生产级应用需要完善的错误处理from tenacity import retry, stop_after_attempt, wait_exponential retry( stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10) ) def reliable_generate(prompt): try: response requests.post( http://localhost:11434/api/generate, json{model: qwen:7b, prompt: prompt}, timeout30 ) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(fAPI调用失败: {str(e)}) raise5. 项目三自动化会议纪要生成器5.1 语音转文本预处理使用开源工具实现语音识别# 安装必要依赖 pip install SpeechRecognition pydub音频处理核心代码import speech_recognition as sr def transcribe_audio(audio_path): recognizer sr.Recognizer() with sr.AudioFile(audio_path) as source: audio recognizer.record(source) try: text recognizer.recognize_whisper( audio, languagezh-CN, modelsmall ) return text except sr.UnknownValueError: print(无法识别音频) return 5.2 摘要生成策略分层摘要生成提高质量首先生成章节级摘要然后基于章节摘要生成全局摘要最后提取关键行动项实现代码def generate_summary(text, modelqwen:7b): # 分段处理长文本 chunks [text[i:i2000] for i in range(0, len(text), 2000)] section_summaries [] for chunk in chunks: prompt f请用中文总结以下会议内容的关键点 {chunk} 要求 1. 不超过3个要点 2. 保留重要数据和决策 3. 使用简洁的商务语言 summary simple_generate(prompt, model) section_summaries.append(summary) # 生成最终摘要 combined \n\n.join(section_summaries) final_prompt f基于以下分段摘要生成完整的会议纪要 {combined} 要求 1. 按背景、讨论、决策结构组织 2. 标注重要时间点和责任人 3. 限制在300字以内 return simple_generate(final_prompt, model)5.3 行动项提取使用特定提示词提取可执行任务def extract_action_items(text, modelqwen:7b): prompt f从以下会议记录中提取具体行动项 {text} 要求 1. 每条行动项包含责任人、截止时间、具体任务三个要素 2. 使用Markdown表格格式输出 3. 确保每个任务都可执行和验证 response simple_generate(prompt, model) return response示例输出| 责任人 | 截止时间 | 具体任务 | |--------|------------|------------------------------| | 张三 | 2024-06-01 | 完成新API接口设计文档 | | 李四 | 2024-05-25 | 协调测试团队安排压力测试 |

相关文章:

不止于聊天:用Ollama API和Python打造你的第一个AI小工具

不止于聊天:用Ollama API和Python打造你的第一个AI小工具 当大多数人还在用大语言模型进行简单对话时,聪明的开发者已经将这些能力转化为生产力工具。想象一下:每天重复的代码注释工作可以自动完成,海量技术文档能即时问答&#x…...

2026实用论文降AI工具盘点:含免费版高效去AI痕迹方案

写论文的苦谁懂?熬了几个通宵赶出来的稿子,要么查重飘红一片,要么AI检测直接标红高危,改到凌晨三点还是过不了关。 为了搞定论文降AIGC,我前前后后踩了不下二十个坑,试了市面上几十款降AI率工具,有的改完逻辑混乱像小学生写的,有的AI率没降反而升了,还有的直接把我论…...

保姆级教程:用CubeMX给STM32H750的SRAM和Flash配置MPU属性,告别数据错乱

STM32H750的MPU与Cache配置实战:从原理到CubeMX图形化操作 在嵌入式开发领域,性能优化始终是开发者关注的焦点。当使用STM32H750这类高性能Cortex-M7内核芯片时,合理配置MPU(内存保护单元)和Cache(高速缓存…...

Claude Opus 4.7 深度实测:从 Effort 选配到 Adaptive Thinking 的完整迁移指南

Claude Opus 4.7 是 Anthropic 目前正式上线的最强模型,在编程能力、自主任务执行和模糊问题推理上全面超越前代 4.6。Claude Code 创始人 Boris Cherny 第一时间写了篇官方最佳实践,我在星链4SAPI 上跑了两天真实项目后,把他的建议和自己踩的…...

从电磁炮到磁悬浮:拆解导轨+导体模型,看懂前沿科技背后的高中物理

从电磁炮到磁悬浮:导轨导体模型如何驱动未来科技 想象一下,一枚炮弹无需火药就能以7倍音速飞出,或是一列列车悬浮在轨道上以600公里时速无声滑行——这些科幻场景已成现实,而它们的核心原理竟藏在高中物理课本里。当我们拆解电磁炮…...

MTK Camera调试实战:Dump Buffer定位花屏与竖线问题

1. 初识MTK Camera Dump Buffer调试技巧 第一次遇到手机摄像头预览画面出现彩色条纹时,我盯着屏幕愣了半天。作为刚入行的Camera调试工程师,这种花屏问题简直就像天书。直到同事教我用了MTK平台的Dump Buffer功能,才发现原来这些看似复杂的图…...

别再乱用QStatusBar了!PyQt5状态栏addPermanentWidget和addWidget混用踩坑实录

PyQt5状态栏深度避坑指南:永久控件与临时消息的黄金分割法则 在桌面应用开发中,状态栏作为用户界面的"信息中枢",承担着版本展示、操作反馈、状态提示等多重职责。许多PyQt5开发者都遇到过这样的困境:精心设计的版本号标…...

RK3588S开发板Android13系统外设全攻略:从USB摄像头到5G模块的保姆级配置指南

RK3588S开发板Android13系统外设全攻略:从USB摄像头到5G模块的保姆级配置指南 在边缘计算和物联网设备开发领域,RK3588S开发板凭借其强大的性能和丰富的接口资源,成为众多开发者的首选平台。本文将深入探讨如何在Android13系统下充分利用这块…...

SQL触发器实现自动生成流水号_配合序列对象实现递增逻辑

触发器中调用NEXTVAL报错主因是语法误用:Oracle应使用赋值语句:NEW.id : seq_name.NEXTVAL而非SELECT INTO;PostgreSQL须用nextval(seq_name);MySQL无原生序列,需借AUTO_INCREMENT与LAST_INSERT_ID()模拟。触发器里调用 NEXTVAL 为…...

告别TI默认调试器:手把手教你用J-Link给MSP432下载程序(CCS11环境)

告别TI默认调试器:手把手教你用J-Link给MSP432下载程序(CCS11环境) 当MSP432开发板的TI官方调试器突然罢工时,那种调试进度被迫中断的焦虑感,相信每个嵌入式开发者都深有体会。去年参与智能农业传感器项目时&#xff0…...

C# 14原生AOT + Dify客户端部署:为什么90%开发者卡在PublishTrimmed=true?3类动态依赖绕过方案(含源码级补丁)

第一章:C# 14 原生 AOT 部署 Dify 客户端 性能调优指南C# 14 的原生 AOT(Ahead-of-Time)编译能力为构建轻量、启动极速的 Dify 客户端提供了全新可能。与传统 JIT 模式相比,AOT 编译可消除运行时 JIT 开销、减小二进制体积&#x…...

Text-to-SQL四重翻车实录:不懂SQL也能开口即得数据?

【2026爆发元年】Text-to-SQL四重翻车实录:不懂SQL也能开口即得数据? 文章目录 【2026爆发元年】Text-to-SQL四重翻车实录:不懂SQL也能开口即得数据?一、痛点场景描述:四个翻车现场,你中了几条?…...

OpenStack Train版部署后,如何从零启动你的第一个云主机实例?

OpenStack Train版部署后,如何从零启动你的第一个云主机实例? 当你完成OpenStack Train版的部署后,最令人兴奋的时刻莫过于启动第一个云主机实例。这不仅是对部署工作的验证,更是开启云计算之旅的第一步。本文将带你从零开始&…...

2026届必备的五大降重复率助手解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于人工智能生成内容愈发普遍的情形下,把文本的AI检测率给降低,成了内…...

C# .NET MAUI 实战入门:一站式搞定开发环境、项目创建与安卓模拟器调试

1. 开发环境准备:从零安装Visual Studio与MAUI工作负载 第一次接触.NET MAUI时,最让人头疼的就是环境配置。我刚开始用的时候,光是找对安装选项就折腾了半天。这里分享一个实测稳定的配置方案,帮你避开那些坑。 首先确保你的电脑是…...

别再硬编码了!用环境变量+路由参数动态管理H5导航栏(适配小程序web-view)

跨平台H5导航栏动态管理:环境变量与路由参数的工程化实践 在当今多端融合的开发环境下,H5页面经常需要同时适配原生App、微信小程序等多种平台。导航栏作为用户界面的核心交互元素,其在不同平台下的呈现方式往往成为开发痛点。传统硬编码的判…...

从AXI握手到数据流:5分钟搞懂ZYNQ Ultrascale+里PS和PL是怎么‘聊天’的

从AXI握手到数据流:5分钟搞懂ZYNQ Ultrascale里PS和PL是怎么‘聊天’的 想象一下,你正在设计一个智能摄像头系统,需要实时处理4K视频流。ARM处理器负责运行复杂的图像识别算法,而FPGA则承担高速像素处理的重任。两者如何高效协作&…...

从‘够用’到‘电影级’:我是如何用HDRP让我的Unity独立游戏画面质感翻倍的

从‘够用’到‘电影级’:我是如何用HDRP让我的Unity独立游戏画面质感翻倍的 去年夏天,当我第一次在Steam上发布自己的独立游戏时,评论区里出现最多的评价是"玩法有趣,但画面像十年前的作品"。这句话像根刺一样扎在心里—…...

Win10网络设置进阶:除了图形界面,用netsh命令一键搞定固定IP/网关/DNS

Win10网络配置终极指南:netsh命令的高效玩法 每次在会议室里手忙脚乱地点击十几个窗口只为改个IP地址?或者需要给几十台设备配置相同网络参数时,还在机械重复图形界面的操作?Windows内置的netsh工具能让你彻底告别这种低效工作方式…...

别再手动抄数据了!用NI-VISA和C语言自动读取仪器数据的保姆级教程

从零构建自动化仪器数据采集系统:NI-VISA与C语言实战指南 实验室里,你盯着示波器屏幕上跳动的波形,手指在计算器和笔记本键盘间来回切换——这场景是否熟悉?数据采集本是科研与工程的核心环节,却因手动记录的低效成为许…...

向量搜索不是魔法——EF Core 10扩展配置深度溯源:IL重写机制、DbContext模型注入与Span<T>内存安全实践

第一章&#xff1a;向量搜索不是魔法——EF Core 10扩展配置深度溯源&#xff1a;IL重写机制、DbContext模型注入与Span<T>内存安全实践向量搜索在现代AI应用中日益普及&#xff0c;但其底层并非黑箱魔法。EF Core 10通过原生支持向量类型&#xff08;Vector<float>…...

2小时,我给公司做了一套采购台账,老板第一次看明白成本!

很多公司都有采购台账&#xff0c;而且表面上看&#xff0c;还都做得不差。日期、物料、供应商、单价、数量、金额&#xff0c;一样不少。但真正拿给老板看时&#xff0c;老板还是总会继续追问&#xff1a;为什么这个价格、为什么选这家、为什么这个月成本高了&#xff1f;这让…...

**Spring Data Document with MongoDB Support 1.0.0.M3** 是 Spring Data 早期针对 MongoDB 发布的里程碑版本(Milestone

Spring Data Document with MongoDB Support 1.0.0.M3 是 Spring Data 早期针对 MongoDB 发布的里程碑版本&#xff08;Milestone 3&#xff09;&#xff0c;发布于 2011 年。它是 Spring Data MongoDB 项目的前身&#xff0c;从 1.0.0.M4 版本起&#xff0c;项目正式更名为 Sp…...

S32K3XX车载以太网驱动实战:从PHY芯片选型到MAC层配置的完整避坑指南

S32K3XX车载以太网驱动实战&#xff1a;从PHY芯片选型到MAC层配置的完整避坑指南 在智能驾驶和车联网技术快速发展的今天&#xff0c;车载以太网已成为连接ECU、传感器和网关的核心通信架构。作为NXP面向汽车电子推出的明星产品&#xff0c;S32K3XX系列凭借其高性能ARM Cortex-…...

Dify .NET客户端AOT迁移倒计时:.NET 8 LTS支持终止前最后窗口期,这份配置清单能救你项目!

第一章&#xff1a;C# 14 原生 AOT 部署 Dify 客户端 配置步骤详解C# 14 引入了对原生 AOT&#xff08;Ahead-of-Time&#xff09;编译的深度增强支持&#xff0c;使 .NET 应用可直接编译为独立、无运行时依赖的原生二进制文件。在部署轻量级 Dify 客户端&#xff08;如 CLI 工…...

VSCode配置Python开发环境

文章目录安装VS Code几个基本概念安装Python扩展插件配置pip镜像源Python快速编程插件调试&#xff1a;断点、内存变量、堆栈、单步配置虚拟环境更多扩展插件字体安装VS Code 简介 微软开发的&#xff0c;免费开源的通用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;…...

Spring LDAP 2.0.0.RELEASE 是 Spring LDAP 项目的一个重要里程碑版本

Spring LDAP 2.0.0.RELEASE 是 Spring LDAP 项目的一个重要里程碑版本&#xff0c;于 2016 年 12 月正式发布。该版本基于 Spring Framework 4.3&#xff0c;全面支持 Java 8&#xff0c;并引入了多项关键改进与重构&#xff0c;主要包括&#xff1a; ✅ 完全重写的核心 API&am…...

Spring AMQP 1.3.0.M1(里程碑版本)和 1.2.1.RELEASE 是 Spring AMQP 项目在 2013 年底至 2014 年初发布的两个重要版本

Spring AMQP 1.3.0.M1&#xff08;里程碑版本&#xff09;和 1.2.1.RELEASE 是 Spring AMQP 项目在 2013 年底至 2014 年初发布的两个重要版本。其中&#xff1a;1.2.1.RELEASE&#xff08;发布于 2013-12-18&#xff09;是 1.2.x 系列的维护更新&#xff0c;修复了若干 bug&am…...

智能车竞赛车模争议|老选手嘴替上线,主打一个人间清醒!

简 介&#xff1a; 《智能车竞赛老选手发声&#xff1a;自制车模争议应回归竞赛初心》针对智能车竞赛新组别车模自制引发的争议&#xff0c;一位往届选手犀利指出&#xff1a;部分自制车模选手因作品被成品车模超越而质疑规则不公平&#xff0c;实则是将个人理想凌驾于竞赛公平…...

SpringOne2GX 2013 是由 Pivotal(当时为 VMware SpringSource)主办的年度 Java/Spring 技术大会

SpringOne2GX 2013 是由 Pivotal&#xff08;当时为 VMware SpringSource&#xff09;主办的年度 Java/Spring 技术大会&#xff0c;聚焦 Spring 生态系统前沿实践。其中题为 “REST-Ful API Evolution” 的演讲&#xff08;常由 Josh Long 或 Roy Clarkson 等 Spring 团队核心…...