首页 / 资讯中心 / 文章详情

caveman范式:极简单文件AI Agent开发实践

caveman范式:极简单文件AI Agent开发实践 ★ FEATURED ARTICLE
1. 项目概述这不是一个“原始人”玩笑而是一套轻量级AI Agent开发范式“caveman”这个标题乍看像在调侃——回到石器时代但如果你最近刷过技术社区、GitHub Trending 或 Discord 开发频道就会发现这个词正悄然成为一批务实开发者口中的暗号。它不指代某个具体开源项目而是一类极简、可嵌入、零依赖、单文件可运行的AI Agent实现风格的代称。核心关键词里反复出现的token、agent、coding、ai已经揭示了它的本质一个用最朴素方式解决AI工程化落地痛点的实践路径。我从去年底开始在多个内部工具链中落地这类设计不是为了炫技而是因为传统Agent框架LangChain、LlamaIndex、AutoGen在快速验证、边缘部署、教学演示和小团队协作场景下常常陷入“配置三小时跑通五分钟”的窘境。“caveman”恰恰反其道而行之它把Agent的骨架拆到只剩三根骨头——输入解析、模型调用、输出封装其余一切交给开发者按需焊接。它不提供抽象层不预设工作流不捆绑LLM供应商甚至不强制要求你用Python——我见过用Rust写50行实现同等功能的案例也见过前端工程师用TypeScriptWeb Worker在浏览器里跑通整个流程。它解决的不是“能不能做”而是“能不能3分钟内让一个实习生看到Agent在动”。适合谁刚接触Agent概念的新人、需要快速交付POC的产品经理、对资源极度敏感的IoT设备开发者、以及厌倦了YAML配置地狱的资深后端。它不是替代方案而是“第一块砖”——当你想搭一座楼总得先确认地基能承重。2. 核心设计哲学与架构拆解为什么“原始”反而更可靠2.1 “caveman”不是退化而是对AI工程复杂度的主动降维当前主流Agent框架的演进路径本质上是不断叠加抽象层从基础API调用 → 工具集成 → 记忆管理 → 多步规划 → 分布式协同。这很像城市基建——地铁、高架、地下管廊层层叠叠效率极高但一旦某处水管爆裂排查要翻三天图纸。而“caveman”选择的是“挖井取水”模式不修管道只打一口深井直连水源。它的核心设计原则有三条每一条都对应着现实中的痛感零配置启动没有pip install langchain-openai没有.env文件没有config.yaml。整个Agent逻辑压缩在一个.py或.ts文件里python caveman.py --prompt 列出今天待办就能跑。我实测过在一台刚重装系统的MacBook上从下载文件到首次成功调用OpenAI API耗时2分17秒——其中1分50秒花在等Wi-Fi连接上。这种“开箱即用”的确定性在CI/CD流水线、客户现场演示、学生实验课上价值远超代码优雅度。Token生命周期裸露可控所有热词里高频出现的token exchange failed: 403 forbidden、token endpoint returned status 403、your access token could not be refreshed根源在于框架把认证细节藏得太深。当你用LangChain的ChatOpenAI时token刷新逻辑被封装在BaseLLM基类里出错时日志只显示“AuthenticationError”你得一层层扒源码才能定位是环境变量没读对、还是JWT过期时间计算错误、或是代理服务器篡改了Authorization头。“caveman”把token处理完全暴露它只认一个环境变量OPENAI_API_KEY调用前校验长度51位、格式sk-开头失败时直接抛出ValueError(Invalid token format)而不是模糊的HTTPStatusError。这看似“原始”却让90%的登录失败问题在30秒内定位——我带过的6个实习生第一次遇到403错误平均解决时间从47分钟降到8分钟。Agent行为边界物理隔离所谓“多AI协作”、“无限制聊天”在工程层面本质是状态管理问题。传统框架用ConversationBufferMemory或RedisBackedMemory维护上下文但内存泄漏、序列化失败、跨进程同步失败是家常便饭。“caveman”采用“一次会话一进程”模型每次CLI调用都fork新进程执行完立即销毁。没有全局状态没有内存残留没有并发锁。这牺牲了长对话能力却换来绝对的稳定性——我在树莓派4B上连续运行72小时未发生一次OOM或僵尸进程。当你的目标是“让AI帮用户生成一份周报”而不是“陪用户聊三天三夜”这种设计反而更贴近真实需求。2.2 架构图一张纸就能画完的Agent骨架┌─────────────────────────────────────────────────────────────┐ │ caveman.py (Single File) │ ├─────────────────────────────────────────────────────────────┤ │ 1. INPUT PARSING │ │ • sys.argv or stdin 解析 prompt │ │ • 简单参数校验--model, --temperature │ │ • Token预检len(key)51 and key.startswith(sk-) │ │ │ │ 2. MODEL CALL (Direct HTTP) │ │ • 构造 raw HTTP request (no requests.Session overhead) │ │ • Headers: {Authorization: fBearer {key}} │ │ • Body: {model:gpt-4o,messages:[{role:user,...}]}│ │ • 超时硬限制timeout30s避免卡死 │ │ │ │ 3. OUTPUT HANDLING │ │ • 原始JSON响应解析 │ │ • 提取choices[0].message.content │ │ • 错误分类401→token无效429→限频500→服务端故障 │ │ • 输出纯文本到stdout不带任何markdown或emoji │ └─────────────────────────────────────────────────────────────┘这个架构拒绝所有“智能”没有自动重试重试策略由Shell脚本控制没有流式响应chunking交给curl处理没有工具调用需要工具自己写subprocess.run()。它的力量恰恰来自这种“笨拙”——当你清楚知道每一行代码在做什么调试就不再是玄学。比如token exchange failed: error sending request for url这个错误框架用户会怀疑是OAuth流程问题而“caveman”用户直接用curl -v https://api.openai.com/v1/chat/completions -H Authorization: Bearer $KEY就能复现并确认是网络策略拦截而非代码缺陷。2.3 与主流Agent框架的本质差异不是功能少而是责任明维度LangChain / AutoGen“caveman”范式实际影响依赖数量12 pip包langchain-core, openai, pydantic, tenacity...0第三方依赖仅标准库Docker镜像体积从1.2GB降至45MB离线环境部署无需pip源配置启动延迟首次import耗时1.8sPyTorch加载模型权重python caveman.py启动0.1sCI测试中每个Agent测试用例节省12秒冷启动时间千级用例节约3小时Token错误定位日志显示AuthenticationError: Invalid authentication credentials直接报错ValueError: Invalid token format (length48, expected51)运维同学不再需要查OpenAI文档确认token格式错误信息自带修复指引扩展方式继承BaseTool类注册到ToolRegistry在main()函数里加一行if args.tool web_search: result do_search()新增功能无需理解框架生命周期实习生10分钟就能为Agent添加天气查询能力可观测性需配置LangSmith或自建追踪中间件stdout/stderr原生输出天然适配journalctl或docker logs故障排查时grep 403 /var/log/syslog即可定位所有token失效事件这种差异不是优劣之分而是适用场景的精准切割。“caveman”不试图取代LangChain就像扳手不试图取代数控机床——当你要拧紧一颗螺丝拿机床加工是荒谬的。我目前的实践是用“caveman”做MVP验证和CLI工具用LangChain做生产级多Agent编排系统。两者共存而非互斥。3. 核心实现细节与实操要点手把手写出你的第一个“原始人”3.1 最简可行版32行Python理解Agent本质的起点不要被“AI Agent”吓住。下面这段代码就是“caveman”的灵魂。它不依赖任何第三方库只用Python标准库却完成了Agent最核心的闭环接收指令→调用大模型→返回结果。#!/usr/bin/env python3 # caveman.py - The simplest AI Agent youll ever see import os import sys import json import urllib.request import urllib.parse def main(): if len(sys.argv) 2: print(Usage: python caveman.py your prompt) sys.exit(1) prompt .join(sys.argv[1:]) api_key os.getenv(OPENAI_API_KEY) # Token预检这是稳定性的第一道闸门 if not api_key: raise ValueError(OPENAI_API_KEY not set in environment) if len(api_key) ! 51 or not api_key.startswith(sk-): raise ValueError(fInvalid token format (length{len(api_key)}, expected51)) # 构造HTTP请求不用requests避免依赖 url https://api.openai.com/v1/chat/completions headers { Content-Type: application/json, Authorization: fBearer {api_key} } data { model: gpt-4o, messages: [{role: user, content: prompt}], temperature: 0.7 } # 发起请求超时硬限制防止挂起 req urllib.request.Request( url, datajson.dumps(data).encode(), headersheaders ) try: with urllib.request.urlopen(req, timeout30) as response: result json.loads(response.read().decode()) print(result[choices][0][message][content].strip()) except urllib.error.HTTPError as e: # 关键将HTTP错误映射为开发者友好的提示 if e.code 401: print(ERROR: Invalid API key. Check OPENAI_API_KEY.) elif e.code 429: print(ERROR: Rate limit exceeded. Wait 60s and retry.) elif e.code 403: print(ERROR: Forbidden. Your account may be restricted or region-blocked.) else: print(fHTTP Error {e.code}: {e.reason}) sys.exit(e.code) except Exception as e: print(fRequest failed: {e}) sys.exit(1) if __name__ __main__: main()提示把这段代码保存为caveman.py设置export OPENAI_API_KEYyour-real-key-here然后运行python caveman.py 写一首关于春天的五言绝句。你会看到纯文本输出没有多余字符没有进度条没有思考过程——只有结果。这就是Agent最本真的形态。这段代码的价值不在功能而在意图的透明化。每一行都在回答“为什么这么做”len(api_key) ! 51OpenAI官方文档明确token长度为51这是比HTTP 401更早的防线timeout30避免因网络抖动导致进程永久挂起这是生产环境的生命线print(result[choices][0][message][content].strip())不包装、不美化输出即契约——下游程序可直接管道传递python caveman.py summarize | grep -i summarysys.exit(e.code)错误码直接透传Shell脚本能据此做差异化重试if [ $? -eq 429 ]; then sleep 60; fi。3.2 实战增强版加入Token续签与多模型支持纯“石器时代”够用但现代开发需要一点青铜工具。下面是在基础版上增加的两个关键增强它们依然保持单文件、零依赖却解决了真实场景中的高频痛点。Token续签机制JWT续期逻辑热词中反复出现的jwt实现token续签、your access token could not be refreshed暴露了一个事实静态token在长期运行服务中必然失效。但“caveman”不引入OAuth2.0复杂流程而是用最朴素的方式——定期轮换token。原理很简单从环境变量读取OPENAI_API_KEY但实际调用时用一个本地缓存的token副本。当检测到401错误就触发“续签”重新读取环境变量假设运维已更新并刷新缓存。# 在main()函数顶部添加 import time _token_cache {key: None, last_check: 0} def get_api_key(): Simple token refresh: check env every 5 minutes now time.time() if now - _token_cache[last_check] 300: # 5 minutes key os.getenv(OPENAI_API_KEY) if not key or len(key) ! 51 or not key.startswith(sk-): raise ValueError(Invalid or missing OPENAI_API_KEY) _token_cache[key] key _token_cache[last_check] now return _token_cache[key] # 在请求构造部分替换为 api_key get_api_key() # 替代原来的 os.getenv(OPENAI_API_KEY)注意这个机制不解决“token被撤销”的问题如用户主动登出但它消灭了90%因环境变量未及时更新导致的401错误。我在一个7x24运行的客服摘要服务中使用此逻辑token相关故障率从每周3次降至每月1次。多模型路由适配不同成本与场景gpt-4o贵gpt-3.5-turbo快claude-3-haiku擅长逻辑。一个成熟的Agent需要根据prompt类型智能选模。“caveman”用最简规则引擎实现def select_model(prompt): Crude but effective model routing if code in prompt.lower() or debug in prompt.lower(): return gpt-4o # 高精度适合编程 elif len(prompt) 50: # 短指令用便宜模型 return gpt-3.5-turbo-0125 else: return gpt-4o-mini # 平衡型 # 在data字典中替换 data { model: select_model(prompt), # 替代硬编码的gpt-4o messages: [{role: user, content: prompt}], temperature: 0.7 }这个路由规则没有用LLM做分类而是基于字符串特征——简单、快速、可解释。当prompt包含“code”时它必然走gpt-4o不会因为某次API返回异常而误判。我在财务报告生成场景中用此规则将API成本降低了42%同时保持结果质量不变。3.3 安全加固应对token endpoint returned status 403 forbidden: country类问题热词中country后缀的403错误指向一个残酷现实OpenAI等服务商对某些地区IP实施地理封锁。框架用户往往在此卡壳因为错误发生在auth.openai.com的token交换环节而“caveman”直接调用api.openai.com绕过了OAuth2.0的token交换步骤——这是它天然抗地理封锁的关键。但仍有风险点如果用户误配了OPENAI_BASE_URL指向https://auth.openai.com错误仍会发生。因此安全加固的核心是URL白名单校验# 在url定义后添加 allowed_domains [api.openai.com, openrouter.ai, groq.com] parsed_url urllib.parse.urlparse(url) if parsed_url.netloc not in allowed_domains: raise ValueError(fDisallowed domain: {parsed_url.netloc}. Only {allowed_domains} permitted.) # 同时禁用重定向防止恶意跳转 opener urllib.request.build_opener(urllib.request.HTTPRedirectHandler) opener.addheaders [(User-Agent, caveman/1.0)] urllib.request.install_opener(opener)实操心得我在为客户部署时曾遇到第三方SaaS平台将api.openai.comDNS劫持到自家代理服务器导致token泄露。加入域名白名单后程序在启动时即报错Disallowed domain: proxy.example.com而非静默发送密钥。这种“fail-fast”原则是安全的第一道防线。4. 完整实操流程从零到可交付Agent的7个步骤4.1 步骤1环境准备与最小验证5分钟不要跳过这一步。很多故障源于环境本身。创建干净目录mkdir ~/caveman-demo cd ~/caveman-demo创建虚拟环境隔离依赖python3 -m venv venv source venv/bin/activate验证Python版本python --version确保≥3.8获取API Key从OpenAI官网复制Key注意不要包含空格或换行符设置环境变量export OPENAI_API_KEYsk-...临时生效测试Key有效性python -c import os; print(len(os.getenv(OPENAI_API_KEY, )))应输出51运行最小验证python -c import urllib.request; req urllib.request.Request(https://api.openai.com/v1/models, headers{Authorization: Bearer sk-...}); print(urllib.request.urlopen(req, timeout10).getcode())应输出200注意第7步是关键。它绕过所有框架直接测试网络连通性和Key有效性。我见过太多案例错误其实出在公司防火墙拦截了api.openai.com而非代码问题。这一步能帮你省下3小时无谓调试。4.2 步骤2编写基础Agent10分钟将前述32行代码保存为caveman.py。重点检查文件权限chmod x caveman.py换行符确保是Unix格式file caveman.py应显示with CRLF line terminators否则用dos2unix caveman.py转换编码文件必须是UTF-8中文prompt才不会乱码测试命令# 基础功能 python caveman.py 你好你是谁 # 中文测试 python caveman.py 用Python写一个计算斐波那契数列的函数 # 错误测试故意输错Key OPENAI_API_KEYwrong python caveman.py test预期输出正常情况纯文本回复无额外空行错误情况清晰错误信息如ERROR: Invalid API key. Check OPENAI_API_KEY.4.3 步骤3集成到Shell工作流15分钟Agent的价值在于融入日常。caveman.py设计为CLI工具天然适配Shell。创建别名在~/.bashrc中添加alias aipython ~/caveman-demo/caveman.py然后source ~/.bashrc管道组合git diff HEAD~1 | ai 总结这次代码变更的业务影响文件处理ai 根据以下需求文档生成API接口定义 requirements.txt错误重试for i in {1..3}; do ai 解释量子纠缠; [ $? -eq 429 ] sleep 60 || break; done实操心得我给团队配的ai别名配合fzf实现历史命令搜索ai $(history | fzf | awk {print substr($0, index($0,$3))})。这比任何GUI聊天界面都快——毕竟程序员最熟悉的界面就是Terminal。4.4 步骤4Docker化部署20分钟生产环境需要隔离。Docker是最佳选择且“caveman”极简特性让它Docker化异常简单。创建DockerfileFROM python:3.11-slim WORKDIR /app COPY caveman.py . # 不安装任何pip包 CMD [python, caveman.py]构建与运行docker build -t caveman . docker run -it --rm -e OPENAI_API_KEYsk-... caveman hello world进阶挂载配置文件# 创建config.env echo OPENAI_API_KEYsk-... config.env docker run -it --rm --env-file config.env caveman list todos注意Docker镜像大小仅45MB对比LangChain镜像1.2GB部署到AWS Lambda或Cloudflare Workers时冷启动时间从3秒降至0.3秒。这对需要毫秒级响应的API网关场景至关重要。4.5 步骤5添加企业级功能30分钟“caveman”不排斥功能只是拒绝过度设计。以下是三个高频企业需求的实现审计日志合规必需在main()函数末尾添加# Audit log to stdout (compatible with log aggregators) import datetime log_entry { timestamp: datetime.datetime.now().isoformat(), prompt: prompt[:100] ... if len(prompt) 100 else prompt, model: data[model], response_length: len(result[choices][0][message][content]) if result in locals() else 0, error: str(e) if e in locals() else None } print(f[AUDIT] {json.dumps(log_entry)}, filesys.stderr) # stderr不影响stdout输出输入长度限制防DoS在prompt解析后添加MAX_PROMPT_LENGTH 4096 if len(prompt) MAX_PROMPT_LENGTH: raise ValueError(fPrompt too long ({len(prompt)} chars). Max: {MAX_PROMPT_LENGTH})结果缓存降本用文件系统做最简缓存import hashlib cache_dir /tmp/caveman-cache os.makedirs(cache_dir, exist_okTrue) cache_key hashlib.md5(prompt.encode()).hexdigest() cache_file os.path.join(cache_dir, cache_key) if os.path.exists(cache_file): with open(cache_file) as f: print(f.read()) return # ... 执行API调用 ... with open(cache_file, w) as f: f.write(result[choices][0][message][content].strip())4.6 步骤6监控与告警15分钟用systemd实现进程守护和日志监控创建/etc/systemd/system/caveman.service[Unit] DescriptionCaveman AI Agent Service Afternetwork.target [Service] Typesimple Userai-user WorkingDirectory/opt/caveman EnvironmentFile/etc/caveman.env ExecStart/usr/bin/python3 /opt/caveman/caveman.py --daemon Restartalways RestartSec10 StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-user.target启用服务sudo systemctl daemon-reload sudo systemctl enable caveman.service sudo systemctl start caveman.service监控命令# 查看实时日志 sudo journalctl -u caveman.service -f # 统计403错误地理封锁 sudo journalctl -u caveman.service | grep ERROR: Forbidden | wc -l # 检查响应延迟P95 sudo journalctl -u caveman.service | grep AUDIT | awk {print $4} | sort -n | tail -n 100 | head -n 14.7 步骤7CI/CD流水线集成25分钟在GitHub Actions中用最简YAML实现自动化测试.github/workflows/caveman.ymlname: Caveman CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv4 with: python-version: 3.11 - name: Validate token format run: | echo sk-123456789012345678901234567890123456789012345678901 test.key python -c key\$(cat test.key); assert len(key)51 and key.startswith(sk-), Invalid format - name: Test basic functionality run: | export OPENAI_API_KEYsk-fake-key-for-test # 使用fake key测试错误路径 output\$(python caveman.py test 21 || true) echo \$output | grep -q Invalid API key || exit 1关键点这个CI不测试真实API调用避免消耗额度只验证代码逻辑和错误处理。真实集成测试放在独立的staging环境用专用测试Key。5. 常见问题与排查技巧实录那些踩过的坑现在告诉你5.1 Token相关故障速查表现象根本原因排查命令解决方案token exchange failed: token endpoint returned status 403 forbidden: country请求IP被OpenAI地理封锁curl -v https://api.openai.com/v1/models -H Authorization: Bearer $KEY切换网络手机热点、使用合规代理、更换API提供商如OpenRoutersign-in could not be completed token exchange failed: error sending requestDNS解析失败或网络超时nslookup api.openai.comping api.openai.com检查DNS配置/etc/resolv.conf添加8.8.8.8作为备用DNSyour access token could not be refreshed because you have since logged out环境变量未持久化echo $OPENAI_API_KEY在systemd服务中在/etc/caveman.env中设置并在service文件中引用EnvironmentFilelogin server error: token exchange failed: token endpoint returnedKey被意外修改粘贴时带空格echo $KEYod -c查看ASCII码实操心得我处理过最诡异的一次403原因是客户服务器启用了iptables的--tcp-flags规则过滤了带有Connection: keep-alive头的请求。解决方案不是改代码而是iptables -I OUTPUT -p tcp --dport 443 -j ACCEPT。记住90%的“AI错误”其实是网络基础设施问题。5.2 模型调用失败典型场景场景1{error:{message:You exceeded your current quota, please check your plan and billing details.}}这不是代码问题是账户余额不足。但“caveman”的优势在于错误信息直接包含quota关键词而非模糊的RateLimitError。解决方案登录OpenAI Dashboard查看Usage在代码中添加余额预警if quota in str(e): send_alert_to_slack(AI quota exhausted!)场景2{error:{message:The model does not exist.}}常见于拼写错误gpt-4o写成gpt-40数字0 vs 字母o。排查curl https://api.openai.com/v1/models -H Authorization: Bearer $KEY获取可用模型列表在select_model()函数中添加白名单校验assert model in [gpt-4o, gpt-3.5-turbo]场景3响应截断finish_reason: length模型因max_tokens限制提前结束。解决方案在data字典中显式设置max_tokens: 2048在输出处理中检查result[choices][0][finish_reason]若为length则提示用户“内容过长已截断”5.3 性能与稳定性避坑指南陷阱在循环中重复import错误写法在for循环里写import json。Python的import是昂贵操作会导致CPU飙升。正确做法所有import放在文件顶部。陷阱未关闭HTTP连接urllib.request.urlopen()返回的对象必须显式关闭否则连接池耗尽。正确写法with urllib.request.urlopen(req, timeout30) as response: result json.loads(response.read().decode()) # 自动关闭陷阱忽略SSL证书验证在内网环境有人会加contextssl._create_unverified_context()。这是严重安全漏洞。正确做法将内网CA证书加入系统信任库而非禁用验证。陷阱日志输出阻塞当stdout被重定向到文件时Python默认缓冲导致日志延迟。解决方案import sys sys.stdout.reconfigure(line_bufferingTrue) # Python 3.7 # 或旧版本print(..., flushTrue)5.4 企业部署特有问题问题Docker容器内时区错误审计日志时间不准现象[AUDIT] {timestamp: 2024-01-01T00:00:00}显示UTC时间而非本地时间。解决在Dockerfile中添加ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime echo $TZ /etc/timezone问题systemd服务启动后立即退出现象systemctl status caveman显示active (exited)。原因caveman.py是短时进程执行完即退出而systemd默认Typesimple要求进程常驻。解决修改service文件[Service] Typeoneshot # 改为oneshot RemainAfterExityes # 保持active状态问题多实例并发导致API限频现象10个并发请求全部返回429。解决在代码中加入指数退避import time, random for i in range(3): try: # 执行请求 break except urllib.error.HTTPError as e: if e.code 429 and i 2: sleep_time (2 ** i) random.uniform(0, 1) time.sleep(sleep_time) else: raise6. 进阶应用与生态扩展从“原始人”到“部落酋长”6.1 构建多Agent协作网络“caveman”单体虽小但通过Unix哲学do one thing well可编织强大网络。例如用三个独立Agent实现“需求分析→原型生成→代码审查”流水线# step1: 需求转PRD PRD$(ai 将以下需求转化为PRD文档${USER_INPUT}) # step2: PRD转UI原型调用专门的视觉模型 PROTOTYPE$(ai --model claude-3-haiku 生成Figma代码${PRD}) # step3: 原型转代码调用代码专用模型 CODE$(ai --model gpt-4o 根据Figma代码生成React组件${PROTOTYPE}) echo $CODE src/App.js每个Agent都是独立caveman.py实例用不同环境变量隔离CLAUDE_API_KEY,GROQ_API_KEY。这种“微Agent”架构比单体LangChain应用更易水平扩展、故障隔离和灰度发布。6.2 嵌入式场景在树莓派上运行AI Agent热词中嵌入式vibe coding指向边缘AI。caveman的零依赖特性使其成为理想选择编译为ARM二进制pip install pyinstaller pyinstaller --onefile --target-arch arm64 caveman.py内存优化禁用Python GCimport gc; gc.disable()离线模型集成Ollama将api.openai.com替换为http://localhost:11434/api/chat实测数据树莓派4B4GB RAM上cavemanollama run llama3端到端延迟800ms功耗3.5W。这证明“原始人”能在资源受限环境中完成过去需要云服务器的任务。6.3 教学场景AI Coding入门的最佳脚手架对新手而言LangChain
阅读完成 · 觉得有帮助?
咨询建站