lm studio 2026 review

LM Studio 2026:桌面级大模型工具评测

LM Studio 2026:从工具到平台 LM Studio 在 2026 年完成了一次重要蜕变:从一个"本地运行 LLM 的桌面工具"进化为"桌面级 AI 开发平台"。对于不想折腾命令行的用户来说,LM Studio 提供了最友好的本地大模型体验——图形界面管理模型、对话测试、API 服务、RAG 构建,一切都在一个应用中完成。 2026 核心功能 功能总览 LM Studio 2026 ├── 模型管理 │ ├── 模型搜索与浏览(HuggingFace 集成) │ ├── 一键下载与安装 │ ├── 模型版本管理 │ └── 自定义模型导入 ├── 对话界面 │ ├── 多模型并行对话 │ ├── 对比测试模式 │ ├── 参数可视化调节 │ └── 对话历史管理 ├── 开发工具 │ ├── OpenAI 兼容 API 服务器 │ ├── RAG 工作台 │ ├── Prompt 实验室 │ └── 函数调用测试器 ├── 部署工具 │ ├── 本地服务部署 │ ├── Docker 容器导出 │ └── 配置文件导出 └── 社区功能 ├── 模型评分与评价 ├── Prompt 分享 └── 配置模板 与 2024 版本对比 特性 LM Studio 0.2 (2024) LM Studio 0.4 (2026) 多模型对话 不支持 并行对比 4 个模型 API 服务 OpenAI 兼容 OpenAI + Anthropic + 嵌入 RAG 不支持 内置 RAG 工作台 函数调用 不支持 原生支持 多模态 不支持 图像理解 模型格式 GGUF GGUF + Safetensors + MLX 平台 Win/Mac/Linux Win/Mac/Linux + CLI 推理引擎 llama.cpp llama.cpp + MLX + vLLM 核心功能深度评测 1. 模型管理 LM Studio 的模型管理是同类工具中体验最好的: ...

2026-06-28 · 4 min · 842 words · 硅基 AGI 探索者
mastra typescript agent framework

Mastra:TypeScript 原生 Agent 框架评测

TypeScript 开发者的 Agent 框架 2026 年,Agent 框架的生态以 Python 为主流,但大量全栈开发者的技术栈是 TypeScript。Mastra 正是为这群人打造的——一个 TypeScript 原生的 Agent 框架,不是 Python 框架的移植,而是从零开始为 TypeScript 生态设计的。 设计理念 Mastra 的核心理念: TS Native:利用 TypeScript 的类型系统,而非 Python 的动态特性 Edge Ready:支持 Vercel Edge Functions、Cloudflare Workers 等边缘计算平台 Full-Stack:前端、后端、CLI 工具链一体化 React Integration:与 React/Next.js 生态无缝集成 快速上手 安装与初始化 # 创建新项目 npx create-mastra@latest my-agent-app # 项目结构 my-agent-app/ ├── src/ │ ├── agents/ │ │ ├── research-agent.ts │ │ └── writing-agent.ts │ ├── workflows/ │ │ └── content-pipeline.ts │ ├── tools/ │ │ ├── search.ts │ │ └── database.ts │ ├── Mastra.config.ts │ └── index.ts ├── mastra/ │ └── playground/ # 可视化调试界面 ├── package.json └── tsconfig.json 定义 Agent import { Mastra } from '@mastra/core'; import { createAgent } from '@mastra/core/agent'; import { openai } from '@ai-sdk/openai'; import { z } from 'zod'; // 使用 Zod 定义结构化输出 const researchOutputSchema = z.object({ topic: z.string(), keyFindings: z.array(z.string()), confidence: z.number().min(0).max(1), sources: z.array(z.object({ url: z.string().url(), title: z.string(), reliability: z.enum(['high', 'medium', 'low']) })), recommendation: z.enum(['proceed', 'caution', 'avoid']) }); // 创建 Agent export const researchAgent = createAgent({ name: 'research-agent', description: '深度研究分析师', model: openai('gpt-4o'), instructions: `你是一名专业研究分析师。 - 始终提供来源链接 - 区分事实和推测 - 给出明确的置信度评分 - 保守地给出建议`, outputSchema: researchOutputSchema, tools: { webSearch: searchTool, knowledgeBase: kbTool, }, memory: { type: 'semantic', config: { embeddings: openai.embedding('text-embedding-3-large'), vectorStore: 'pgvector', }, }, // TypeScript 完整类型推导 // output 类型自动推断为 z.infer<typeof researchOutputSchema> }); 工具定义 import { createTool } from '@mastra/core/tools'; import { z } from 'zod'; // 类型安全的工具定义 export const searchTool = createTool({ id: 'web-search', description: '搜索互联网获取最新信息', inputSchema: z.object({ query: z.string().describe('搜索查询'), maxResults: z.number().default(10).describe('最大返回数'), timeRange: z.enum(['day', 'week', 'month', 'year']).optional() .describe('时间范围'), }), outputSchema: z.object({ results: z.array(z.object({ title: z.string(), url: z.string().url(), snippet: z.string(), publishedAt: z.string().datetime().optional(), })), totalResults: z.number(), }), execute: async ({ input, context }) => { // input 类型自动推断:{ query: string, maxResults: number, ... } const response = await fetch( `https://api.search.com/v1/search?q=${encodeURIComponent(input.query)}&limit=${input.maxResults}` ); const data = await response.json(); return { results: data.items.map((item: any) => ({ title: item.title, url: item.link, snippet: item.snippet, publishedAt: item.publishedAt, })), totalResults: data.totalResults, }; }, }); // 数据库工具 export const dbTool = createTool({ id: 'database-query', description: '查询内部数据库', inputSchema: z.object({ sql: z.string().describe('SQL 查询语句(只读)'), params: z.array(z.union([z.string(), z.number()])).optional(), }), outputSchema: z.object({ rows: z.array(z.record(z.unknown())), rowCount: z.number(), }), execute: async ({ input, context }) => { const client = await context.db.connect(); try { // SQL 注入防护 if (!/^SELECT/i.test(input.sql)) { throw new Error('仅允许 SELECT 查询'); } const result = await client.query(input.sql, input.params || []); return { rows: result.rows, rowCount: result.rowCount, }; } finally { client.release(); } }, }); Workflow 引擎 Mastra 的 Workflow 引擎支持状态机和工作流编排: ...

2026-06-28 · 5 min · 1046 words · 硅基 AGI 探索者
mlx apple silicon inference

MLX:Apple Silicon 上的大模型推理框架

MLX:Apple 的 AI 底座 MLX 是 Apple 在 2023 年底开源的机器学习框架,专为 Apple Silicon(M1-M4 系列)设计。到 2026 年,MLX 已经成为 Mac 上运行大模型的最佳选择——它充分利用了统一内存架构(Unified Memory),让 Mac 用户能够高效运行 70B 级别的模型。 与 CUDA + vLLM 的组合类似,MLX + mlx-lm 是 Mac 用户的"本地大模型推理方案"。 Apple Silicon 的独特优势 统一内存架构 传统 PC 架构: ┌─────────┐ ┌──────────┐ │ CPU │────│ GPU VRAM │ │ RAM │ │ 24 GB │ │ 64 GB │ └──────────┘ └─────────┘ 数据需要在 CPU RAM 和 GPU VRAM 之间拷贝 Apple Silicon 架构: ┌─────────────────────────┐ │ Unified Memory │ │ 128 GB │ │ ┌─────┐ ┌─────┐ │ │ │ CPU │ │ GPU │ │ │ │ Cores│ │Cores│ │ │ └─────┘ └─────┘ │ │ ┌─────┐ ┌─────┐ │ │ │Neural│ │Media│ │ │ │Engine│ │Engine│ │ │ └─────┘ └─────┘ │ └─────────────────────────┘ CPU 和 GPU 共享同一块内存,零拷贝 Mac GPU 内存对照 Mac 型号 统一内存 可用于 LLM 推荐最大模型 M3 MacBook Air 16 GB ~10 GB 7B (Q4) M3 Pro MacBook 36 GB ~28 GB 32B (Q4) M3 Max MacBook 64 GB ~52 GB 72B (Q4) M3 Max MacBook 128 GB ~110 GB 72B (Q8) M4 Max Mac Studio 128 GB ~112 GB 72B (Q8) M4 Ultra Mac Studio 256 GB ~230 GB 120B (Q8) MLX 核心能力 安装 # 安装 MLX 和 mlx-lm pip install mlx-lm # 或安装完整 MLX pip install mlx 基础推理 from mlx_lm import load, generate # 加载模型 model, tokenizer = load( "mlx-community/Qwen2.5-32B-Instruct-4bit", # MLX 自动选择最优量化方案 # 4bit 模型约 18 GB 内存 ) # 生成 response = generate( model, tokenizer, prompt="解释量子纠缠", max_tokens=512, temp=0.7, top_p=0.9, verbose=True # 显示 token 速度 ) # 流式生成 from mlx_lm import stream_generate for token in stream_generate( model, tokenizer, prompt="写一首关于春天的诗", max_tokens=200 ): print(token.text, end="", flush=True) OpenAI 兼容 API 服务 from mlx_lm.server import run_server # 启动 API 服务器 run_server( model="mlx-community/Qwen2.5-32B-Instruct-4bit", host="0.0.0.0", port=8080, # API 兼容 OpenAI ) # 或通过命令行启动 mlx_lm.server \ --model mlx-community/Qwen2.5-32B-Instruct-4bit \ --port 8080 \ --host 0.0.0.0 # 使用 OpenAI SDK 调用 from openai import OpenAI client = OpenAI(base_url="http://localhost:8080/v1", api_key="mlx") response = client.chat.completions.create( model="default", messages=[{"role": "user", "content": "Hello!"}], stream=True ) 模型转换 import mlx.core as mx from mlx_lm import convert # 将 HuggingFace 模型转换为 MLX 格式 convert( hf_path="Qwen/Qwen2.5-32B-Instruct", mlx_path="mlx-models/qwen-32b-4bit", quantize=True, q_bits=4, # 4-bit 量化 q_group_size=64, # 量化组大小 dtype=mx.float16, ) # 转换后可以直接加载使用 model, tokenizer = load("mlx-models/qwen-32b-4bit") 多模态推理 from mlx_vlm import load, generate from mlx_vlm.prompt_utils import apply_chat_template from mlx_vlm.utils import load_config # 加载多模态模型 model, processor = load("mlx-community/Qwen2.5-VL-32B-Instruct-4bit") config = load_config("mlx-community/Qwen2.5-VL-32B-Instruct-4bit") # 图像理解 image = "path/to/image.jpg" prompt = "描述这张图片的内容" formatted_prompt = apply_chat_template( processor, config, prompt, num_images=1 ) output = generate( model, processor, formatted_prompt, [image], max_tokens=500, verbose=True ) 性能优化 量化策略 import mlx.core as mx # 不同量化方案对比 quantization_configs = { "4bit": {"bits": 4, "group_size": 64}, # 最省内存 "6bit": {"bits": 6, "group_size": 64}, # 平衡 "8bit": {"bits": 8, "group_size": 64}, # 最高质量 "4bit_gs128": {"bits": 4, "group_size": 128}, # 大组,更快 } # 性能对比(M3 Max, Qwen2.5-32B) # | 方案 | 内存 | 速度 | 质量 | # |---------|-------|-----------|------| # | 4bit | 18 GB | 42 tok/s | 良 | # | 6bit | 26 GB | 38 tok/s | 优 | # | 8bit | 34 GB | 35 tok/s | 最优 | # | 4bit_gs | 18 GB | 48 tok/s | 良 | 内存优化 from mlx_lm import load, generate import mlx.core as mx # 1. 使用统一内存 mx.metal.set_memory_limit(48 * 1024 * 1024 * 1024) # 48 GB 限制 # 2. 启用内存回收 mx.metal.set_memory_efficient(True) # 3. KV Cache 量化 model, tokenizer = load( "mlx-community/Qwen2.5-32B-Instruct-4bit", kv_cache_quantization=True, # KV Cache 4bit 量化 kv_cache_bits=4, ) # 4. 长上下文优化 generate( model, tokenizer, prompt="长文本...", max_tokens=4096, # MLX 自动管理 KV Cache # 统一内存让长上下文更高效 ) 性能基准 Mac 型号 模型 量化 速度 (tok/s) 首 Token 内存 M3 Air 16GB Qwen2.5-7B 4bit 28 0.8s 5 GB M3 Pro 36GB Qwen2.5-14B 4bit 45 0.4s 9 GB M3 Max 64GB Qwen2.5-32B 4bit 42 0.5s 20 GB M3 Max 128GB Qwen2.5-72B 4bit 18 1.2s 42 GB M3 Max 128GB Qwen2.5-72B 8bit 15 1.5s 75 GB M4 Max 128GB Qwen2.5-72B 4bit 28 0.8s 42 GB M4 Ultra 256GB Qwen3-120B 8bit 22 1.0s 130 GB 与 Ollama 对比(M3 Max 64GB) 指标 MLX Ollama 差异 Qwen2.5-7B 速度 32 tok/s 28 tok/s +14% Qwen2.5-32B 速度 42 tok/s 45 tok/s -7% Qwen2.5-72B 速度 18 tok/s 18.5 tok/s -3% 首Token延迟 0.5s 0.8s -37% 内存占用 18 GB 20 GB -10% 模型加载 3s 6s -50% MLX 在小模型和首 Token 延迟上更优,Ollama 在大模型上略快。两者差距很小。 ...

2026-06-28 · 5 min · 909 words · 硅基 AGI 探索者
ollama 2026 local llm

Ollama 2026:本地大模型运行的最佳实践

Ollama 2026:让本地大模型触手可及 Ollama 在 2026 年已经成为"本地运行大模型"的代名词。这个由 Go 语言编写的轻量级工具,让任何人都能在自己的电脑上运行大语言模型——无需 GPU 集群,无需复杂配置,一条命令即可开始。截至 2026 年 6 月,Ollama 累计下载量超过 2000 万次,月活用户超过 300 万。 2026 核心特性 版本亮点 特性 Ollama 0.1 (2024) Ollama 0.5 (2026) 模型格式 GGUF GGUF + Safetensors 多模态 不支持 图像 + 音频 并发推理 不支持 原生支持 模型仓库 50+ 模型 500+ 模型 API 兼容 OpenAI OpenAI + Anthropic 分布式 不支持 多节点推理 量化 Q4 Q2-Q8 + FP8 上下文 8k 1M+ Windows 实验性 原生支持 安装与配置 安装 # macOS brew install ollama # Linux curl -fsSL https://ollama.com/install.sh | sh # Windows (PowerShell) winget install Ollama.Ollama # Docker docker run -d --name ollama -p 11434:11434 -v ollama_data:/root/.ollama ollama/ollama:0.5 配置 # 环境变量配置 export OLLAMA_HOST=0.0.0.0:11434 export OLLAMA_MAX_LOADED_MODELS=3 # 最大同时加载模型数 export OLLAMA_MAX_VRAM=0 # 0=自动检测 export OLLAMA_NUM_PARALLEL=4 # 并发请求数 export OLLAMA_KEEP_ALIVE=24h # 模型保活时间 export OLLAMA_FLASH_ATTENTION=1 # Flash Attention export OLLAMA_KV_CACHE_TYPE=q8_0 # KV Cache 量化 export OLLAMA_NUM_CTX=32768 # 默认上下文长度 模型管理 拉取与运行 # 拉取模型 ollama pull qwen3:72b # Qwen 3 72B(默认 Q4 量化) ollama pull qwen3:72b-q8_0 # Q8 量化(更高质量) ollama pull llama4:70b-instruct ollama pull deepseek-v3:671b # DeepSeek V3 MoE # 运行模型 ollama run qwen3:72b "解释量子纠缠" # 查看已安装模型 ollama list # 查看运行中的模型 ollama ps # 删除模型 ollama rm qwen3:72b 自定义模型 # Modelfile(类似 Dockerfile) FROM qwen3:72b # 系统提示 SYSTEM """ 你是一个专业的中文技术写作助手。你的任务是: 1. 撰写清晰、准确的技术文档 2. 使用中文,技术术语保留英文 3. 包含代码示例和对比表格 4. 保持客观、专业的语气 """ # 参数 PARAMETER temperature 0.3 PARAMETER top_p 0.9 PARAMETER num_ctx 32768 PARAMETER repeat_penalty 1.1 PARAMETER stop "<|im_end|>" # 模板 TEMPLATE """ {{ if .System }}<|im_start|>system {{ .System }}<|im_end|> {{ end }}<|im_start|>user {{ .Prompt }}<|im_end|> <|im_start|>assistant """ # 工具定义 TOOL search_web { "description": "搜索互联网", "parameters": { "type": "object", "properties": { "query": {"type": "string"} } } } # 构建自定义模型 ollama create tech-writer -f Modelfile # 运行 ollama run tech-writer "写一篇关于 RAG 架构的文章" API 使用 REST API import httpx import json import asyncio class OllamaClient: def __init__(self, base_url="http://localhost:11434"): self.base_url = base_url self.client = httpx.AsyncClient(base_url=base_url, timeout=300) async def chat(self, model: str, messages: list, stream=False, **kwargs): """对话接口""" response = await self.client.post("/api/chat", json={ "model": model, "messages": messages, "stream": stream, "options": { "temperature": kwargs.get("temperature", 0.7), "top_p": kwargs.get("top_p", 0.9), "num_ctx": kwargs.get("num_ctx", 32768), }, "tools": kwargs.get("tools", []), }) return response.json() async def chat_stream(self, model: str, messages: list): """流式对话""" async with self.client.stream("POST", "/api/chat", json={ "model": model, "messages": messages, "stream": True, }) as response: async for line in response.aiter_lines(): data = json.loads(line) if data.get("message", {}).get("content"): yield data["message"]["content"] if data.get("done"): break async def embed(self, model: str, input: str | list): """生成向量嵌入""" response = await self.client.post("/api/embed", json={ "model": model, "input": input, }) return response.json()["embeddings"] async def generate(self, model: str, prompt: str, images: list = None): """多模态生成""" response = await self.client.post("/api/generate", json={ "model": model, "prompt": prompt, "images": images or [], "stream": False, }) return response.json() # 使用 client = OllamaClient() # 对话 result = await client.chat( model="qwen3:72b", messages=[ {"role": "system", "content": "你是专业翻译"}, {"role": "user", "content": "翻译:AGI will change everything"} ], temperature=0.3 ) # 流式输出 async for chunk in client.chat_stream( model="qwen3:72b", messages=[{"role": "user", "content": "写一首诗"}] ): print(chunk, end="", flush=True) # 向量嵌入 embeddings = await client.embed( model="bge-m3", input=["你好世界", "Hello World"] ) OpenAI 兼容接口 from openai import OpenAI # Ollama 兼容 OpenAI API client = OpenAI( base_url="http://localhost:11434/v1", api_key="ollama" # 任意值即可 ) response = client.chat.completions.create( model="qwen3:72b", messages=[{"role": "user", "content": "Hello!"}], stream=True ) 工具调用 # Ollama 2026 原生支持工具调用 result = await client.chat( model="qwen3:72b", messages=[{"role": "user", "content": "北京今天天气怎么样?"}], tools=[{ "type": "function", "function": { "name": "get_weather", "description": "获取天气信息", "parameters": { "type": "object", "properties": { "city": {"type": "string"} }, "required": ["city"] } } }] ) # 模型返回工具调用 if result.get("message", {}).get("tool_calls"): tool_call = result["message"]["tool_calls"][0] print(f"调用工具: {tool_call['function']['name']}") print(f"参数: {tool_call['function']['arguments']}") 性能优化 量化选择 量化 显存/内存 质量 速度 推荐场景 Q2_K 最低 差 最快 测试/验证 Q4_0 低 中 快 低配设备 Q4_K_M 中低 良 快 日常使用(推荐) Q5_K_M 中 好 中 质量优先 Q8_0 高 优 中 最高质量 FP16 最高 最优 慢 无量化 硬件适配 # CPU 推理优化 export OLLAMA_NUM_THREAD=8 # CPU 线程数 export OLLAMA_NUM_CTX=8192 # 降低上下文长度 # GPU 推理优化 export OLLAMA_GPU_LAYERS=80 # GPU 层数(-1 全部) export OLLAMA_FLASH_ATTENTION=1 # Flash Attention export OLLAMA_KV_CACHE_TYPE=q8_0 # KV Cache 量化 # Apple Silicon 优化 export OLLAMA_METAL_GPU=1 # 使用 Metal export OLLAMA_KV_CACHE_TYPE=q4_0 # 统一内存节省 export OLLAMA_NUM_CTX=16384 # 适合 M 芯片 性能对比 硬件 模型 量化 速度 (tok/s) 首Token延迟 内存占用 M3 Max 64GB Qwen3-72B Q4_K_M 18.5 2.1s 42 GB M3 Max 64GB Qwen3-32B Q4_K_M 45.2 0.8s 20 GB RTX 4090 24GB Qwen3-14B Q4_K_M 85.3 0.3s 9 GB RTX 4090 24GB Qwen3-32B Q4_K_M 42.1 0.5s 20 GB 2×A100 80GB Qwen3-72B Q8_0 55.8 0.4s 75 GB CPU 32-core Qwen3-7B Q4_K_M 12.3 1.5s 5 GB 与应用集成 与 LangChain 集成 from langchain_ollama import ChatOllama, OllamaEmbeddings # 对话模型 llm = ChatOllama( model="qwen3:72b", temperature=0.7, base_url="http://localhost:11434" ) # 嵌入模型 embeddings = OllamaEmbeddings( model="bge-m3", base_url="http://localhost:11434" ) # 使用 from langchain_core.messages import HumanMessage response = llm.invoke([HumanMessage(content="你好")]) 与 Dify 集成 # Dify 配置 Ollama model_provider: name: ollama credentials: base_url: http://localhost:11434 models: - name: qwen3:72b type: llm context_size: 32768 - name: bge-m3 type: text-embedding context_size: 8192 多节点部署 # Ollama 集群配置(2026 新特性) # ollama-cluster.yaml nodes: - name: node-1 host: 192.168.1.101 port: 11434 gpu: "RTX 4090" models: ["qwen3:32b", "bge-m3"] - name: node-2 host: 192.168.1.102 port: 11434 gpu: "RTX 4090" models: ["qwen3:32b"] # 负载均衡 - name: node-3 host: 192.168.1.103 port: 11434 gpu: "A100 80GB" models: ["qwen3:72b"] # 大模型专用 # 路由策略 router: strategy: "least_loaded" # 最少负载 health_check_interval: 10 failover: true 适用场景 最适合 隐私敏感场景:数据不出本地的安全需求 离线环境:无网络或网络不稳定的环境 开发测试:快速测试不同模型的表现 边缘计算:IoT 设备、边缘服务器上的 AI 个人使用:在自己的电脑上运行 AI 助手 不太适合 高并发生产:吞吐量不如 vLLM/TGI 超大模型:671B 级别模型需要集群 成本敏感:相比云端 API,电费和硬件成本较高 总结 Ollama 在 2026 年仍然是"本地运行大模型"的最佳选择。它的核心价值不在于性能极致——vLLM 和 TensorRT-LLM 在吞吐量上更优——而在于"简单"。一条命令安装,一条命令运行,OpenAI 兼容 API,跨平台支持,这些特性让 Ollama 成为开发者在本地使用大模型的首选。 ...

2026-06-28 · 5 min · 888 words · 硅基 AGI 探索者
open webui 2026 chatgpt alternative

Open WebUI 2026:打造自己的 ChatGPT 界面

Open WebUI:自托管的 ChatGPT 替代品 Open WebUI(前身为 Ollama WebUI)在 2026 年已经成为最流行的自托管 AI 对话界面。它让你在自己的服务器上运行一个功能媲美 ChatGPT 的 Web 界面,同时保留对数据和模型的完全控制。截至 2026 年 6 月,Open WebUI 的 GitHub Stars 超过 75k,月活部署超过 10 万。 2026 核心特性 功能总览 Open WebUI 2026 ├── 对话功能 │ ├── 多模型并行对话 │ ├── 对话分支与版本管理 │ ├── 多模态(图片/文件/语音) │ └── 语音输入/输出(TTS/STT) ├── 模型管理 │ ├── Ollama 模型集成 │ ├── OpenAI/Anthropic API 集成 │ ├── 模型对比测试 │ └── 自定义模型配置 ├── 知识库 │ ├── 文档上传与索引 │ ├── RAG 对话 │ ├── 网页抓取 │ └── 多知识库管理 ├── 工具与插件 │ ├── 函数调用 │ ├── 自定义工具 │ ├── Web 搜索 │ └── 代码执行 ├── 用户管理 │ ├── 多用户 + RBAC │ ├── SSO 认证 │ └── 使用量统计 └── 部署 ├── Docker 一键部署 ├── Kubernetes 部署 └── 多实例集群 与 2024 版本对比 特性 Open WebUI 0.3 (2024) Open WebUI 0.5 (2026) 多模型对比 ❌ ✅ 并行对比 RAG 基础 高级(混合检索 + Reranking) 函数调用 ❌ ✅ 多模态 基础图片 图片 + 文件 + 语音 用户管理 基础 RBAC + SSO + 审计 工具插件 ❌ ✅ 插件市场 Pipeline ❌ ✅ 工作流编排 移动端 ❌ ✅ 响应式 + PWA 多语言 英文 20+ 语言 安装部署 Docker 一键部署 # 基础部署(连接本地 Ollama) docker run -d -p 3000:8080 \ --add-host=host.docker.internal:host-gateway \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:main # 连接远程 Ollama docker run -d -p 3000:8080 \ -e OLLAMA_BASE_URL=http://192.168.1.100:11434 \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:main # 连接 OpenAI API docker run -d -p 3000:8080 \ -e OPENAI_API_BASE_URL=https://api.openai.com/v1 \ -e OPENAI_API_KEY=sk-your-key \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:main Docker Compose 完整部署 version: '3.8' services: open-webui: image: ghcr.io/open-webui/open-webui:main ports: - "3000:8080" environment: # Ollama 连接 OLLAMA_BASE_URL: http://ollama:11434 # OpenAI API OPENAI_API_KEY: ${OPENAI_API_KEY} # Anthropic API ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY} # 数据库 DATABASE_URL: postgresql://openwebui:password@postgres:5432/openwebui # Redis 缓存 REDIS_URL: redis://redis:6379 # 认证 ENABLE_SIGNUP: false JWT_SECRET: ${JWT_SECRET} # RAG 配置 RAG_EMBEDDING_MODEL: bge-m3 RAG_RERANKING_MODEL: bge-reranker-v2-m3 CHROMA_TENANT_ID: default # TTS/STT TTS_ENGINE: openai STT_ENGINE: openai # 其他 WEBUI_AUTH: true WEBUI_NAME: "我的 AI 助手" volumes: - open-webui-data:/app/backend/data depends_on: - ollama - postgres - redis restart: always ollama: image: ollama/ollama:latest volumes: - ollama-data:/root/.ollama deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] restart: always postgres: image: postgres:16 environment: POSTGRES_USER: openwebui POSTGRES_PASSWORD: password POSTGRES_DB: openwebui volumes: - postgres-data:/var/lib/postgresql/data restart: always redis: image: redis:7-alpine restart: always volumes: open-webui-data: ollama-data: postgres-data: 核心功能使用 1. 多模型并行对话 Open WebUI 2026 支持同时与多个模型对话并对比结果: ...

2026-06-28 · 6 min · 1072 words · 硅基 AGI 掜索者
openclaw 2026 progress

OpenClaw 龙虾智能体 2026 最新进展

OpenClaw 2026:个人 AI 助手的新范式 OpenClaw(龙虾智能体)在 2026 年迎来了诞生以来最重要的一次架构升级。作为一个定位为"个人 AI 操作系统"的开源项目,OpenClaw 的核心理念是:让每个人拥有一个真正属于自己的、可深度定制的、跨设备运行的智能体。 2026 核心架构 总体架构 ┌─────────────────────────────────────────────────────────┐ │ 用户界面层 │ │ WebChat │ 微信 │ Discord │ Telegram │ 桌面客户端 │ └──────────────────────┬──────────────────────────────────┘ │ ┌──────────────────────┴──────────────────────────────────┐ │ Gateway 网关层 │ │ 消息路由 │ 会话管理 │ 权限控制 │ 限流策略 │ 多模型切换 │ └──────────────────────┬──────────────────────────────────┘ │ ┌──────────────────────┴──────────────────────────────────┐ │ Agent 核心层 │ │ ┌─────────┐ ┌─────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 推理引擎 │ │ 记忆系统 │ │ Skill 引擎│ │ 工具执行 │ │ │ │ (LLM) │ │(Memory) │ │ (Skills) │ │ (Tools) │ │ │ └─────────┘ └─────────┘ └──────────┘ └──────────┘ │ │ ┌─────────┐ ┌─────────┐ ┌──────────┐ │ │ │ 子Agent │ │ 定时任务 │ │ 节点管理 │ │ │ │(Subagent│ │ (Cron) │ │ (Nodes) │ │ │ └─────────┘ └─────────┘ └──────────┘ │ └──────────────────────┬──────────────────────────────────┘ │ ┌──────────────────────┴──────────────────────────────────┐ │ 存储与集成层 │ │ 文件系统 │ SQLite │ 向量库 │ MCP协议 │ API集成 │ └─────────────────────────────────────────────────────────┘ Skill 系统:插件化能力扩展 OpenClaw 2026 最显著的改进是 Skill 系统的成熟。每个 Skill 是一个独立的能力模块,通过标准化的接口与 Agent 核心交互: ...

2026-06-28 · 4 min · 697 words · 硅基 AGI 探索者
pydantic ai type safe agent

Pydantic AI:类型安全的 Agent 开发框架

当类型安全遇上 AI Agent Pydantic AI 是 Pydantic 团队在 2025 年推出的 Agent 框架,核心理念是将 Python 的类型系统引入 Agent 开发。在大多数 Agent 框架中,LLM 输出的结构化数据依赖运行时验证——如果 LLM 输出不符合预期,你只能在运行时发现问题。Pydantic AI 通过编译时类型检查 + 运行时 Schema 验证,将这类问题消灭在开发阶段。 核心设计 类型驱动的 Agent 定义 from pydantic_ai import Agent, RunContext from pydantic import BaseModel, Field from typing import Literal from dataclasses import dataclass # 定义结构化输出 class ResearchReport(BaseModel): title: str = Field(description="报告标题") summary: str = Field(description="执行摘要,不超过200字") key_findings: list[str] = Field(description="关键发现列表") confidence: float = Field(ge=0, le=1, description="置信度 0-1") sources: list[str] = Field(description="信息来源 URL 列表") recommendation: Literal["buy", "hold", "sell"] = Field(description="投资建议") # 定义依赖类型 @dataclass class ResearchDeps: api_keys: dict[str, str] database_url: str max_sources: int = 10 # 创建 Agent research_agent = Agent( model="openai:gpt-4o", deps_type=ResearchDeps, output_type=ResearchReport, # 类型安全的输出 system_prompt="你是一名专业的研究分析师..." ) # 类型安全的工具定义 @research_agent.tool async def search_database(ctx: RunContext[ResearchDeps], query: str, limit: int = 10) -> list[dict]: """ 搜索内部数据库。 Args: query: 搜索查询 limit: 返回结果数量上限 """ # ctx.deps 是 ResearchDeps 类型,IDE 自动补全 async with httpx.AsyncClient() as client: response = await client.post( f"{ctx.deps.database_url}/search", json={"query": query, "limit": min(limit, ctx.deps.max_sources)}, headers={"Authorization": f"Bearer {ctx.deps.api_keys['database']}"} ) return response.json()["results"] @research_agent.tool async def fetch_web_page(ctx: RunContext[ResearchDeps], url: str) -> str: """获取网页内容。""" async with httpx.AsyncClient() as client: response = await client.get(url, timeout=10) return response.text[:5000] # 限制内容长度 # 运行 Agent —— 输出类型自动验证 result = await research_agent.run( "分析 2026 年 AGI 芯片市场", deps=ResearchDeps( api_keys={"database": "xxx"}, database_url="https://api.example.com" ) ) # result.output 是 ResearchReport 类型,IDE 完整支持 print(result.output.title) print(result.output.confidence) print(result.output.recommendation) # 如果 LLM 输出不符合 Schema,Pydantic 会抛出 # ValidationError,而非静默返回错误数据 核心特性 1. 结构化输出保证 from pydantic_ai import Agent from pydantic import BaseModel, validator from typing import Optional class CodeReview(BaseModel): file_name: str issues: list["CodeIssue"] overall_rating: int = Field(ge=1, le=10, description="整体评分 1-10") approved: bool @validator("file_name") def validate_filename(cls, v): if not v.endswith((".py", ".js", ".ts")): raise ValueError("仅支持 .py/.js/.ts 文件") return v class CodeIssue(BaseModel): line_number: int = Field(ge=1) severity: Literal["error", "warning", "info"] message: str suggestion: Optional[str] = None review_agent = Agent( model="anthropic:claude-4-sonnet", output_type=CodeReview, system_prompt="你是代码审查专家,分析代码质量问题。" ) # Agent 输出保证符合 CodeReview Schema result = await review_agent.run("审查以下代码: ...") review: CodeReview = result.output # 类型保证 2. 多模型支持与切换 from pydantic_ai.models import Model from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.models.anthropic import AnthropicModel from pydantic_ai.models.groq import GroqModel # 环境感知模型选择 def get_model() -> Model: env = os.getenv("ENVIRONMENT", "dev") if env == "production": return OpenAIModel("gpt-4o", api_key=os.getenv("OPENAI_API_KEY")) elif env == "staging": return AnthropicModel("claude-4-sonnet", api_key=os.getenv("ANTHROPIC_API_KEY")) elif env == "dev": return GroqModel("llama-4-70b", api_key=os.getenv("GROQ_API_KEY")) else: # 使用 Ollama 本地模型 return OpenAIModel( "qwen3:72b", base_url="http://localhost:11434/v1", api_key="ollama" ) agent = Agent( model=get_model(), output_type=ResearchReport, system_prompt="..." ) # 运行时切换模型 result = await agent.run("...", model=AnthropicModel("claude-4-opus")) 3. 流式输出 from pydantic_ai import Agent from pydantic_ai.messages import Part streaming_agent = Agent( model="openai:gpt-4o", system_prompt="你是技术写作助手..." ) # 流式输出 async with streaming_agent.run_stream("写一篇关于 AGI 的短文") as result: async for message in result.stream_text(delta=True): print(message, end="", flush=True) # 流式结构化输出(2026 新特性) class ArticleOutline(BaseModel): title: str sections: list[str] estimated_words: int async with streaming_agent.run_stream( "生成文章大纲", output_type=ArticleOutline ) as result: # 部分结果流式返回 async for partial in result.stream_structured(): print(f"当前大纲: {partial.title} ({len(partial.sections)} 节)") final = await result.get_output() print(f"最终大纲: {final}") 4. 依赖注入 from pydantic_ai import Agent, RunContext from dataclasses import dataclass import httpx import asyncio @dataclass class AppDeps: http_client: httpx.AsyncClient db_pool: asyncpg.Pool cache: redis.Redis config: dict # 所有工具共享同一个依赖上下文 agent = Agent("openai:gpt-4o", deps_type=AppDeps) @agent.tool async def get_user_profile(ctx: RunContext[AppDeps], user_id: int) -> dict: # 从缓存获取 cached = await ctx.deps.cache.get(f"user:{user_id}") if cached: return json.loads(cached) # 从数据库获取 async with ctx.deps.db_pool.acquire() as conn: user = await conn.fetchrow( "SELECT * FROM users WHERE id = $1", user_id ) # 写入缓存 await ctx.deps.cache.setex(f"user:{user_id}", 3600, json.dumps(dict(user))) return dict(user) @agent.tool async def call_external_api(ctx: RunContext[AppDeps], url: str) -> dict: response = await ctx.deps.http_client.get(url) return response.json() # 运行时注入依赖 async def main(): async with httpx.AsyncClient() as http_client: db_pool = await asyncpg.create_pool(DATABASE_URL) cache = redis.Redis() deps = AppDeps( http_client=http_client, db_pool=db_pool, cache=cache, config={"max_results": 50} ) result = await agent.run("查询用户 123 的信息", deps=deps) print(result.output) 5. Agent 组合 from pydantic_ai import Agent # 子 Agent:各自有独立的输出类型 research_agent = Agent( model="openai:gpt-4o", output_type=ResearchReport, system_prompt="你是研究员..." ) writing_agent = Agent( model="anthropic:claude-4-sonnet", output_type=Article, system_prompt="你是技术写手..." ) review_agent = Agent( model="openai:gpt-4o", output_type=ReviewResult, system_prompt="你是审稿人..." ) # 主 Agent 协调子 Agent class PipelineResult(BaseModel): research: ResearchReport article: Article review: ReviewResult final_status: str pipeline_agent = Agent( model="openai:gpt-4o", output_type=PipelineResult, system_prompt="你是项目经理,协调多个子任务..." ) # 主 Agent 可以委派给子 Agent @pipeline_agent.tool async def run_research(ctx: RunContext, topic: str) -> ResearchReport: result = await research_agent.run(topic, deps=ctx.deps) return result.output @pipeline_agent.tool async def run_writing(ctx: RunContext, research: ResearchReport) -> Article: result = await writing_agent.run( f"基于以下研究撰写文章: {research.model_dump_json()}", deps=ctx.deps ) return result.output 评估与测试 from pydantic_ai.evals import TestCase, Evaluator # 定义测试用例 test_cases = [ TestCase( input="分析苹果公司 2026 年 Q1 财报", expected_output=ResearchReport( title="苹果 2026 Q1 财报分析", summary="...", key_findings=["营收增长 15%", "服务业务创新高"], confidence=0.9, sources=["https://investor.apple.com"], recommendation="buy" ) ), # 更多测试用例... ] # 评估器 class ResearchEvaluator(Evaluator): async def evaluate(self, output: ResearchReport, expected: ResearchReport) -> float: score = 0.0 # 检查结构化字段 if output.recommendation == expected.recommendation: score += 0.3 # 检查发现重叠度 overlap = len(set(output.key_findings) & set(expected.key_findings)) score += 0.4 * (overlap / max(len(expected.key_findings), 1)) # 检查置信度合理性 if abs(output.confidence - expected.confidence) < 0.2: score += 0.3 return score # 运行评估 results = await Evaluator.run( agent=research_agent, test_cases=test_cases, evaluator=ResearchEvaluator() ) print(f"平均得分: {results.avg_score}") print(f"通过率: {results.pass_rate}") 框架对比 特性 Pydantic AI LangChain CrewAI smolagents 类型安全 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐ ⭐⭐ 结构化输出 编译时+运行时 运行时 运行时 无 学习曲线 中 高 低 低 IDE 支持 完整 部分 部分 部分 依赖注入 内置 无 无 无 流式输出 文本+结构化 文本 文本 文本 测试框架 内置 第三方 无 无 多模型 完整 完整 完整 HF 优先 性能基准 指标 Pydantic AI LangChain CrewAI Cold Start 0.2s 0.8s 0.5s 简单调用 1.1s 1.5s 1.8s 结构化输出 1.3s 1.8s 2.1s 内存占用 85MB 256MB 312MB Schema 验证开销 <50ms 100-200ms N/A 适用场景 最适合 企业级应用:类型安全是生产环境的刚需 API 后端:结构化输出直接映射 API 响应 数据管道:类型保证数据处理链路的可靠性 团队协作:类型系统作为 Agent 接口契约 不太适合 快速原型:类型定义增加了前期开发量 创意类任务:非结构化输出场景下类型约束是负担 复杂 Agent 图:不支持状态机编排 总结 Pydantic AI 在 2026 年的 Agent 框架竞争中找到了独特的定位:类型安全。这不是一个噱头——在实际的企业开发中,LLM 输出的不可预测性是最大的痛点之一。Pydantic AI 通过编译时类型检查、运行时 Schema 验证、依赖注入、内置测试框架,为 Agent 开发带来了真正的工程严谨性。 ...

2026-06-28 · 5 min · 915 words · 硅基 AGI 探索者
semantic kernel 2026

Semantic Kernel 2026:微软 AI 编排框架的成熟

微软的 AI 编排答卷 Semantic Kernel(SK)是微软在 2023 年初推出的 AI 编排框架,定位类似于"AI 版的 .NET CLR"。经过三年多的发展,2026 版的 SK 已经成为企业级 AI 应用的主流选择之一,特别是在微软生态(Azure、M365、Power Platform)中占据核心位置。 2026 核心架构 分层设计 ┌──────────────────────────────────────────────────┐ │ Application Layer │ │ Copilot Apps │ Plugins │ Agent Workflows │ ├──────────────────────────────────────────────────┤ │ Semantic Kernel Core │ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │ │ Kernel │ │ Planner │ │ Agent Framework │ │ │ │ (上下文) │ │ (规划器) │ │ (多Agent编排) │ │ │ └──────────┘ └──────────┘ └──────────────────┘ │ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │ │ Memory │ │ Filters │ │ Process Engine │ │ │ │ (记忆) │ │ (过滤器) │ │ (流程引擎) │ │ │ └──────────┘ └──────────┘ └──────────────────┘ │ ├──────────────────────────────────────────────────┤ │ Connector Layer │ │ LLM Connectors │ Vector DB │ Search │ Tools │ ├──────────────────────────────────────────────────┤ │ .NET / Python / Java │ └──────────────────────────────────────────────────┘ 多语言支持 2026 年 SK 的语言支持矩阵: ...

2026-06-28 · 4 min · 851 words · 硅基 AGI 探索者
sglang 2026 inference engine

SGLang 2026:结构化生成的高性能推理引擎

SGLang:被低估的推理黑马 SGLang(Structured Generation Language)在 2026 年从"学术项目"蜕变为"生产级推理引擎"。由 LMSYS 团队(ChatBot Arena 的创建者)开发,SGLang 的核心创新是 RadixAttention——一种基于基数树的 KV Cache 复用技术,在多轮对话和复杂 Agent 场景中实现了惊人的性能提升。 核心技术创新 1. RadixAttention RadixAttention 是 SGLang 的标志性技术。它将 KV Cache 组织为基数树结构,实现前缀复用: 传统方案:每个请求独立维护 KV Cache ┌──────┐ ┌──────┐ ┌──────┐ │Req 1 │ │Req 2 │ │Req 3 │ │KV │ │KV │ │KV │ │Cache │ │Cache │ │Cache │ └──────┘ └──────┘ └──────┘ 浪费:相同前缀重复计算 RadixAttention:共享前缀的 KV Cache ┌─ "用户: 你好" (共享) │ ├─ "助手: 你好!有什么可以帮您?" (Req 1) │ └─ "助手: 您好!请问需要什么帮助?" (Req 2) └─ "用户: 写代码" (共享) └─ "助手: 好的,请告诉我..." (Req 3) import sglang as sgl # RadixAttention 自动复用前缀 @sgl.function def multi_turn_chat(s, question): s += "以下是一个专业对话:\n" s += "用户: " + question + "\n" s += "助手: " + sgl.gen("answer", max_tokens=256) # 多轮对话中,前缀自动复用 # 第一轮 state1 = multi_turn_chat.run(question="什么是 RAG?") # 第二轮(复用第一轮的前缀) state2 = multi_turn_chat.run(question="RAG 和微调有什么区别?") # 第三轮(复用前两轮的前缀) state3 = multi_turn_chat.run(question="如何结合使用?") # KV Cache 复用率随轮次增加而提高 # 实测:5 轮对话后,KV Cache 复用率达 85%+ 2. 结构化输出 SGLang 原生支持 JSON Schema 约束生成: ...

2026-06-28 · 4 min · 761 words · 硅基 AGI 探索者
smolagents hf minimal agent

smolagents:HuggingFace 极简 Agent 框架实战

极简主义的胜利 在 Agent 框架越来越复杂的 2026 年,HuggingFace 的 smolagents 反其道而行之——用不到 1000 行核心代码实现一个功能完备的 Agent 框架。这不是噱头,而是对"Agent 本质"的深刻理解:Agent 的核心就是 LLM + 工具调用,其余都是装饰。 设计哲学 smolagents 的三个设计原则: Code as Action:Agent 直接生成 Python 代码作为 Action,而非 JSON/函数调用 Minimal Abstraction:最少抽象层,开发者直接控制每个细节 HF Ecosystem First:与 HuggingFace 生态无缝集成 快速上手 安装 pip install smolagents 第一个 Agent from smolagents import CodeAgent, HfApiModel, tool # 定义工具 @tool def get_weather(city: str) -> str: """ 获取指定城市的天气信息。 Args: city: 城市名称,如 "北京"、"上海" Returns: 天气描述字符串 """ # 实际实现中调用天气 API import requests resp = requests.get(f"https://api.weather.com/v1/{city}") data = resp.json() return f"{city}:{data['condition']},温度 {data['temp']}°C" @tool def calculate(expression: str) -> float: """ 安全地计算数学表达式。 Args: expression: 数学表达式,如 "2 + 3 * 4" Returns: 计算结果 """ import ast import operator ops = { ast.Add: operator.add, ast.Sub: operator.sub, ast.Mult: operator.mul, ast.Div: operator.truediv, ast.Pow: operator.pow } node = ast.parse(expression, mode='eval').body if isinstance(node, ast.BinOp): return ops[type(node.op)]( calculate(ast.unparse(node.left)), calculate(ast.unparse(node.right)) ) return ast.literal_eval(node) # 创建 Agent agent = CodeAgent( model=HfApiModel("Qwen/Qwen2.5-72B-Instruct"), # 免费使用 HF Inference API tools=[get_weather, calculate], max_steps=10, verbosity_level=2 ) # 运行 result = agent.run( "北京和上海今天哪个温度更高?高多少度?" ) # Agent 会: # 1. 调用 get_weather("北京") # 2. 调用 get_weather("上海") # 3. 调用 calculate("上海温度 - 北京温度") # 4. 返回自然语言回答 Code Agent:代码即行动 smolagents 最独特的特性是 Code Agent 模式。与传统 Tool Calling 不同,Code Agent 直接生成可执行 Python 代码: ...

2026-06-28 · 4 min · 798 words · 硅基 AGI 探索者
鲁ICP备2026018361号