乘风的人 - Python
type: channel
link: https://blog.zhangbiechen.cn/index.php/tag/Python/
items: code - 本地vLLm模型请求示例
items: vLLm运行模型显存不够的问题
items: Hugging Face下载vLLm使用的模型
items: vllm安装运行本地大模型 - windows篇
items: LangChain 1.0 + LangGraph 1.0 全栈学习指南
items: vLLM 大模型开发全栈学习指南
items: Ollama 本地大模型学习与实战指南
items: Code - 异步批量分类+Excel保存
items: Code - aiohttp 异步调用API（关键优化，提升效率）
items: Code -同步调用大模型API 处理文本

code - 本地vLLm模型请求示例
type: item
date: 2026-02-28T16:23:00+08:00
description: import requests import json import base64 from typing import List, Optional, Dict # 配置模型服务地址和参数 API_BASE_URL = "http://localhost:8000/v1" # 你的vLLM服务地址 MODEL_NAME = "Qwen3-VL-4B-Instruct" # 和启动时--served-model-name一致 TIMEOUT = 30 # 请求超时时间（秒） class Qwen3VLClient: """Qwen3-VL-4B-Instruct 模型调用客户端""" def __init__(self, api_base_url: str, model_name: str): self.api_base_url = api_base_url self.model_name = model_name self.headers = { "Content-Type": "application/json", "Accept": "application/json", } def chat_completions( self, messages: List[Dict], temperature: float = 0.7, max_tokens: int = 1024, top_p: float = 0.8, ) -> Optional[str]: """ 调用模型生成回复 :param messages: 对话消息列表，格式参考OpenAI规范 :param temperature: 生成随机性，0-1之间，值越大越随机 :param max_tokens: 最大生成token数 :param top_p: 采样阈值，0-1之间 :return: 模型回复文本，失败返回None """ # 构造请求体 payload = { "model": self.model_name, "messages": messages, "temperature": temperature, "max_tokens": max_tokens, "top_p": top_p, "stream": False, # 非流式输出 } try: # 发送POST请求 response = requests.post( url=f"{self.api_base_url}/chat/completions", headers=self.headers, data=json.dumps(payload, ensure_ascii=False), # 避免中文乱码 timeout=TIMEOUT, ) # 检查响应状态 response.raise_for_status() # 解析响应结果 result = response.json() if result.get("choices") and len(result["choices"]) > 0: return result["choices"][0]["message"]["content"] else: print("模型未返回有效回复") return None except requests.exceptions.RequestException as e: print(f"请求失败：{str(e)}") if hasattr(e, "response") and e.response is not None: print(f"错误响应详情：{e.response.json()}") # 打印服务端具体错误 return None def get_image_base64(image_path: str) -> str: """将本地图片转换为base64编码（修复Windows路径问题）""" try: # 统一路径分隔符（兼容Windows） image_path = image_path.replace("\\", "/") print(f"正在读取图片：{image_path}") with open(image_path, "rb") as f: base64_data = base64.b64encode(f.read()).decode("utf-8") return base64_data except FileNotFoundError: print(f"错误：找不到图片文件 {image_path}，请检查路径是否正确") return "" except Exception as e: print(f"图片转base64失败：{str(e)}") return ""…

vLLm运行模型显存不够的问题
type: item
date: 2026-02-28T16:00:00+08:00
description: vLLM运行模型显存不足的原因及解决方法在使用vLLM部署大语言模型时，显存不足是最常见的报错（如提示“Free memory on device cuda:0 is less than desired GPU memory utilization”），其核心是GPU显存无法满足模型运行、优化策略及任务负载的综合需求。以下将详细分析显存不足的原因，并提供按优先级排序的可操作解决方法，适配各类常见场景（尤其针对8GB等小显存设备）。一、显存不足的核心原因vLLM显存占用主要分为「模型本身占用」「vLLM优化策略占用」「任务负载占用」三类，任一环节超出GPU显存上限，都会导致启动或运行失败，具体原因如下：1. 模型本身占用超出显存上限（最常见）这是最核心的原因，模型的参数规模、精度直接决定基础显存占用：参数规模过大：如13B、34B级别的模型，原生FP16精度下，单卡（如8GB显存）无法容纳（13B模型FP16精度约占用26GB显存），即使是7B模型，原生精度也需约14GB显存，8GB显存设备直接超出上限。模型精度过高：vLLM默认使用FP16精度运行模型，相比FP32精度虽已减半显存占用，但对小显存设备（8GB及以下）仍不友好；若未开启量化，原生精度的显存占用会直接超出设备承载能力。2. vLLM优化策略的显存预留过高vLLM为提升推理速度，会默认预留一定比例的显存用于优化（如CUDA图、PagedAttention分页机制），其中最关键的是「GPU显存利用率」参数：默认显存利用率过高：vLLM默认gpu_memory_utilization=0.85，即会尝试占用GPU 85%的显存用于模型加载和优化。例如8GB显存设备，默认需要占用约6.8GB显存，若设备本身可用显存不足（如被其他进程占用后剩余6.7GB），就会直接报错。CUDA图优化的显存预留：vLLM默认启用CUDA图优化，会额外预留部分显存用于加速推理，对于8GB等小显存设备，这部分预留会进一步挤压模型可用显存。3. 任务负载及环境干扰除模型和优化策略外，外部环境和任务设置也会占用显存，导致可用显存不足：其他进程占用显存：GPU上同时运行其他程序（如Jupyter内核、其他Python进程、PyTorch缓存），会占用部分显存，导致vLLM可使用的显存减少（如你之前的报错中，8GB显存仅剩余6.7GB可用）。任务参数设置不合理：如单批次token数（max-num-batched-tokens）设置过高、并发请求过多，会导致推理过程中显存占用临时飙升，超出预留显存。分布式配置错误：若误设置tensor-parallel-size（张量并行数）大于1，单卡会尝试加载部分模型参数+通信开销，额外增加显存占用，单卡部署时此参数必须为1。4. 次要原因：环境配置或版本冲突vLLM与PyTorch、CUDA版本不兼容，或未清理显存缓存，会导致显存泄露、占用异常，间接引发显存不足（如你之前遇到的NCCL进程组未销毁警告，虽不直接导致显存不足，但会造成显存泄露，长期运行会加剧问题）。二、显存不足的解决方法（按优先级从易到难）解决思路：先快速释放可用显存、降低显存预留，再通过量化、调整参数进一步优化，最后排查环境和模型问题，确保每一步都可落地、见效快。1. 快速释放显存（立即见效，优先操作）针对“其他进程占用显存”“显存缓存”问题，快速释放可用显存，无需修改模型或配置：关闭占用GPU的其他进程查看GPU进程：执行命令 nvidia-smi，查看占用GPU的进程ID（PID）。杀死进程：执行命令 kill -9 <PID>（替换<PID>为实际进程号，如Jupyter、多余Python进程）。清理PyTorch显存缓存：若之前运行过PyTorch程序，执行以下代码清理缓存（可在启动vLLM前运行）：`import torchtorch.cuda.empty_cache() # 清理未使用的显存缓存torch.cuda.reset_max_memory_allocated() # 重置显存统计`重启GPU相关服务：若显存泄露严重，可重启电脑或GPU驱动（执行 nvidia-smi -r，部分系统需sudo权限）。2. 降低vLLM显存预留（适配小显存设备，核心操作）针对“显存利用率过高”“CUDA图预留”问题，修改vLLM启动参数，直接减少显存占用，适配8GB等小显存设备：降低GPU显存利用率（最关键）启动vLLM时，通过 --gpu-memory-utilization 参数降低显存占用比例，建议8GB显存设备设置为0.7~0.8（根据可用显存调整）。示例启动命令（OpenAI兼容服务器）：`python -m vllm.entrypoints.openai.api_server \ …

Hugging Face下载vLLm使用的模型
type: item
date: 2026-02-28T14:37:00+08:00
description: Hugging Face 下载vLLm使用的模型前往Hugging Face 寻找自己需要的模型例如：下载这个模型 https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct复制模型名称 Qwen/Qwen3-VL-4B-Instruct下载模型使用 huggingface-cli 命令行工具（推荐）pip install huggingface_hub登录 Hugging Face（如果是私有模型或需要避免速率限制）公共模型可以不用huggingface-cli login然后输入你的 Access Token (https://huggingface.co/settings/tokens)下载模型：export HF_ENDPOINT=https://hf-mirror.comhf download Qwen/Qwen3-VL-4B-Instruct --local-dir Qwen3-VL-4B普通版本的模型会默认占用90%的显存，可能会出现显存不够的问题，可以选择量化版本的模型进行下载mac 安装vllm 下载模型流程#创建虚拟环境 conda create --name vllm_dev python=3.12 #使用环境 conda activate vllm_dev #安装huggingface_hub pip install huggingface_hub #下载模型 export HF_ENDPOINT=https://hf-mirror.com hf download Qwen/Qwen3-Embedding-0.6B

vllm安装运行本地大模型 - windows篇
type: item
date: 2026-02-28T10:05:00+08:00
description: vllm安装运行本地大模型 - windows篇前言目前 vLLM 对 Windows 的原生支持（Native Windows Support）非常有限且处于早期实验阶段，而在 WSL2 环境下则非常成熟和稳定，所以在windows电脑上运行vllm,尽可能的需要安装wsl2WSL安装及相关命令官网地址 https://learn.microsoft.com/zh-cn/windows/wsl/install一、WSL 基础安装与版本管理命令功能说明wsl --install一键安装 WSL（默认安装 Ubuntu，自动启用所需系统组件，无需手动配置）wsl --install -d <发行版名称>安装指定发行版（示例：wsl --install -d Debian，可通过 wsl --list --online 查看支持的发行版）wsl --list --online / wsl -l -o列出微软官方支持的所有 WSL 发行版，方便选择安装wsl --set-default-version <版本号>设置 WSL 默认版本（仅支持 1 或 2，示例：wsl --set-default-version 2，建议优先选择 WSL2，性能更优）wsl --update一键更新 WSL 内核和相关组件，修复已知兼容性问题wsl --status查看当前 WSL 状态，包括默认版本、默认发行版、内核版本等关键信息二、WSL 实例管理命令功能说明wsl --list --verbose / wsl -l -v列出已安装的所有 WSL 实例，清晰显示实例名称、状态（运行/停止）、WSL 版本wsl / wsl.exe快速启动默认 WSL 发行版，直接进入 Linux 终端环境wsl -d <发行版名称>启动指定 WSL 发行版（示例：wsl -d Ubuntu-22.04，需与已安装实例名称完全一致）wsl -u <用户名> / wsl --user <用户名>以指定用户身份启动 WSL（示例：wsl -u root，即 root 管理员身份，方便执行高权限操作）wsl --set-default <发行版名称>设置默认启动的 WSL 发行版，后续输入 wsl 可直接启动该实例wsl --shutdown关闭所有运行中的 WSL 实例和 WSL 虚拟机，释放系统资源，无需逐个终止wsl -t <发行版名称> / wsl --terminate <发行版名称>终止指定的 WSL 实例（强制关闭，适用于单个实例卡死或需单独停止的场景）三、WSL 版本切换与迁移命令功能说明wsl --set-version <发行版名称> <版本号>将指定发行版切换为 WSL1 或 WSL2（示例：wsl --set-version Ubuntu 2，切换过程可能需要几分钟）wsl --export <发行版名称> <导出路径>导出 WSL 实例为备份文件（示例：wsl --export Ubuntu D:\ubuntu-backup.tar，用于数据备份或迁移）wsl --import <新实例名称> <安装路径> <备份文件路径> --version <版本号>导入备份的 WSL 实例（示例：wsl --import Ubuntu-22.04 D:\WSL\Ubuntu D:\ubuntu-backup.tar --version 2，恢复备份或迁移到其他路径）四、WSL 卸载与重置命令功能说明wsl --unregister <发行版名称>卸载指定 WSL 实例（删除该实例所有数据，不可恢复，示例：wsl --unregister Ubuntu）wsl --cleanup清理 WSL 无用资源（如未使用的内核、临时文件），释放磁盘空间五、WSL 高级操作命令功能说明wsl <Linux 命令>在 PowerShell 中直接执行单个 Linux 命令（示例：wsl ls -l /home，无需进入 WSL 终端）wsl --mount <磁盘路径>挂载 Windows 磁盘到 WSL（示例：wsl --mount \\.\PhysicalDrive1，需管理员权限，方便在 WSL 中访问 Windows 磁盘文件）wsl --unmount <磁盘路径>卸载已挂载的 Windows 磁盘（示例：wsl --unmount \\.\PhysicalDrive1，避免磁盘占用）Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss\查看 WSL 实例的注册表配置（高级排查用，用于解决实例启动失败等异常问题）vLLm安装WSL 安装Ubuntuwsl -d Ubuntu WSL-…

LangChain 1.0 + LangGraph 1.0 全栈学习指南
type: item
date: 2026-02-27T18:14:00+08:00
description: LangChain 1.0 + LangGraph 1.0 全栈学习指南本指南面向有基础Python编程能力、希望系统掌握LangChain/LangGraph 1.0+生态的开发者，所有示例均基于2026年最新稳定版API，摒弃所有已废弃的旧写法（如langchain.chains、旧版Graph类），聚焦LCEL和StateGraph核心范式，兼顾理论精简性与实战可操作性，帮助开发者快速从入门到精通，重点掌握基于LangGraph的状态机和多代理编排能力。第一章：核心概念重构（LangChain 1.0+ 与 LangGraph 1.0+ 重大变更）LangChain 1.0+ 和 LangGraph 1.0+ 并非简单的版本迭代，而是对核心架构、API设计和开发范式的全面重构，核心目标是提升类型安全、异步性能和可扩展性，彻底解决旧版本“灵活但混乱”的痛点。以下是最影响开发的3个重大变更：1.1 包结构与API精简（彻底废弃旧版Chain）旧版本中langchain.chains模块包含大量冗余实现（如LLMChain、SequentialChain），1.0+ 版本已完全废弃该模块，统一采用 LCEL（LangChain Expression Language） 作为核心编排范式。同时包结构大幅精简，核心模块如下（重点记忆）：langchain_core：核心抽象（如BaseLLM、PromptTemplate、Tool、LCEL表达式），是所有模块的基础。langchain_llms/langchain_chat_models：LLM/聊天模型集成（如OpenAI、Anthropic），替代旧版langchain.llms。langchain_tools：工具集成（如搜索、数据库、文件操作），替代旧版langchain.tools。langgraph：独立拆分的状态机/多代理框架，1.0+ 版本完全基于StateGraph重构，不再依赖LangChain核心包的内部逻辑。关键提醒：1.0+ 版本中，任何基于langchain.chains的代码都会报错，必须用LCEL表达式替代；LangGraph不再是LangChain的子模块，需单独安装（pip install langgraph）。1.2 异步支持增强（原生async/await，性能翻倍）旧版本异步API（如async_run）为兼容写法，性能有限；1.0+ 版本全面拥抱Python原生异步，所有核心组件（LLM调用、工具调用、LCEL编排、LangGraph执行）均提供原生async/await支持，无需额外封装。核心优势：异步执行可同时处理多个LLM/工具调用，在多代理、多任务场景下，性能较同步执行提升50%以上，是生产环境必备写法。1.3 类型安全升级（Pydantic v2 深度集成）1.0+ 版本强制要求类型注解，全面集成 Pydantic v2，替代旧版的TypedDict和简单类型提示。无论是LLM输出解析、状态定义，还是工具输入输出，都需通过Pydantic模型进行类型校验，大幅减少运行时错误。核心变化：LangChain 1.0+ 所有核心类（如PromptTemplate、Tool）均继承自Pydantic v2的BaseModel，支持模型验证、序列化/反序列化，与LangGraph的状态管理无缝衔接。第二章：LangChain 1.0 基础（LCEL核心范式）LangChain 1.0+ 的核心是 LCEL，它是一种声明式的表达式语言，用于编排LLM、Prompt、Parser、Tool等组件，替代旧版的Chain写法。本节快速回顾基础组件的最新定义方式，所有示例均为1.0+ 标准写法。2.1 环境准备与依赖安装首先安装1.0+ 版本的核心依赖（指定版本以确保兼容性）：# 安装LangChain核心包（1.0+） pip install langchain-core==1.0.10 langchain-openai==0.1.0 langchain-tools==0.1.0 # 安装LangGraph（1.0+） pip install langgraph==1.0.5 # 安装Pydantic v2（LangChain 1.0+ 依赖） pip install pydantic==2.6.1注：这里以OpenAI模型为例，其他模型（如Anthropic、本地化模型）安装对应包即可（如langchain-anthropic）。2.2 LLM/聊天模型调用（最新写法）LangChain 1.0+ 将LLM和聊天模型分开管理，分别对应langchain_llms和langchain_chat_models，支持同步/异步调用，且必须指定类型注…

vLLM 大模型开发全栈学习指南
type: item
date: 2026-02-27T17:07:00+08:00
description: vLLM 大模型开发全栈学习指南本指南面向具备 Python 基础和大模型核心概念（Transformer、Attention、Quantization）的开发人员，旨在帮助大家从零开始掌握 vLLM 框架，实现高性能推理服务的搭建、二次开发与深度调优，全程注重实操性与实用性，避免冗余的学术化表述，助力快速落地生产级 LLM 服务。1. 核心原理解析 (Deep Dive)vLLM 之所以能成为当前最主流的高性能 LLM 推理框架之一，核心在于其创新的架构设计，解决了传统推理中吞吐量低、内存利用率低的关键痛点。以下从开发者视角，通俗解析其核心技术原理。1.1 PagedAttention 工作原理及优势在传统 Attention 机制中，模型推理时会为每个请求分配一块连续的 GPU 内存，用于存储该请求的 Key（K）和 Value（V）张量（即 KV Cache）。这种方式存在两个致命问题：一是内存碎片化，当请求长度不一、生命周期不同时，会产生大量空闲的内存碎片，无法被有效利用；二是内存浪费，即使请求只需要少量内存，也需分配连续块，导致 GPU 内存利用率极低。vLLM 提出的 PagedAttention（分页注意力）机制，借鉴了操作系统中的“内存分页”思想，彻底解决了上述问题，其核心逻辑如下：将 KV Cache 分割成固定大小的“页”（Page），每个页的大小统一（如 16 个 Token），页是内存分配的最小单元；为每个请求分配若干个页，用于存储其 KV Cache，这些页无需连续，可分散在 GPU 内存的不同位置；通过“页表”（Page Table）记录每个请求的 KV Cache 对应的页位置，推理时通过页表快速索引、拼接所需的 KV 数据，不影响计算逻辑。相比传统 Attention，PagedAttention 的核心优势的是：内存利用率提升 3-5 倍：彻底消除内存碎片化，空闲页可被新请求复用，避免“大材小用”；支持动态请求长度：无需提前预估请求长度，可灵活处理长短不一的推理任务（如对话、长文本生成）；降低 OOM 概率：通过精细化内存分配，最大化利用 GPU 显存，减少因连续内存不足导致的模型加载失败。1.2 Continuous Batching (迭代级调度) 提升吞吐量的原理传统 LLM 推理采用“静态批处理”（Static Batching）：将多个请求打包成一个批次，一次性送入模型计算，直到所有请求都完成生成（即生成到最大长度或触发停止条件），才能处理下一批请求。这种方式的弊端很明显：不同请求的生成时间差异大（如有的请求生成 10 个 Token，有的生成 100 个 Token），批次中“快请求”会等待“慢请求”完成，导致 GPU 空闲时间长，吞吐量极低。Continuous Batching（迭代级调度，也叫动态批处理） 打破了这种“批次绑定”的限制，核心逻辑是：以 Token 生成为迭代单位，而非以请求批次为单位，具体流程如下：初始化一个请求队列，将待处理的请求放入队列；每次迭代（生成一个 Token）时，从队列中选取尽可能多的请求（不超过 GPU 内存限制），组成一个临时批次，送入模型计算，生成每个请求的下一个 Token；计算完成后，检查每个请求是否达到停止条件（如生成停止符、达到最大长度）：若达到，则将其移出队列，释放其占用的内存；若未达到，则保留在队列中，等待下一次迭代；重复步骤 2-3，直到队列中所有请求都处理完成。这种调度方式的核心优势是：GPU 始终在处理“可生成 Token 的请求”，没有空闲等待时间，尤其在多请求、长短不一的场景下，吞吐量可提升 10-100 倍（具体取决于请求分布），是 vLLM 高性能的核心保障之一。1.3 vLLM 的内存管理模型vLLM 的内存管理模型围绕“高效利用 GPU 显存”设计，分为三个核心部分，协同工作实现内存的精细化管控：KV Cache 内存管理：基于 PagedAttention，将 KV Cache 分页管理，通过页表索引，实现内存的高效分配与复用，这是内存管理的核心；模型权重内存管理：支持模型权重的分片存储（如张量并行 Tensor Parallelism），将模型权重分散到多个 GPU 上，突破单 GPU 显存限制；同时支持量化（如 FP8、AWQ），将权重从 FP16 压缩到更低精度，减少显存占用；动态内存池：vLLM 会预先分配一块固定大小的 GPU 内存作为“内存池”，用于存储 KV Cache 页和临时计算数据，避免频繁的内存申请/释放（GPU 内存申请释放开销大），进一步提升性能；当内存池不足时，会自动淘汰长期未使用的 KV 页（基于 LRU 策略），保障新请求的正常处理。简单总结：vLLM 的内存管理，本质是“分页…

Ollama 本地大模型学习与实战指南
type: item
date: 2026-02-27T12:15:00+08:00
description: Ollama 本地大模型学习与实战指南目标读者：有一定技术基础（了解终端/命令行、基本编程概念）但从未接触过 Ollama 的开发者1. 简介1.1 什么是 Ollama？Ollama 是一款轻量级的开源工具，专为在本地环境中轻松运行、管理和定制大型语言模型（LLM）而设计。它将复杂的大模型部署流程（如模型编译、显存管理、依赖配置）封装为简单的命令行操作，让开发者无需深入理解底层技术细节，就能快速在本地运行 Llama 3、Phi、Gemma、Qwen 等主流开源大模型，实现本地推理、私有部署等需求。1.2 核心优势轻量级：核心程序体积小，支持模型量化（如 4-bit、8-bit 量化），资源占用可控，低配电脑（8GB 内存+独立显卡）、小型服务器也能流畅运行。隐私保护：所有数据（输入prompt、推理结果）和计算过程都在本地完成，无需将敏感信息（如企业内部数据、个人隐私数据）发送到云端，完全符合数据合规要求。易用性：极简的命令行交互，无需复杂的环境配置（如配置 CUDA、依赖库），开箱即用，一行命令即可拉取、运行模型。可定制化：支持通过 Modelfile 自定义模型的系统提示、生成参数、对话模板等，适配不同业务场景（如编程助手、知识库问答）。API 支持：内置 REST API，无需额外部署服务，即可轻松集成到 Python、Java 等各类应用程序中，实现二次开发。跨平台：完美支持 macOS、Linux、Windows 三大主流操作系统，部署环境灵活无限制。2. 环境安装安装前准备：确保设备满足基础要求——CPU 支持 AVX2 指令集（大多数 2017 年后的 CPU 均支持）；若需 GPU 加速，NVIDIA 显卡需支持 CUDA 11.7+，AMD 显卡需支持 Metal（macOS）或 ROCm（Linux）。2.1 macOS 安装方式 1：使用 Homebrew（推荐，适合已安装 Homebrew 的用户）# 安装 Ollama（自动处理依赖，配置环境变量） brew install ollama # 启动 Ollama 服务（设置开机自启，无需手动重启） brew services start ollama方式 2：手动安装（适合未安装 Homebrew 的用户）# 下载并运行官方安装脚本，自动完成安装和服务配置 curl -fsSL https://ollama.com/install.sh | sh2.2 Linux 安装支持 Ubuntu、CentOS、Debian 等主流发行版，脚本会自动适配系统架构（x86_64、ARM64）。# 通用安装脚本（自动安装依赖、配置服务） curl -fsSL https://ollama.com/install.sh | sh # 验证服务状态（systemd 系统，如 Ubuntu 18.04+、CentOS 7+） systemctl status ollama # 若服务未启动，手动启动并设置开机自启 systemctl start ollama systemctl enable ollama2.3 Windows 安装方式 1：官方安装包（推荐，操作最简单）访问 Ollama 官方下载页：https://ollama.com/download/windows下载 Windows 安装包（.exe 文件，约 100MB 左右）双击运行安装包，按照向导完成安装（默认安装路径为 C:Program FilesOllama）安装完成后，Ollama 会自动注册为系统服务并启动，无需手动操作。方式 2：使用 Winget（适合习惯命令行的用户）# 通过 Windows 包管理器（Winget）安装，自动完成配置 winget install Ollama.Ollama2.4 验证安装是否成功安装完成后，打开终端（macOS/Linux 终端、Windows PowerShell/命令提示符），执行以下命令验证：# 1. 检查 Ollama 版本（验证安装是否成功） ollama --version # 2. 运行内置的 llama3 模型（首次运行会自动拉取模型，约 4.7GB） ollama run llama3验证成功标志：执行 ollama --version 能输出版本号（如 ollama version 0.1.48），无报错。执行 ollama run llama3 后，终端会进入交互模式（显示 >>>），输入问题（如“什么是 Ollama？”）能得到模型的有效回答。若验证失败：检查终端是否以管理员身份运行；Windows 系统需重启终端刷新环境变量；Linux/macOS 系统可重启 Ollama 服务（brew services restart o…

Code - 异步批量分类+Excel保存
type: item
date: 2026-02-10T11:14:00+08:00
description: import asyncioimport aiohttpimport timeimport osfrom anyio import Semaphorefrom openpyxl import Workbookfrom dotenv import load_dotenv1. 环境配置（复用之前的，无需修改）load_dotenv()LLM_API_KEY = os.getenv("LLM_API_KEY")if not LLM_API_KEY:raise ValueError("❌ 未设置 LLM_API_KEY，请检查 .env 文件") LLM_API_URL = ("https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation")2. 整合工具类（异步API+Excel保存）class AsyncClassifier:def __init__(self): self.wb = Workbook() self.ws = self.wb.active self.ws.title = "政务文本分类结果" self.headers = [ "文本ID", "原文", "分类标签", "置信度", "处理时间", "调用状态", "异常信息", ] self.ws.append(self.headers) self.text_id = 1 # 异步API调用（复用例子3） async def call_llm_async(self, text: str) -> dict: try: async with aiohttp.ClientSession() as session: categories = ["政策通知", "群众咨询", "投诉举报", "政务公告", "其他"] prompt = ( f"你是一个政务文本分类器。请将以下文本严格分类为：{', '.join(categories)}。\n" f"只输出类别名称，不要任何解释或标点。\n\n" f"文本：{text}\n" f"类别：" ) # 构造请求头和请求体 headers = { "Authorization": f"Bearer {LLM_API_KEY}", "Content-Type": "application/json", } payload = { "model": "qwen-turbo-latest", # 或 qwen-max / qwen-plus "input": {"messages": [{"role": "user", "content": prompt}]}, "parameters": { "max_tokens": 10, "temperature": 0.1, # 降低随机性，提高稳定性 "seed": 12345, # 可选：固定种子 }, } async with session.post( url=LLM_API_URL, headers=headers, json=payload, timeout=30 ) as reponse: result = await reponse.json() # print(result, "\n") # 提取模型输出 output_text = result.get("output", {}).get("text", "").strip() # 简单置信度模拟（实际无法获取真实 confidence，可设为 1.0 或基于规则） confidence = 1.0 if output_text in categories else 0.0 return { "text": text, "category": output_text if confidence > 0 else "", "confidence": confidence, "status": "成功" if confidence > 0 else "失败", "error_msg": ( "" if confidence > 0 else f"模型返回无效类别: '{output_text}'" ), } except Exception as e: return { "text": text, "category": "", "confidence": 0.0, "status": "失败", "error_msg": str(e), } # 批量异步分类+保存结果（核心整合） async def batch_classify_and_save(self, texts: list[str], batch_size: int = …

Code - aiohttp 异步调用API（关键优化，提升效率）
type: item
date: 2026-02-10T09:58:36+08:00
description: 异步调用API（关键优化，提升效率）import asynciofrom urllib import responseimport aiohttpimport osfrom dotenv import load_dotenv1. 环境配置（复用之前的，无需修改）load_dotenv()LLM_API_KEY = os.getenv("LLM_API_KEY")if not LLM_API_KEY:raise ValueError("❌ 未设置 LLM_API_KEY，请检查 .env 文件") LLM_API_URL = ("https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation")async def call_llm_async(text: str):try: """异步调用大模型API，单条文本分类""" async with aiohttp.ClientSession() as session: # 构造 Prompt（关键：让模型知道要做什么） categories = ["政策通知", "群众咨询", "投诉举报", "政务公告", "其他"] prompt = ( f"你是一个政务文本分类器。请将以下文本严格分类为：{', '.join(categories)}。\n" f"只输出类别名称，不要任何解释或标点。\n\n" f"文本：{text}\n" f"类别：" ) # 构造请求头和请求体 headers = { "Authorization": f"Bearer {LLM_API_KEY}", "Content-Type": "application/json", } payload = { "model": "qwen-turbo-latest", # 或 qwen-max / qwen-plus "input": {"messages": [{"role": "user", "content": prompt}]}, "parameters": { "max_tokens": 10, "temperature": 0.1, # 降低随机性，提高稳定性 "seed": 12345, # 可选：固定种子 }, } async with session.post( url=LLM_API_URL, headers=headers, json=payload, timeout=30 ) as reponse: result = await reponse.json() # print(result, "\n") # 提取模型输出 output_text = result.get("output", {}).get("text", "").strip() # 简单置信度模拟（实际无法获取真实 confidence，可设为 1.0 或基于规则） confidence = 1.0 if output_text in categories else 0.0 return { "text": text, "category": output_text if confidence > 0 else "", "confidence": confidence, "status": "成功" if confidence > 0 else "失败", "error_msg": ( "" if confidence > 0 else f"模型返回无效类别: '{output_text}'" ), } except Exception as e: return { "text": text, "category": "", "confidence": 0.0, "status": "失败", "error_msg": str(e), } async def batch_async_classify(texts: list[str]):"""批量异步分类，同时发起多个API请求""" tasks = [call_llm_async(text) for text in texts] # 批量执行所有任务，等待全部完成（asyncio.gather是核心） results = await asyncio.gather(*tasks) return results if name == "__main__":# 测试3条文本，异步同时调用API test_texts = [ "济南市2024年民生政策通知", "群众咨询社保缴费流程", "投诉举报小区垃圾清运不及时", ] # 启动异步任务，获取结果 results = asyncio.run…

Code -同步调用大模型API 处理文本
type: item
date: 2026-02-09T13:36:19+08:00
description: 核心第一步——同步调用大模型API（理解API交互）import requestsimport osfrom dotenv import load_dotenv1. 环境配置load_dotenv()LLM_API_KEY = os.getenv("LLM_API_KEY")if not LLM_API_KEY:raise ValueError("❌ 未设置 LLM_API_KEY，请检查 .env 文件") LLM_API_URL = ("https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation")2. 同步调用APIdef call_llm_sync(text: str):"""同步调用 DashScope Qwen 模型进行文本分类""" try: # 构造 Prompt（关键：让模型知道要做什么） categories = ["政策通知", "群众咨询", "投诉举报", "政务公告", "其他"] prompt = ( f"你是一个政务文本分类器。请将以下文本严格分类为：{', '.join(categories)}。\n" f"只输出类别名称，不要任何解释或标点。\n\n" f"文本：{text}\n" f"类别：" ) # 构造请求头和请求体 headers = { "Authorization": f"Bearer {LLM_API_KEY}", "Content-Type": "application/json", } payload = { "model": "qwen-turbo-latest", # 或 qwen-max / qwen-plus "input": {"messages": [{"role": "user", "content": prompt}]}, "parameters": { "max_tokens": 10, "temperature": 0.1, # 降低随机性，提高稳定性 "seed": 12345, # 可选：固定种子 }, } # 发送 POST 请求 response = requests.post( url=LLM_API_URL, headers=headers, json=payload, timeout=30 ) response.raise_for_status() # 抛出 HTTP 异常（如 401, 400, 500） result = response.json() # 提取模型输出 output_text = result.get("output", {}).get("text", "").strip() # 简单置信度模拟（实际无法获取真实 confidence，可设为 1.0 或基于规则） confidence = 1.0 if output_text in categories else 0.0 return { "text": text, "category": output_text if confidence > 0 else "", "confidence": confidence, "status": "成功" if confidence > 0 else "失败", "error_msg": "" if confidence > 0 else f"模型返回无效类别: '{output_text}'", } except Exception as e: return { "text": text, "category": "", "confidence": 0.0, "status": "失败", "error_msg": str(e), } 测试代码if name == "__main__":test_text = "群众投诉小区垃圾清运不及时，影响生活环境" result = call_llm_sync(test_text) print("API调用结果：", result)