这次我们来看一个很有意思的项目方向让大模型做罗夏墨迹测验。Rorschach 测验罗夏墨迹测验是心理学里非常经典的投射测验它让人对着 10 张对称墨迹图说出“你看到了什么”再根据回答内容分析人格特征。而 Human Shadows in Machine Minds: Study Interpreting AI Responses to Rorschach 这个研究项目做的就是反过来观测 AI 模型把同样的墨迹图丢给视觉语言模型VLM让模型自由描述它看到的内容然后像分析人类回答一样去分析模型的“心理倾向”。这个项目的价值不在于给 AI 做心理诊断而是提供了一套可复现的研究框架输入罗夏墨迹图收集大模型的图文理解输出对输出进行结构化解析再和人类受试者的典型反应做对比。它实际上是在用心理学的标准化工具去探测大模型内部的“认知偏差”——模型是否偏向于看到人类、动物、器官、物体或者是否存在过度解释、幻觉式细节补充。对这种研究型项目最该关注的是如何让模型稳定输出可解析的回答、如何批量跑多模型对比、如何把输出转成结构化数据、以及部署硬件门槛到底高不高。这篇文章会直接拆解三件事第一这个项目的研究链路和核心能力都有哪些第二用通用视觉语言模型部署方案完整走一遍“准备罗夏墨迹图集 → 调用模型做图文理解 → 批量收集回答 → 结构化解析 → 结果对比”的流程第三把接口 API、批量任务、显存占用观察方式和常见问题排查方法全部列清楚。想看推理成本、接口能力、批量稳定性的读者可以直接找到自己关心的部分。1. 核心能力速览先给一张规格速览表方便快速判断这个项目适不适合自己动手复现。完整的 Rorschach 墨迹图受版权限制但研究项目一般使用标准墨迹图的重新绘制版、公开教学版或生成式仿制图因此实际操作时素材准备是很关键的环节。能力项说明项目类型AI 解释与心理学交叉研究框架用于探测视觉语言模型的图文理解倾向核心手段向视觉语言模型提供墨迹图收集模型自由描述再做语义解析主要功能墨迹图输入、模型自由描述生成、回答语义解析、类别统计、多模型对比模型要求支持视觉输入的 VLM例如具备图像理解能力的大模型本地部署需要较高的显存/内存显存需求不确定需按实际模型版本测试从常见 VLM 部署经验看建议先准备 16G 以上显存是否支持 CPU可以跑但视觉编码 文本生成速度会明显下降启动方式建议使用 API 服务方式或本地视觉模型推理框架是否支持 API支持可以封装为本地 HTTP 服务逐张或批量提交图片是否支持批量任务支持可设计为对多张墨迹图连续调用模型输出统一 JSON 结果适合场景AI 行为研究、模型偏见探测、图文联想能力测试、多模型对比、心理学科普实验不适合场景不能作为心理诊断工具不能用于评估真实人类被试这个项目最值得关注的是它的“结构化观测能力”。和普通的多模态对话不同它要求模型回答被解码成可以统计的类别比如“人类相关描述”“动物相关描述”“模糊形状描述”“情绪性描述”“细节区域描述”等。这让结果不只是聊天记录而是能做分布统计的数据集。2. 适用场景与使用边界研究型项目的使用边界比常规工具更重要。先说适合谁如果你正在做多模态大模型的评测、可控文本生成研究、AI 安全中的偏见分析、或者心理学实验与 AI 行为的交叉研究这个方向非常有参考价值。它给了一个现成的实验范式用标准化图片刺激诱发模型的开放式自由联想再用文本解析方法提取特征。在实际操作上它可以解决几个具体问题评估不同 VLM 对模糊图像的描述风格差异探测模型是否存在“过度细节脑补”例如把墨迹中的随机形状描述成具体动物、人脸、武器等判断模型回答的稳定性同一张图多次调用结果是否漂移建立多模型对比基线生成可量化的描述类别分布。不过要注意边界。基于罗夏墨迹测验的 AI 研究项目本质上是解释性的实验框架不是诊断工具。不要用它来输出“模型有人格”或“模型有心理问题”这类结论。从方法学角度投射测验本身的有效性在心理学界也有争议因此文章中的任何解读都只能作为模型行为描述不能泛化为模型“人格画像”。另外如果计划公开发布实验结果需要注意墨迹图的版权问题正式 Rorschach 测试的 10 张标准图片在部分国家受版权保护建议使用公开教学图、重新绘制的图形或程序生成的对称墨迹图。最后是合规和安全提示。本文涉及的模型调用属于正常的视觉问答与批量文本生成实验不涉及任何隐私数据采集。但因为要运行大模型并处理图文输入建议在隔离环境中测试不要将内部敏感图片作为输入内容。所有分析材料只用于技术验证和科学研究演示。3. 环境准备与前置条件这个项目没有提供官方的统一安装包属于研究型工作流。下面的部署方案以“通用视觉语言模型调用”为基础可以兼容多种 VLM。你可以根据自己机器上的模型框架选择实际命令。3.1 硬件层面视觉语言模型需要对图片做视觉编码再交给语言模型生成描述。整个过程是显存和内存双重消耗。从常见模型部署经验判断仅有 CPU能跑但速度很慢适合单张测试不适合批量任务8G 显存可以尝试量化后的 7B14B 级视觉模型图片分辨率需要限制16G 显存比较稳可以跑较大规模的 VLM并支持中等批量任务24G 及以上适合多模型对比和高并发推理。具体显存占用受模型参数量、图片分辨率、量化精度、生成长度等因素影响务必以本机实测为准。3.2 软件层面准备以下基础组件Python 3.10支持视觉输入的模型推理框架例如 vLLM、Xinference、Ollama 或 HuggingFace Transformers图片处理库 PillowHTTP 请求库 requestsCUDA 环境如果使用 NVIDIA GPU足够大的磁盘空间用于存放模型权重文件。3.3 素材准备复现项目需要准备好墨迹图集。建议先创建统一目录mkdir -p rorschach_project/{images,outputs,logs}图片目录放墨迹图输出目录放 JSON 结果日志目录放推理日志。图片建议统一转换为 JPEG 或 PNG分辨率统一调整为模型要求的尺寸避免单张超大图造成显存抖动。4. 安装部署与启动方式前文已说明本项目没有现成的一键部署脚本核心是通过视觉语言模型实现实验流程。下面提供两种最常见的部署方式可任选其一。4.1 方式一通过 Ollama 部署本地视觉模型适合快速体验如果只是想快速体验用 Ollama 是最省事的方案。Ollama 支持 llava 等多个视觉模型一行命令启动服务# 安装 Ollama略拉取视觉模型 ollama pull llava:7b # 启动服务 ollama serve启动后本地会暴露一个 HTTP 接口默认端口 11434。接下来可以用 Python 脚本调用模型。4.2 方式二基于 Transformers 自建推理脚本适合研究和批量实验如果要做批量实验、对比多个模型的输出建议直接用 HuggingFace Transformers 写一个最小推理脚本。下面给出通用模板需要按实际模型名称修改路径from transformers import AutoModelForCausalLM, AutoProcessor from PIL import Image import torch model_id your-vision-language-model-id # 替换为实际模型名 processor AutoProcessor.from_pretrained(model_id, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_id, torch_dtypetorch.float16, device_mapauto, trust_remote_codeTrue ) image Image.open(images/test_rorschach.png).convert(RGB) prompt 请描述这张图片。你看到了什么请给出尽可能具体的描述不要做心理分析。 inputs processor(textprompt, imagesimage, return_tensorspt).to(model.device) output model.generate(**inputs, max_new_tokens512) text processor.decode(output[0], skip_special_tokensTrue) print(text)这只是通用模板。实际使用中model_id、processor的调用方式、prompt 格式都要根据所选模型调整。如果使用 vLLM 或 Xinference可以参考对应官方文档完成部署。4.3 启动 HTTP 服务为了方便批量调用和接口测试建议把推理逻辑封装成一个 HTTP 服务。可以使用 FastAPI 实现最简版本from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class ImageRequest(BaseModel): image_path: str prompt: str 请描述这张图片。你看到了什么 app.post(/analyze) def analyze(req: ImageRequest): result run_model(req.image_path, req.prompt) # 封装你自己的推理函数 return {image: req.image_path, output: result}启动方式uvicorn api_server:app --host 127.0.0.1 --port 8000这个服务只是示例run_model取决于你前面选择的推理后端。接口服务启动后就可以把测试图片逐张提交进去做批量分析了。5. 功能测试与效果验证下面用一套标准流程来验证整个实验链路。测试目的不是追求模型的“正确回答”而是确认系统能稳定产出可解析的文本。5.1 单张图片推理测试测试目的确认模型能读取图片并生成自然语言描述。输入素材图片rorschach_project/images/inkblot_sample.png 提示词请描述这张图片。你看到了什么操作步骤启动推理服务。调用模型接口传入图片和提示词。记录模型返回的文本。判断成功的标准返回文本与图片内容相关输出长度合理不是空字符串也不是重复无意义内容没有报错。常见失败原因图片格式不被支持图片分辨率过高导致显存溢出提示词格式不符合模型要求。5.2 结构化输出测试为了后续统计类别可以让模型输出固定结构的 JSON。这里需要在提示词中明确指定请描述这张图片并返回 JSON 格式包含以下字段 { description: 整体描述, object_mentions: [提到的物体, 提到的生物], emotion: 情绪倾向 }操作方式import requests import json url http://127.0.0.1:8000/analyze payload { image_path: images/inkblot_sample.png, prompt: 请描述这张图片并返回 JSON 格式包含 description、object_mentions、emotion 三个字段。 } resp requests.post(url, jsonpayload, timeout120) data resp.json() # 解析结果 output data[output] # 从模型输出中提取 JSON 字符段可用 json.loads 解析 print(json.dumps(output, ensure_asciiFalse, indent2))判断成功的标准在于模型是否严格输出了 JSON 字段。因为大模型输出不稳定通常需要写一个“从文本中提取 JSON”的后处理函数。如果模型多次输出无法解析可以在提示词中加一句“只输出 JSON不要解释”。5.3 多图批量测试批量测试的流程是循环读取图片目录逐张调用模型把结果保存到统一的 JSON 文件中。这里给出一个可靠性和效率兼顾的批量脚本模板import requests import json import time from pathlib import Path image_dir Path(rorschach_project/images) output_file Path(rorschach_project/outputs/results.json) url http://127.0.0.1:8000/analyze results [] for img_path in sorted(image_dir.glob(*.png)) sorted(image_dir.glob(*.jpg)): print(fprocessing {img_path.name}) payload { image_path: str(img_path), prompt: 请描述这张图片。你看到了什么返回 JSON 格式包含 description 和 object_mentions 字段。 } try: resp requests.post(url, jsonpayload, timeout180) resp.raise_for_status() data resp.json() results.append({ image: img_path.name, output: data.get(output, ), status: success }) except Exception as e: results.append({ image: img_path.name, output: , error: str(e), status: failed }) time.sleep(1) # 避免并发过高 output_file.write_text(json.dumps(results, ensure_asciiFalse, indent2), encodingutf-8) print(fdone, {len(results)} images processed)批量任务的关键是控制节奏。推荐逐张执行每张之间加 1 秒左右的间隔。如果模型服务支持流式或并发请求也可以适当提升并发但必须观察显存占用避免 OOM。6. 接口 API 与批量任务研究项目一旦要扩大样本量接口 API 就是刚需。比如要对 100 张墨迹图分别调用多个模型没有接口和批量脚本会非常痛苦。上面已经给出了一个 HTTP 服务的雏形这里补充接口调用与批量设计建议。6.1 API 请求示例如果模型服务已经封装好 POST /analyze可以用 curl 快速验证接口curl -X POST http://127.0.0.1:8000/analyze \ -H Content-Type: application/json \ -d { image_path: images/inkblot_sample.png, prompt: 请描述这张图片。你看到了什么 }预期返回{ image: images/inkblot_sample.png, output: 图中看到一个类似蝙蝠的对称形状中央较暗两侧有羽翼状延伸。 }如果模型返回的是完整对话文本可能需要额外清洗。建议在 API 层就做文本后处理只暴露output字段调用方不用关心模型内部格式。6.2 批量任务设计建议批量任务的工程化不能只是简单 for 循环。安全的方法是设计项建议输入管理图片统一命名如 img_001.png、img_002.png输出管理每张图片对应一个 JSON 文件避免大文件覆盖失败重试单个请求失败后重试 2 次仍失败则写入 failed.log日志记录记录每张图的开始时间、结束时间、耗时和状态断点续跑输出文件已存在且状态为 success则跳过6.3 多模型对比实验如果需要比较多个视觉模型的回答可以按模型名分目录保存结果rorschach_project/outputs/model_a/images/ rorschach_project/outputs/model_b/images/每次调用时在 payload 中带上model_name字段服务端根据模型名路由到不同的推理后端输出结果统一存放到对应目录。这样才能保证“同一批图片、不同模型”的结果可比。7. 资源占用与性能观察资源占用是复现实验时最需要关注的部分。虽然项目本身没有公布具体基准数字但可以用通用方法自行观察。7.1 如何观察显存占用NVIDIA GPU 可以使用nvidia-smi实时查看nvidia-smi -l 2每 2 秒刷新一次。批量任务时建议把输出重定向到文件方便事后分析峰值显存。7.2 哪些因素会影响性能影响性能的核心因素有四个图片分辨率分辨率越高视觉编码器显存消耗越大模型参数量7B 模型和 30B 模型的显存需求差距很大生成长度max_new_tokens 越大耗时越长批量并发同时提交多个请求会显著拉高显存占用。如果显存不足优先尝试低分辨率输入、减少批量并发数、降低生成长度。对墨迹图这类对称图形一般不需要超高分辨率模型能识别整体形状即可。7.3 CPU 与 GPU 推理的差异CPU 推理可以运行但视觉编码阶段和文本生成阶段都会比较慢。如果只是做少量验证CPU 够用如果要跑几十张图强烈建议用 NVIDIA GPU。混合部署时也可以考虑用 API 调用云端的视觉模型服务减少本地硬件压力。7.4 端口冲突和进程残留服务启动失败最常见的两类原因是端口被占用和残留进程。排查方式# 查看端口占用 lsof -i :8000 # 查看残留 Python 进程 ps aux | grep python如果端口被占用可以换端口启动或者先关掉旧进程再重新启动服务。8. 常见问题与排查方法以下是这个实验链路中常见问题的排查清单。虽然不是每个问题都会出现但遇到时可以直接对照解决。问题现象可能原因排查方式解决方案服务启动后接口无法访问端口被占用或服务未初始化完成查看启动日志和端口占用换端口启动或等待模型加载完成图片提交后报错图片格式不支持或分辨率过大检查图片格式和尺寸转换格式、压缩分辨率模型输出为空提示词格式不符合要求或生成长度太短调节 max_new_tokens 参数增加输出长度检查提示词模型输出不是 JSON提示词约束不足或模型能力限制检查原始输出文本增加结构化提示词写 JSON 后处理提取逻辑显存溢出 OOM分辨率过高、并发过高观察 nvidia-smi 峰值占用降低分辨率、降低并发、使用量化模型批量任务中途卡住单张请求超时或服务无响应查看服务日志和请求超时时间设置 timeout增加失败重试和断点续跑不同模型输出格式不一致模型推理模板不同检查各模型返回原始格式服务层统一做文本归一化输出质量不稳定模型解码温度过高调整 temperature 参数评估时优先使用 temperature0 或低随机性还有一个容易踩的坑是提示词泄漏到输出中。有些模型会把用户输入的提示词原样复述一遍再输出正式回答。如果发现输出里有一大段重复的提示词就到服务层做裁剪。批量实验时这个现象会影响后续语义解析一定要提前处理。8.1 模型输出解析的通用后处理为了避免模型返回内容混入解释这里给出一个通用的 JSON 提取函数import json import re def extract_json(text: str): # 尝试直接解析 try: return json.loads(text) except json.JSONDecodeError: pass # 提取第一个 JSON 大括号块 match re.search(r\{.*\}, text, re.S) if match: try: return json.loads(match.group(0)) except json.JSONDecodeError: return None return None在实际调用中调用方拿到模型文本后先经过extract_json解析失败就标记为 failed不进入统计阶段。9. 最佳实践与使用建议把实验跑通只是第一步。如果要在自己的研究或测评场景中稳定复用建议遵循下面这些工程化实践。9.1 提示词工程先锁定模板再批量实验大模型对提示词很敏感。同一张墨迹图提示词是“请描述这张图片”还是“你觉得这像什么”输出差异会很大。做批量实验前先固定一套提示词模板不要在中途频繁修改。要对比多组提示词影响时应该在提示词层面设置独立变量而不是混在一起。9.2 评估流设置温度参数temperature控制输出的随机性。Rorschach 实验关注的是模型的联想模式如果温度太高同一张图多次调用结果差异会非常大统计意义就会下降。建议在评估阶段把temperature固定为 0 或接近 0 的低值保证可重复性。如果要研究模型的联想多样性再单独做高温度测试。9.3 输出结果分类统计收集完模型回答后可以按研究目标设计分类字典例如生物类人、动物、昆虫、怪物无生命类建筑物、工具、植物、风景抽象描述对称、形状、阴影、边界情绪词恐怖、愉悦、平静、紧张。利用规则或小型文本分类模型对模型回答打标再做频次统计。这一步往往比直接看原始回答更有研究价值。9.4 目录与文件规范模型权重、图片素材、输出结果、日志分目录存放文件名统一命名。这样可以保证批量实验可追踪、可复现。每一次实验建议记录以下元信息{ experiment_time: 2025-06-10 14:30:00, model_name: your_vlm, temperature: 0, prompt_template: fixed_prompt_v1, image_dir: images/test_set_a, output_dir: outputs/run_001 }如果做了多组对比元信息会非常有用。9.5 合规与版权红线整理几条必须遵守的红线墨迹图素材使用公开版或自行生成不用未授权图像不把真实人物的照片作为墨迹图测试输入实验结果不做心理诊断解读对外发布时注明“本研究仅为模型行为观测不构成心理评估”涉及人脸、声音、版权材料时必须先确认授权。本实验未涉及隐私采集属于标准模型调用但发布时依然要遵守平台规范。10. 总结与下一步这个项目最值得尝试的点是把心理学的标准刺激材料转成了一套可量化的 AI 行为观测流程。相比直接问模型“你是谁”用模糊的墨迹图诱发模型做联想式描述更容易暴露模型的内部偏好和描述习惯。对做多模态测评、模型偏置分析、可控文本生成研究的开发者来说是一个低成本、高解释力的实验设计。如果你想复现建议最先验证的是“单张墨迹图 → 模型输出 → JSON 结构化结果”这条链路。确认这条链路稳定后再做批量任务和多模型对比。最容易踩的坑是两个一个是提示词模板不稳定导致输出格式混乱另一个是批量任务没有断点续跑中途失败后全部重来。提前在后处理层写好 JSON 提取函数在批量脚本中加入失败重试和日志记录可以省下大量时间。后续可以继续扩展的方向不少。一是把测试集从罗夏墨迹图扩展到其他模糊图片比如云朵图、热力图、微距纹理图用来研究模型的联想偏置二是增加模型数量对比开源 VLM、闭源 API 模型在模糊图像上的描述分布差异三是引入更细粒度的文本分析比如情感极性、具象程度、长度分布做更深层的统计建模。这个方向最大的价值在于它不要求你有很强的心理学背景只要掌握基础的模型调用和文本处理能力就能搭建出有研究价值的实验。把自动化批量脚本写好后整套流程就可以作为一个标准的“模糊图像联想分析工具”沉淀下来。建议收藏备用的同时也提醒一句任何实验结果都只是模型行为的外部观测不要过度外推到模型是否具有人格或心理状态这一层。