尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Quicker+豆包+DeepSeek-Harness:构建截图多模态识别推理自动化链路

Quicker+豆包+DeepSeek-Harness:构建截图多模态识别推理自动化链路 很多人在工作中都遇到过这类需求看到一张截图、一份表格、一段网页内容想快速让 AI 理解并给出结论但又不想把图片拖进对话框、复制粘贴一大段文字。更麻烦的是如果这个操作要每天重复几十次手动处理就成了负担。这时候往往会想能不能把网页版的 AI 助手变成接口再配合一个快捷键截图后直接调用甚至把结果继续交给多模态模型做二次推理这篇文章就围绕一条完整的自动化链路展开Quicker 作为触发入口豆包网页版作为多模态理解能力来源通过 API 封装层把网页能力接口化再接入 DeepSeek-Harness 完成复杂的多模态推理任务。适合正在做 AI 工具集成、想用 Quicker 提高办公效率或者对多模态模型调用感兴趣的开发者阅读。学完后你可以搭建一条“截图 → 智能识别 → 多模态推理 → 返回结构化结果”的完整 pipeline。1. 为什么要搭建这条多模态链路1.1 一个典型场景截图即问答先设想一个日常场景你正在整理一份 PDF 中的表格表格是扫描件无法直接复制文字。传统做法是打开 OCR 工具识别文字再把文字复制到 AI 对话框里提问最后把结果粘贴回笔记。这个过程至少需要三到五步每步都在不同软件之间来回切换。如果换成自动化链路呢按下 Quicker 设定的快捷键框选图片区域图片自动上传到 AI 接口AI 返回识别结果再交给多模态推理模块做进一步理解最后结果直接写入剪贴板或弹窗显示。整个流程从“多步手动操作”变成了“一次快捷键触发”。这就是这条链路的核心价值把网页版 AI 能力从聊天窗口里解放出来变成可编程、可组合、可重复使用的接口。1.2 四个关键角色Quicker、豆包、API 封装、DeepSeek-Harness在这条链路中四个组件各有分工组件作用类比Quicker自动化触发层负责截图、选中文件、绑定快捷键遥控器豆包网页版提供多模态理解能力能识别图片、文档中的内容眼睛和初级大脑API 封装层把网页版交互封装成 HTTP 接口方便程序调用翻译官DeepSeek-Harness多模态推理层负责复杂任务的拆解、推理、输出高级分析员这四个角色不是孤立存在的。Quicker 负责“触发”豆包负责“看懂图片”API 封装层负责“把看懂的结果送出来”DeepSeek-Harness 负责“做深度推理”。组合在一起就形成了一条完整的多模态处理流水线。1.3 整体架构与数据流整条链路的数据流可以这样描述Quicker 动作触发后先进行区域截图或文件选择。图片文件通过 HTTP 请求发送到本地 API 服务。API 服务拿到图片后调用豆包网页版的多模态能力获取原始识别结果。原始结果被转发给 DeepSeek-Harness 接口进行结构化处理或推理。推理结果返回给 Quicker展示给用户或写入剪贴板、文件。用 ASCII 简图表示如下Quicker 触发截图 ↓ 本地 API 服务封装豆包网页能力 ↓ 多模态理解豆包 ↓ DeepSeek-Harness 推理 ↓ 结果返回 Quicker 展示这个架构并不复杂但把每个环节打通需要理解 Quicker 的动作编写方式、HTTP 接口设计、网页版请求的会话处理以及多模态模型的调用参数。接下来分别讲解。2. 环境准备与版本说明2.1 基础软件清单搭建这条链路需要准备以下环境操作系统Windows 10 或 Windows 11。Quicker 主要运行在 Windows 平台上macOS 和 Linux 用户可参考思路但不能直接运行 Quicker。Quicker安装并登录建议使用 1.40 以上版本支持更完善的动作编辑和 HTTP 请求组件。Python建议 3.9 或 3.10 版本用于编写 API 封装服务和多模态推理代码。浏览器Chrome 或 Edge用于登录豆包网页版并分析网页请求。Docker如果 DeepSeek-Harness 需要以容器方式启动需要安装 Docker Desktop。代码编辑器VS Code 或 PyCharm用于编写和调试 Python 代码。版本需要根据你的实际环境调整。这里以常见环境为例重点演示配置思路。2.2 安装 DeepSeek-HarnessDeepSeek-Harness 是一套围绕 DeepSeek 系列模型的推理与工具链组件主要用于将模型包装成可执行的 Agent 流程。安装方式通常有两种方式一从源码安装git clone https://github.com/deepseek-ai/DeepSeek-Harness.git cd DeepSeek-Harness pip install -e .如果在国内网络环境下安装依赖较慢可以使用国内镜像源pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple方式二通过 pip 安装pip install deepseek-harness -i https://pypi.tuna.tsinghua.edu.cn/simple需要注意的是DeepSeek-Harness 项目仍处于快速迭代阶段不同版本的接口、配置项可能不同。安装完成后建议先查看官方 README 确认当前版本支持的模型列表和调用方式。2.3 项目目录结构为了方便管理和复用建议将链路代码组织成下面的目录结构multimodal-pipeline/ ├── app.py # FastAPI 封装服务 ├── quick_actions.py # Quicker 调用的 Python 脚本 ├── harness_client.py # DeepSeek-Harness 调用代码 ├── uploads/ # 临时存放上传图片 ├── requirements.txt # Python 依赖清单 └── config.py # 配置文件接口地址、超时时间等requirements.txt 中需要包含以下核心依赖fastapi uvicorn requests python-multipart pillow安装依赖pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple3. 核心原理拆解Quicker 作为自动化触发层3.1 Quicker 动作的组成Quicker 是一款 Windows 效率工具核心单位是“动作”。一个动作可以包含多个步骤例如截图或选择文件。调用命令行或 Python 脚本。发送 HTTP 请求。展示结果或写入剪贴板。在 Quicker 的动作编辑器中你需要把每一步配置为节点。类似流程图节点从上到下依次执行。对于“截图并调用接口”这个动作核心步骤是使用“截图”步骤获取屏幕区域图像。使用“保存截图到临时文件”步骤把图片保存为 PNG 文件。使用“获取临时文件路径”步骤拿到图片路径。使用“运行 Python 脚本”步骤调起本地脚本脚本负责上传图片。3.2 在 Quicker 中调用 HTTP APIQuicker 本身支持发送 HTTP 请求你可以在动作中添加“Http”节点。例如要向本地 API 上传图片可以按如下方式配置请求方式POST请求 URLhttp://127.0.0.1:8000/api/multimodal请求体multipart/form-data文件字段名file文件内容{截图文件路径}如果你更习惯用 Python 脚本处理复杂逻辑可以在 Quicker 中直接调用 Pythonimport requests file_path rC:\path\to\screenshot.png resp requests.post( http://127.0.0.1:8000/api/multimodal, files{file: open(file_path, rb)}, timeout60, ) print(resp.json())然后 Quicker 通过“运行 Python 脚本”节点执行该脚本并读取输出结果。3.3 为什么需要 API 封装层而不是直接操作浏览器有读者可能疑惑Quicker 本身能发起 HTTP 请求为什么还要单独写一个 API 封装服务主要有三个原因会话统一管理。调用豆包网页版需要携带 Cookie 等会话凭证。如果每一个 Quicker 动作都直接拼 Cookie维护成本高也容易泄露。集中放在 API 服务中可以在一个位置统一管理。扩展多步处理。API 服务可以串联“豆包识别 → DeepSeek-Harness 推理”等多个步骤Quicker 只需要调用一个接口即可拿到最终结果。复用性更强。除了 Quicker工作流工具、定时脚本、即时通讯机器人等都可以复用同一个 API 服务。所以API 封装层本质上是给“网页版 AI 能力”加了一层可编程入口。4. 把豆包网页版能力封装成可复用 API4.1 分析豆包网页版请求在开始封装前需要先了解豆包网页版是如何与服务器通信的。登录豆包网页版后按 F12 打开开发者工具切换到 Network 面板然后上传一张图片进行识别。观察请求列表你会看到类似下面的请求请求类型POST请求地址类似/api/v1/multimodal/chat请求体包含图片的 base64 编码、文本提示词、会话 ID 等请求头包含 Cookie、User-Agent、Content-Type 等这部分信息因人而异、也随时可能更新。本文不提供固定的抓包结果而是给出通用的封装思路复制请求 URL 和请求头关键字段。观察请求体结构找到图片数据所在的字段。在 Python 中用requests模拟同样的请求。将响应解析为文本结果。需要特别强调的是网页版请求分析仅用于个人学习与个人工作流自动化不应绕过账号鉴权、不应用于批量爬取或大并发请求。实际项目中如果要用在多用户或生产环境一定要优先使用官方提供的 API 服务而不是网页版抓包方案。4.2 Cookie 与会话处理网页版请求的核心凭证是 Cookie。Cookie 保存在浏览器中登录过期后需要重新获取。在封装层中建议将 Cookie 放在配置文件中# config.py COOKIE_STRING 你的Cookie字符串 DOUBAO_API_URL https://你的豆包接口地址 TIMEOUT 60需要注意的是Cookie 属于敏感信息不应提交到 Git 仓库。建议使用环境变量import os COOKIE_STRING os.getenv(DOUBAO_COOKIE, )当 Cookie 过期时接口会返回登录失效或权限不足的错误此时需要重新登录网页版并刷新 Cookie。4.3 编写 FastAPI 封装服务下面编写一个 FastAPI 服务它接收图片文件调用豆包网页版接口进行多模态理解返回结果文本。# app.py import base64 import os import time import requests from fastapi import FastAPI, File, UploadFile from fastapi.responses import JSONResponse app FastAPI(titleMultimodal Pipeline API) DOUBAO_API_URL os.getenv(DOUBAO_API_URL, ) DOUBAO_COOKIE os.getenv(DOUBAO_COOKIE, ) def call_doubao_multimodal(image_bytes: bytes, prompt: str 请详细描述这张图片的内容) - str: 调用豆包网页版多模态接口。 这里以模拟请求为例实际字段需要根据抓包结果调整。 if not DOUBAO_API_URL or not DOUBAO_COOKIE: return 请先配置 DOUBAO_API_URL 和 DOUBAO_COOKIE 环境变量 image_base64 base64.b64encode(image_bytes).decode(utf-8) headers { Cookie: DOUBAO_COOKIE, Content-Type: application/json, User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64), } payload { type: multimodal_chat, content: prompt, image: image_base64, session_id: fpipeline-{int(time.time())}, } try: resp requests.post(DOUBAO_API_URL, jsonpayload, headersheaders, timeout60) resp.raise_for_status() data resp.json() # 这里根据真实接口返回值解析文字结果 return data.get(reply) or data.get(text) or resp.text except Exception as e: return f调用豆包接口失败{e} app.post(/api/multimodal) async def multimodal(file: UploadFile File(...)): image_bytes await file.read() result call_doubao_multimodal(image_bytes) return JSONResponse(content{result: result}) app.get(/health) async def health(): return {status: ok}启动服务uvicorn app:app --host 127.0.0.1 --port 8000这里的代码是链路演示实际部署时需要根据豆包网页版的真实接口格式调整请求体字段。4.4 运行接口并用 curl 验证服务启动后可以用 curl 验证接口是否正常工作。准备一张测试图片例如test.png执行curl -X POST http://127.0.0.1:8000/api/multimodal \ -F filetest.png如果配置正确返回结果类似{result: 图片中是一张产品功能架构图包含四个层级……}如果返回的是错误信息则需要检查 Cookie 是否过期或者请求字段是否与网页版实际请求一致。5. 接入 DeepSeek-Harness 实现多模态推理5.1 DeepSeek-Harness 能做什么豆包网页版返回的通常是“描述性文本”适合直接问答但遇到复杂任务时——比如“识别这张图表并统计增长率最高的月份”——就需要进一步的推理能力。DeepSeek-Harness 在这条链路中承担推理角色。它可以基于多模态输入进行任务拆解、工具调用、结构化输出。它的特点是不只做“看图说话”而是把大模型和多模态输入组合成一个可执行的推理流程。5.2 编写多模态推理调用代码由于 DeepSeek-Harness 的接口版本更新较快这里给出通用调用思路。通常你需要先初始化客户端再传入图片和问题# harness_client.py import requests import json HARNESS_API_URL http://127.0.0.1:7891/v1/chat/completions HARNESS_MODEL deepseek-vl2 def run_harness_inference(image_url: str, text_prompt: str) - str: 调用 DeepSeek-Harness 的推理接口。 示例代码为通用 OpenAI 兼容格式具体以实际部署的服务为准。 payload { model: HARNESS_MODEL, messages: [ { role: user, content: [ {type: text, text: text_prompt}, {type: image_url, image_url: {url: image_url}}, ], } ], } try: resp requests.post( HARNESS_API_URL, datajson.dumps(payload), headers{Content-Type: application/json}, timeout120, ) resp.raise_for_status() data resp.json() return data[choices][0][message][content] except Exception as e: return fDeepSeek-Harness 推理失败{e}这段代码的亮点是使用了 OpenAI 兼容的消息格式许多基于 vLLM、FastAPI 包装的模型服务都能识别这种结构。如果你的部署方式不同请根据实际接口文档调整。5.3 将 Quicker、豆包 API、DeepSeek-Harness 串成完整链路现在把前几节的代码组合起来形成一个完整的链路。# quick_actions.py import os import sys import requests import json API_BASE_URL http://127.0.0.1:8000 HARNESS_API_URL http://127.0.0.1:7891/v1/chat/completions HARNESS_MODEL deepseek-vl2 def upload_and_reason(image_path: str, question: str 请识别图中内容并输出要点) - str: # 第一步调用本地 API让豆包理解图片 with open(image_path, rb) as f: resp requests.post( f{API_BASE_URL}/api/multimodal, files{file: f}, timeout60, ) resp_data resp.json() doubao_result resp_data.get(result, ) # 第二步将豆包输出作为提示词交给 DeepSeek-Harness 做推理 payload { model: HARNESS_MODEL, messages: [ { role: user, content: ( f以下是对一张图片的多模态识别结果\n{doubao_result}\n f请基于这个结果回答问题{question} ), } ], } harness_resp requests.post( HARNESS_API_URL, datajson.dumps(payload), headers{Content-Type: application/json}, timeout120, ) harness_data harness_resp.json() return harness_data[choices][0][message][content] if __name__ __main__: image_path sys.argv[1] question sys.argv[2] if len(sys.argv) 2 else 请整理图片中的关键信息 result upload_and_reason(image_path, question) print(result)在 Quicker 中配置“运行 Python 脚本”节点传入截图路径和问题参数即可一键执行整条链路。5.4 运行效果与输出说明当你用 Quicker 截取一张包含销售数据表格的图片时执行链路后的输出可能类似根据图片内容各季度销售额如下 Q1: 120 万 Q2: 156 万 Q3: 98 万 Q4: 210 万 其中 Q4 增长最快环比增长约 114%。整个过程只需要一次快捷键触发不需要手动打开任何 AI 页面。这就是自动化链路带来的直接效率提升。6. 高频报错与排查清单6.1 API 返回 529 overloadedapi error: 529 overloaded. this is a server-side issue, usually temporary这类报错说明服务端负载过高属于临时性错误通常不是本地代码问题。排查思路如下检查是否在请求高峰期调用。在代码中加入重试机制等待几秒后重试。降低单次请求图片的尺寸减小服务端压力。切换非高峰时段测试确认是否稳定复现。示例重试逻辑import time def call_with_retry(func, max_retries3, delay5): for i in range(max_retries): try: return func() except Exception as e: if 529 in str(e) and i max_retries - 1: time.sleep(delay) continue raise e6.2 Docker API 连接失败如果在启动 DeepSeek-Harness 相关容器时遇到类似failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen的报错说明 Docker 服务没有启动或不正常。解决步骤打开 Docker Desktop等待状态变为 Running。执行docker ps验证 Docker 是否可用。如果使用 WSL2 后端检查 WSL 虚拟化是否正常。重启 Docker Desktop 后再次尝试。6.3 无法连接 APIsocket 被关闭cannot connect to api: the socket connection was closed unexpectedly通常表示后端服务崩溃或连接被强制断开。可能原因和解决方式问题现象常见原因解决思路连接被重置服务端超时关闭连接增加请求超时时间服务端崩溃内存不足、模型加载失败查看服务日志释放内存请求体过大图片 base64 过长压缩图片后上传访问地址错误API 地址配置错误检查 base_url 和端口6.4 多模态识别结果不准确如果豆包返回的结果是“图片看不太清楚”或者识别结果明显错误常见原因是图片模糊、分辨率过低或图片中包含过多无关信息。建议截图时尽量只保留目标区域。将图片转换为 JPG 格式必要时放大分辨率。调整提示词明确识别目标例如“请只识别表格中的金额列”。对图片做预处理如自动对比度增强、去噪。7. 工程化最佳实践7.1 接口命名与版本管理本地 API 服务虽然只给自己用也建议遵循 RESTful API 命名规范使用名词复数表示资源例如/api/multimodal。携带版本号例如/api/v1/multimodal。返回统一格式{code: 0, message: success, data: {...}}。统一返回格式的好处是调用方只需解析固定字段不考虑不同接口的差异。7.2 会话凭证安全Cookie 是整条链路的关键凭证一旦泄露别人可以冒用你的身份调用网页服务。因此必须做到不把 Cookie 写死到代码里。使用环境变量或本地配置文件保存并加入.gitignore。定期更换 Cookie避免长期有效。只将服务绑定到127.0.0.1不要暴露到公网。在 FastAPI 中限制访问来源import uvicorn if __name__ __main__: uvicorn.run(app, host127.0.0.1, port8000)7.3 重试、限流与熔断调用外部网页接口时服务端随时可能限流或报错。建议在代码中加入三层保护重试遇到超时、529 等临时错误时重试。限流控制每秒调用次数不要高频请求。熔断连续失败达到阈值时暂停调用一段时间避免加重服务端负担。简单实现示例import time class SimpleCircuitBreaker: def __init__(self, max_failures5, cooldown30): self.max_failures max_failures self.cooldown cooldown self.failures 0 self.opened_at None def allow(self): if self.opened_at and time.time() - self.opened_at self.cooldown: self.failures 0 self.opened_at None return True if self.failures self.max_failures: return False return True def record_failure(self): self.failures 1 if self.failures self.max_failures: self.opened_at time.time()在正式项目中你可以使用tenacity这类成熟的 Python 重试库简化逻辑pip install tenacityfrom tenacity import retry, stop_after_attempt, wait_fixed, retry_if_exception_type retry(stopstop_after_attempt(3), waitwait_fixed(5)) def call_external_api(): resp requests.post(..., timeout30) resp.raise_for_status() return resp.json()7.4 性能优化建议整条链路的耗时主要来自两部分图片上传与识别、模型推理。可以从几个方向优化限制图片大小统一压缩到合适尺寸再上传。将豆包识别结果缓存到本地避免重复识别同一图片。使用异步请求多个图片同时处理时减少等待时间。DeepSeek-Harness 部署时使用 GPU并调整推理并发参数。缓存示例import hashlib import os CACHE_DIR ./cache def get_cache_key(image_bytes: bytes): return hashlib.md5(image_bytes).hexdigest() def read_cache(image_bytes: bytes): key get_cache_key(image_bytes) cache_file os.path.join(CACHE_DIR, f{key}.json) if os.path.exists(cache_file): with open(cache_file, r, encodingutf-8) as f: return json.load(f) return None def write_cache(image_bytes: bytes, result): os.makedirs(CACHE_DIR, exist_okTrue) key get_cache_key(image_bytes) cache_file os.path.join(CACHE_DIR, f{key}.json) with open(cache_file, w, encodingutf-8) as f: json.dump(result, f, ensure_asciiFalse)7.5 隐私与合规多模态识别涉及图片内容可能包含敏感信息。在工程化使用时务必注意不要处理与工作无关的隐私图片。识别结果不要共享给无关人员。如果图片属于公司内部资料要确认是否符合信息安全规范。使用第三方网页服务时只上传确有必要的图片处理完后及时删除临时文件。在代码中增加临时文件清理逻辑import os import tempfile import shutil tmp_dir tempfile.mkdtemp() try: # 处理流程 pass finally: shutil.rmtree(tmp_dir, ignore_errorsTrue)8. 总结与下一步学习建议这条链路的核心在于“打通”Quicker 解决触发问题API 封装层解决接口化问题豆包解决多模态理解问题DeepSeek-Harness 解决推理问题。四个工具单独使用都不困难难的是把流程串起来并考虑重试、安全、缓存这些工程细节。如果你跟着文章的思路从头搭建一遍应该能掌握几个关键技能在 Quicker 中编排自动化动作、用 FastAPI 封装外部网页能力、用 Python 编写多模态调用代码以及如何排查接口调用过程中的常见报错。接下来可以继续深入的方向包括把链路接入了即时通讯机器人实现“群聊发图自动识别”接入定时任务批量处理文件夹中的图片或者引入向量数据库把识别结果存档后可检索。无论往哪个方向扩展核心思想都是一致的把 AI 能力从对话框里拿出来嵌入到日常工作的每一个角落。
返回列表