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

Ollama不只是聊天机器人:手把手教你用它的REST API打造自己的AI小应用(Python示例)

Ollama不只是聊天机器人手把手教你用它的REST API打造自己的AI小应用Python示例在本地运行大型语言模型LLM已经不再是遥不可及的技术。Ollama作为一款轻量级框架让开发者能够轻松地在个人电脑上部署和运行各种开源模型。但很多人可能不知道Ollama的真正价值不仅在于它的命令行聊天界面更在于它提供的REST API——这扇通往自定义AI应用开发的大门。想象一下你可以在自己的Python脚本中调用本地运行的Llama 2模型来处理文本或者在Flask应用中集成Mistral的对话能力而所有这些都不需要依赖任何云服务或付费API。这就是Ollama REST API带给开发者的自由。本文将带你深入了解如何利用Ollama的API从基础调用到实际项目集成一步步构建属于你自己的AI应用。1. 准备工作安装与基础配置在开始编码之前我们需要确保Ollama已经正确安装并运行。虽然Ollama支持多平台但本文将以Linux/macOS环境为例Windows用户只需稍作调整即可。安装Ollama的最简方法是使用官方提供的安装脚本curl -fsSL https://ollama.com/install.sh | sh安装完成后启动Ollama服务ollama serve这个命令会启动一个本地服务默认监听11434端口。保持这个终端窗口运行我们将在另一个终端中进行后续操作。模型下载是下一步关键。Ollama支持多种模型对于初次尝试建议从较小的模型开始ollama pull llama2:7b # 约3.8GB ollama pull mistral # 约4.1GB提示模型下载速度取决于你的网络环境较大的模型如llama2:70b可能需要较长时间。验证安装是否成功的最快方式是直接通过curl测试APIcurl http://localhost:11434/api/generate -d { model: llama2, prompt:请用一句话解释量子计算 }如果看到返回的JSON数据流说明一切就绪。2. 核心API详解与Python封装Ollama提供了几个关键的API端点理解它们的设计哲学和适用场景是构建稳定应用的基础。2.1 生成API/api/generate这是最基础的文本生成接口适合一次性完成的生成任务。它的工作原理是客户端发送一个包含模型名和提示词的JSON请求服务端以流式streaming方式返回响应每个数据块包含部分生成结果和元数据让我们用Python的requests库创建一个简单的封装类import requests import json class OllamaClient: def __init__(self, base_urlhttp://localhost:11434): self.base_url base_url def generate(self, model, prompt, **kwargs): 基础生成API data {model: model, prompt: prompt, **kwargs} response requests.post( f{self.base_url}/api/generate, jsondata, streamTrue ) response.raise_for_status() full_response for line in response.iter_lines(): if line: chunk json.loads(line.decode(utf-8)) if not chunk.get(done): yield chunk[response] full_response chunk.get(response, ) return full_response这个封装支持流式处理你可以这样使用它client OllamaClient() for chunk in client.generate(llama2, 解释递归的概念): print(chunk, end, flushTrue)2.2 聊天API/api/chat与生成API不同聊天API维护对话上下文更适合多轮交互场景。它的请求结构更复杂def chat(self, model, messages, **kwargs): 聊天风格API data { model: model, messages: messages, **kwargs } response requests.post( f{self.base_url}/api/chat, jsondata, streamTrue ) response.raise_for_status() full_response for line in response.iter_lines(): if line: chunk json.loads(line.decode(utf-8)) if not chunk.get(done): yield chunk[message][content] full_response chunk.get(message, {}).get(content, ) return full_response使用示例conversation [ {role: user, content: Python中如何反转字符串} ] response client.chat(mistral, conversation) print(.join(response))2.3 高级参数调优两个API都支持多种参数来调整生成效果参数类型默认值说明temperaturefloat0.8控制随机性值越高输出越多样top_pfloat0.9核采样概率阈值max_lengthint128生成的最大token数repeat_penaltyfloat1.1抑制重复内容的惩罚因子例如要获得更确定性的输出response client.generate( llama2, 列出三种排序算法, temperature0.3, max_length256 )3. 实战项目构建AI文本处理工具现在我们已经掌握了API的基本用法让我们把这些知识应用到一个实际项目中——开发一个命令行文本处理工具提供摘要、润色和问答功能。3.1 项目结构设计text_processor/ ├── __init__.py ├── cli.py # 命令行接口 ├── processor.py # 核心处理逻辑 └── utils.py # 辅助函数3.2 核心处理器实现在processor.py中我们创建一个多功能处理类class TextProcessor: def __init__(self, modelmistral): self.client OllamaClient() self.model model def summarize(self, text, lengthmedium): 生成文本摘要 length_map { short: 用1-2句话总结, medium: 用3-5句话总结, long: 用段落形式总结 } prompt f{length_map[length]}以下文本\n{text} return .join( self.client.generate(self.model, prompt, max_length512) ) def refine(self, text, styleprofessional): 文本润色 style_map { professional: 专业商务风格, casual: 轻松口语风格, academic: 学术论文风格 } prompt f将以下文本改写为{style_map[style]}\n{text} return .join( self.client.generate(self.model, prompt) ) def answer(self, question, contextNone): 基于上下文的问答 if context: prompt f根据以下信息回答问题\n{context}\n\n问题{question} else: prompt f回答问题{question} return .join( self.client.generate(self.model, prompt) )3.3 命令行界面集成在cli.py中我们使用click库创建友好的命令行界面import click from processor import TextProcessor click.group() def cli(): AI文本处理工具 pass cli.command() click.argument(text) click.option(--length, defaultmedium, typeclick.Choice([short, medium, long])) def summarize(text, length): 生成文本摘要 processor TextProcessor() result processor.summarize(text, length) click.echo(f\n摘要\n{result}) cli.command() click.argument(text) click.option(--style, defaultprofessional, typeclick.Choice([professional, casual, academic])) def refine(text, style): 文本润色 processor TextProcessor() result processor.refine(text, style) click.echo(f\n润色结果\n{result}) if __name__ __main__: cli()现在你可以这样使用这个工具python cli.py summarize 长篇文章内容... --length short python cli.py refine 需要润色的文本 --style academic4. 进阶应用开发Web服务将Ollama集成到Web应用中能解锁更多可能性。下面我们使用Flask创建一个简单的AI服务。4.1 基础Flask应用from flask import Flask, request, jsonify from processor import TextProcessor app Flask(__name__) processor TextProcessor() app.route(/api/summarize, methods[POST]) def api_summarize(): data request.json summary processor.summarize(data[text], data.get(length, medium)) return jsonify({summary: summary}) app.route(/api/chat, methods[POST]) def api_chat(): data request.json messages data[messages] response .join(processor.client.chat(processor.model, messages)) return jsonify({response: response}) if __name__ __main__: app.run(host0.0.0.0, port5000)4.2 添加流式响应支持对于长时间运行的生成任务流式响应能显著改善用户体验from flask import Response app.route(/api/stream/generate, methods[POST]) def stream_generate(): data request.json def generate(): for chunk in processor.client.generate( processor.model, data[prompt], **data.get(options, {}) ): yield fdata: {json.dumps({text: chunk})}\n\n return Response(generate(), mimetypetext/event-stream)前端可以通过EventSource接收这些数据const eventSource new EventSource(/api/stream/generate?prompt...); eventSource.onmessage (event) { const data JSON.parse(event.data); console.log(data.text); };4.3 性能优化技巧当处理多个并发请求时需要考虑以下优化连接池管理为Ollama客户端配置请求会话class OllamaClient: def __init__(self, base_urlhttp://localhost:11434): self.session requests.Session() self.base_url base_url超时设置避免长时间等待response self.session.post( f{self.base_url}/api/generate, jsondata, streamTrue, timeout(10, 30) # 连接超时10秒读取超时30秒 )负载测试使用locust等工具模拟多用户场景5. 错误处理与调试在实际应用中健壮的错误处理机制至关重要。Ollama API可能返回多种错误我们需要妥善处理。5.1 常见错误类型错误码原因解决方案400无效请求检查请求体JSON格式404模型不存在确认模型是否已下载503服务不可用检查Ollama服务是否运行5.2 增强型客户端实现from requests.exceptions import RequestException import time class RobustOllamaClient(OllamaClient): def generate_with_retry(self, model, prompt, max_retries3, **kwargs): 带重试机制的生成方法 last_error None for attempt in range(max_retries): try: return list(self.generate(model, prompt, **kwargs)) except RequestException as e: last_error e if e.response is not None: if e.response.status_code 404: raise ValueError(f模型 {model} 未找到) from e if e.response.status_code 503: time.sleep(2 ** attempt) # 指数退避 continue raise raise ConnectionError(fAPI请求失败重试{max_retries}次后仍不成功) from last_error5.3 日志记录添加详细的日志记录有助于后期调试import logging logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s ) logger logging.getLogger(ollama_client) class LoggingOllamaClient(OllamaClient): def generate(self, model, prompt, **kwargs): logger.info( 生成请求 - 模型: %s, 提示长度: %d, model, len(prompt) ) start_time time.time() try: result list(super().generate(model, prompt, **kwargs)) duration time.time() - start_time logger.info( 生成成功 - 耗时: %.2fs, 响应长度: %d, duration, len(.join(result)) ) return result except Exception as e: logger.error(生成失败 - 错误: %s, str(e)) raise6. 模型管理与高级功能除了基本的生成和聊天功能Ollama还提供了一系列模型管理API适合需要动态切换模型的场景。6.1 模型列表与信息def list_models(self): 获取本地模型列表 response requests.get(f{self.base_url}/api/tags) response.raise_for_status() return response.json().get(models, []) def model_info(self, model_name): 获取模型详细信息 response requests.post( f{self.base_url}/api/show, json{name: model_name} ) response.raise_for_status() return response.json()6.2 动态模型加载对于内存有限的机器可以按需加载和卸载模型def ensure_model_loaded(self, model_name): 确保模型已加载 models self.list_models() if not any(m[name] model_name for m in models): self.pull_model(model_name) def pull_model(self, model_name): 拉取模型 response requests.post( f{self.base_url}/api/pull, json{name: model_name}, streamTrue ) response.raise_for_status() for line in response.iter_lines(): if line: status json.loads(line.decode(utf-8)) if status in status: print(status[status]) # 显示下载进度6.3 自定义模型集成Ollama支持导入自定义的GGUF格式模型准备你的GGUF模型文件创建ModelfileFROM ./my_model.gguf PARAMETER temperature 0.7 SYSTEM 你是一个专业的技术助手通过API创建模型def create_model(self, model_name, modelfile_path): 创建自定义模型 with open(modelfile_path, r) as f: modelfile f.read() response requests.post( f{self.base_url}/api/create, json{name: model_name, modelfile: modelfile}, streamTrue ) response.raise_for_status() for line in response.iter_lines(): if line: print(json.loads(line.decode(utf-8)))7. 安全与部署考量当你的应用从本地开发环境走向生产部署时需要考虑以下几个关键因素。7.1 认证与访问控制默认情况下Ollama API没有身份验证。在生产环境中你应该使用反向代理添加基础认证限制访问IP或者使用Ollama的企业版功能Nginx配置示例server { listen 80; server_name ollama.example.com; location / { proxy_pass http://localhost:11434; proxy_set_header Host $host; # 基础认证 auth_basic Ollama API; auth_basic_user_file /etc/nginx/.ollama_passwords; # 只允许内网IP allow 192.168.1.0/24; deny all; } }7.2 性能监控使用Prometheus和Grafana监控Ollama的性能指标启用Ollama的指标端点默认在/metrics配置Prometheus抓取在Grafana中创建仪表盘关键监控指标包括请求延迟内存使用量GPU利用率如果可用并发请求数7.3 资源隔离当多个应用共享同一个Ollama实例时考虑使用容器化隔离# Dockerfile FROM ubuntu:latest RUN curl -fsSL https://ollama.com/install.sh | sh EXPOSE 11434 CMD [ollama, serve]然后使用docker-compose管理version: 3 services: ollama: build: . ports: - 11434:11434 volumes: - ollama_data:/root/.ollama deploy: resources: limits: cpus: 2 memory: 8G volumes: ollama_data:8. 扩展思路与创新应用掌握了Ollama API的基础用法后让我们探索一些更具创新性的应用场景。8.1 文档问答系统结合向量数据库可以构建本地知识库问答系统使用Sentence Transformers生成文档嵌入将嵌入存储在Chroma或FAISS中查询时先检索相关文档片段将片段作为上下文提供给Ollamafrom sentence_transformers import SentenceTransformer import chromadb class DocumentQA: def __init__(self): self.embedder SentenceTransformer(all-MiniLM-L6-v2) self.client chromadb.Client() self.collection self.client.create_collection(docs) self.ollama OllamaClient() def add_document(self, text, doc_id): 添加文档到知识库 sentences text.split(. ) # 简单分句 embeddings self.embedder.encode(sentences) self.collection.add( embeddingsembeddings.tolist(), documentssentences, ids[f{doc_id}_{i} for i in range(len(sentences))] ) def ask(self, question, top_k3): 基于文档回答问题 query_embedding self.embedder.encode([question])[0] results self.collection.query( query_embeddings[query_embedding.tolist()], n_resultstop_k ) context \n.join(results[documents][0]) prompt f基于以下信息回答问题\n{context}\n\n问题{question} return .join(self.ollama.generate(mistral, prompt))8.2 自动化测试助手为开发团队创建代码审查助手def review_code(self, code, languagepython): 代码审查 prompt f作为资深{language}开发专家请审查以下代码 {code} 请指出 1. 潜在的安全问题 2. 性能瓶颈 3. 代码风格问题 4. 改进建议 return .join(self.ollama.generate(codellama, prompt))8.3 多模态扩展虽然Ollama主要处理文本但结合其他工具可以实现多模态能力。例如使用CLIP处理图像用CLIP生成图像描述将描述作为文本提示发送给Ollama综合生成详细分析from PIL import Image import clip import torch class ImageAnalyzer: def __init__(self): self.device cuda if torch.cuda.is_available() else cpu self.model, self.preprocess clip.load(ViT-B/32, deviceself.device) self.ollama OllamaClient() def analyze(self, image_path): 分析图像内容 image self.preprocess(Image.open(image_path)).unsqueeze(0).to(self.device) text_inputs torch.cat([clip.tokenize(这是一张)]).to(self.device) with torch.no_grad(): image_features self.model.encode_image(image) text_features self.model.encode_text(text_inputs) # 生成基本描述 prompt 描述这张图片的内容 description .join(self.ollama.generate(llava, prompt)) # 深入分析 analysis_prompt f根据以下图片描述 {description} 请分析 1. 图片中的主要元素 2. 可能的情感基调 3. 创意应用场景 return .join(self.ollama.generate(llava, analysis_prompt))

相关文章:

Ollama不只是聊天机器人:手把手教你用它的REST API打造自己的AI小应用(Python示例)

Ollama不只是聊天机器人:手把手教你用它的REST API打造自己的AI小应用(Python示例) 在本地运行大型语言模型(LLM)已经不再是遥不可及的技术。Ollama作为一款轻量级框架,让开发者能够轻松地在个人电脑上部署…...

copaw:打通终端与系统剪贴板的命令行效率工具

1. 项目概述:一个为开发者量身定制的命令行工具如果你和我一样,日常开发工作离不开终端,那一定对“复制粘贴”这个动作又爱又恨。爱的是它能快速复用代码片段、配置命令;恨的是在终端、编辑器、浏览器之间来回切换,不仅…...

告别CAN总线数据乱码:手把手教你用Python实现ISO15765协议拆包(附完整代码)

告别CAN总线数据乱码:手把手教你用Python实现ISO15765协议拆包(附完整代码) 在汽车电子和物联网开发领域,CAN总线通信是核心技术之一。当我们需要从CAN分析仪或硬件接口获取原始数据时,经常会遇到数据包被分割成多个帧…...

麒麟天御安全域管平台加域后,域账户登录不上?从加域到登录的全链路排查指南

麒麟天御安全域管平台加域后域账户登录故障全链路排查指南 当终端成功加入麒麟天御安全域管平台后,域账户却无法正常登录,这种看似矛盾的情况在实际运维中并不罕见。本文将带您深入加域后的"黑盒"阶段,系统梳理从客户端到服务端的全…...

API2Cursor:将Swagger文档转为AI友好格式,提升Cursor开发效率

1. 项目概述与核心价值最近在折腾一个挺有意思的项目,叫Frostbound-northsea978/api2cursor。光看这个名字,可能有点摸不着头脑,但如果你也经常在前后端联调、API文档维护或者自动化测试这些场景里打转,那这个项目绝对值得你花点时…...

手机拍照背后的秘密:一文看懂ISP图像处理流水线(从RAW到JPEG全流程拆解)

手机拍照背后的秘密:一文看懂ISP图像处理流水线(从RAW到JPEG全流程拆解) 每次按下手机快门时,你是否好奇过那张瞬间生成的精美照片背后究竟发生了什么?从传感器捕捉的光信号到朋友圈里点赞无数的成片,中间隐…...

C# Winform项目实战:手把手教你用SqlHelper类打造安全的登录模块(防SQL注入版)

C# Winform安全登录实战:基于SqlHelper的参数化防注入方案 登录功能作为系统安全的第一道防线,其重要性不言而喻。许多初级开发者在实现Winform登录模块时,往往直接拼接SQL字符串进行验证,这无异于为黑客敞开了大门。本文将带你重…...

基于Hermes模型的现代化Web仪表盘部署与深度使用指南

1. 项目概述与核心价值最近在折腾大语言模型(LLM)应用时,我一直在寻找一个既美观又实用的Web界面来管理和交互。市面上的方案要么过于简陋,要么配置复杂,要么就是功能单一。直到我发现了monaleesa77/hermes-dashboard这…...

为Hermes智能体集成Brave Search实时搜索插件:本地大模型联网实践

1. 项目概述与核心价值 最近在折腾本地大模型应用,特别是想让它们能“联网”获取实时信息,而不是只依赖训练时那个“陈旧的知识库”。试过不少方案,比如让模型自己写代码去爬取,或者集成一些通用的搜索API,但总感觉要…...

【国家级AI治理新标竿】:AISMM如何替代NIST AI RMF成为下一代合规刚需?工信部信通院专家亲授迁移路线图

更多请点击: https://intelliparadigm.com 第一章:2026奇点智能技术大会:AISMM评估工具 在2026奇点智能技术大会上,AISMM(Artificial Intelligence System Maturity Model)评估工具正式开源,成…...

Intelli框架:统一多模型AI智能体编排与工作流开发实践

1. 项目概述:一个面向开发者的AI智能体编排框架如果你正在寻找一个能让你快速构建、测试和部署复杂AI应用,同时又不想被某个特定厂商的API绑定死的Python框架,那么Intelli值得你花时间深入了解。我最初接触它,是因为手头一个项目需…...

OpenClaw插件实战:基于Pub/Sub与Events API实现Google Chat AI智能体集成

1. 项目概述 最近在折腾一个挺有意思的东西,叫 teyou/openclaw-googlechatpubsub-plugin 。简单来说,这是一个为 OpenClaw 这个 AI 智能体平台开发的插件,它的核心功能是让 AI 智能体能够无缝接入 Google Chat(谷歌聊天&#x…...

告别点灯Demo:用STM32+WS2812B制作一个桌面氛围灯(支持手机App调色)

从零打造智能氛围灯:STM32WS2812B全栈开发指南 深夜伏案工作时,一盏能随心情变换色彩的智能氛围灯,或许能为你带来别样的灵感。这不是商场里千篇一律的RGB灯带,而是一个完全由你掌控的创意作品——通过STM32单片机驱动WS2812B灯珠…...

Arkloop框架解析:异步任务流编排与复杂状态循环管理实战

1. 项目概述:Arkloop是什么,以及它为何值得关注最近在开源社区里,一个名为“Arkloop”的项目引起了我的注意。这个由开发者“qqqqqf-q”创建的项目,名字听起来就很有意思,结合了“Ark”(方舟/架构&#xff…...

3D机械设计与物理测试集成技术解析

1. 3D机械设计与物理测试的集成分析技术概述在现代机械工程领域,3D设计与物理测试的集成已经成为提升产品开发效率的关键突破口。作为一名长期从事CAE分析的工程师,我深刻体会到传统"设计-分析-测试"串行流程的局限性——设计团队完成CAD建模和…...

保姆级教程:用EMQX 5.0在Windows上快速搭建MQTT服务器(附MQTTX客户端连接测试)

10分钟极速部署:Windows平台EMQX 5.0与MQTTX全链路实战指南 刚接触物联网开发时,最令人头疼的往往不是代码编写,而是基础环境的搭建。MQTT作为物联网领域的事实标准协议,其服务器部署过程却常常让新手望而却步。本文将带你用最短…...

云原生时代的基础设施可观测性:构建服务拓扑与依赖关系图谱

1. 项目概述:照亮基础设施的“技能”在云原生和微服务架构成为主流的今天,一个典型的中大型互联网应用背后,往往运行着数十甚至上百个独立的服务。这些服务分布在不同的容器、虚拟机、集群和云区域中,通过复杂的网络相互连接。对于…...

异步扩散模型在3D视频生成中的创新应用

1. 项目概述:当3D视频生成遇上异步扩散模型去年在为一个影视特效项目调试渲染管线时,我首次尝试将异步扩散模型引入3D视频生成流程。原本需要8小时渲染的动画序列,通过新的技术方案压缩到了47分钟,且画面质量反而提升了23%的细节保…...

AI日报神器:程序员告别流水账,Gemini3.1Pro自动生成日报

不少程序员对日报的态度很一致:不是不愿意工作,而是觉得日报写起来“重复、耗时、还容易写得不对劲”。你明明今天做了不少事,最后却花时间把它整理成流水账——然后还得应付格式、补充说明、以及“为什么要做这个”的解释。久而久之&#xf…...

MCP 2026低代码平台集成:为什么87%的POC失败源于这6个元数据映射盲区?

更多请点击: https://intelliparadigm.com 第一章:MCP 2026低代码平台集成的元数据治理共识 在 MCP 2026 低代码平台中,元数据治理不再仅是后台管理任务,而是贯穿模型设计、组件复用、跨环境部署与合规审计的核心契约机制。平台通…...

别再只会用OpenCV的CLAHE了!手把手教你调clipLimit和tileGridSize,让车牌识别率翻倍

CLAHE参数调优实战:从默认配置到精准控制的车牌识别增强 车牌识别系统在复杂光照条件下的表现,往往决定了整个项目的成败。当你在深夜的高速公路收费站,或是昏暗的地下停车场调试系统时,是否遇到过这样的困境:明明使用…...

超越木甲换皮:《饥荒》Mod进阶——如何为自定义衣服添加保暖、回san、加速等实用属性

超越木甲换皮:《饥荒》Mod进阶——如何为自定义衣服添加保暖、回san、加速等实用属性 在《饥荒》Mod开发的世界里,单纯的外观替换已经无法满足追求深度玩法的玩家需求。当一件自定义服装不仅能改变角色形象,还能在严寒中提供温暖、在黑暗中守…...

低查重AI教材编写捷径:AI写教材工具,3天完成20万字教材!

利用AI工具编写教材:高效与创新的结合 编写教材离不开资料的支持,但传统的资料整合方法早已无法满足现代需求。以前,从教育标准到学术论文,再到教学实例,这些信息通常分散在知网、教研平台等多个地方,要想…...

STM32 FOC电机控制:手把手教你用CubeMX配置TIM1中心对齐PWM(附代码)

STM32 FOC电机控制实战:TIM1中心对齐PWM配置全解析与避坑指南 在电机控制领域,场定向控制(FOC)因其优异的动态性能和效率已成为无刷电机驱动的主流方案。而作为FOC实现的硬件基础,PWM波形的生成质量直接决定了整个系统…...

别再凭感觉了!手把手教你用KEIL MDK-ARM监控MCU栈空间使用率(附源码)

嵌入式开发实战:KEIL MDK-ARM环境下精准监控MCU栈空间使用率 在嵌入式系统开发中,栈空间管理一直是个令人头疼的问题。许多开发者习惯性地采用"凭感觉配置,出问题再调整"的被动策略,这种看似简单的方法往往导致系统在关…...

【鸿蒙深度】HarmonyOS 6.0 底层架构全景解析:从微内核到分布式软总线,为什么它能同时跑在手机和PC上?

【鸿蒙深度】HarmonyOS 6.0 底层架构全景解析:从微内核到分布式软总线,为什么它能同时跑在手机和PC上? 摘要:HarmonyOS 6.0(API 23)的发布标志着鸿蒙正式进入"全场景统一OS"阶段。本文将深入微内…...

瑞芯微RKNN开发板连不上?手把手教你排查rknn_server启动问题(附日志调试技巧)

瑞芯微RKNN开发板连接故障全攻略:从日志分析到稳定运行的深度解决方案 当你在瑞芯微RKNN开发板上部署AI模型时,是否遇到过这样的场景:所有步骤都按官方文档操作,却在最后一步收到冰冷的server connect fail错误提示?这…...

别再被btoa坑了!手把手教你用JavaScript正确处理中文Base64编码(附完整代码)

JavaScript中文Base64编码全攻略:从报错到完美解决方案 最近在调试一个用户上传功能时,遇到了一个令人头疼的问题——当用户输入中文文件名时,前端使用btoa进行Base64编码后,控制台突然抛出错误。相信不少开发者都踩过这个坑&…...

看不懂李沐,不是你笨,是路线走反了。

搞深度学习也有几年了,见过太多人踩同一个坑:看完吴恩达、学完小土堆PyTorch,兴冲冲打开李沐的《动手学深度学习》,结果第三章就开始怀疑人生。 昨天有个大一的本科生找我,说他已经把吴恩达的机器学习刷完了&#xff…...

别再踩坑了!Windows下用Conda安装PyTorch GPU版,保姆级版本对照表与避坑指南

Windows下Conda安装PyTorch GPU版终极避坑手册 刚接触深度学习的开发者,十有八九会在PyTorch GPU版本安装上栽跟头。明明按照教程一步步操作,最后torch.cuda.is_available()却返回False,这种挫败感我深有体会。本文将带你直击问题核心——版…...