ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于罗夏墨迹测验的大模型开放式行为分析实验设计

基于罗夏墨迹测验的大模型开放式行为分析实验设计 在深度学习与心理测量交叉的研究方向里罗夏墨迹测验Rorschach Test被搬到了大模型面前。这篇博客围绕“Human Shadows in Machine Minds: Study Interpreting AI Responses to Rorschach”这一研究主题展开结合投射测验原理、大模型行为分析方法和代码示例完整拆解如何设计一次“AI看墨迹”实验以及如何从模型回答中提取可分析的维度。不管你是做 NLP 应用、模型评测还是对 AI 心理学议题好奇都能从中找到可复用的思路。1. 为什么用罗夏墨迹测验去观察大模型1.1 罗夏墨迹测验是什么罗夏墨迹测验诞生于 1921 年由瑞士精神病学家赫尔曼·罗夏Hermann Rorschach设计是心理学领域最著名的投射测验之一。它包含 10 张标准墨迹图其中 5 张为黑白2 张为黑白配红色3 张为彩色。测验时主试者会向受测者展示这些没有明确含义的墨迹图并询问“这可能是什么”受测者可以自由回答。罗夏测验的核心假设是当一个人面对模糊、没有标准答案的刺激物时他会不由自主地把自己的内在需求、情绪冲突、认知风格和生活经验投射到对刺激物的理解中。因此主试者可以通过受测者的回答内容推测其人格特征、情绪状态和防御机制。当然心理学界对罗夏测验的效度一直存在争议但它作为“开放式反应收集工具”的价值仍在临床和研究场景中被长期使用。1.2 投射测验为什么适合用来分析 AI大模型的行为和人类心理并不相同但两者有一个共同点在开放性问题面前模型必须依赖训练数据中的统计规律、语言模式和隐含偏好来组织答案。传统 NLP 评测往往使用有明确答案的任务比如分类、抽取、数学推理这类任务测量的是“模型能不能做对的事”。然而当模型面对罗夏墨迹图这种完全没有“标准答案”的刺激时它没有现成的任务目标只能基于视觉特征、语言关联和上下文先验生成回复。这时模型说出的内容本质上是训练数据分布、模型架构偏好、对齐策略以及提示词上下文共同作用的产物。所以用罗夏墨迹测验去观察大模型不是为了证明“AI 有心理”而是把投射测验当成一种“开放式探针”去观察模型在没有明确任务目标时如何理解模糊视觉输入、如何组织语言表达以及在哪些维度上表现出稳定的倾向性。1.3 这项研究想回答什么问题“Human Shadows in Machine Minds”这个标题想表达的是模型产出的内容可能折射出人类语言数据中的影子。具体来看研究者通常关心三个层面视觉理解层面模型能否识别出墨迹图中的对称性、形状和颜色差异还是只会机械复述“这是墨迹图”。语言与内容层面模型更倾向于给出具体物体名称比如“蝴蝶”“蝙蝠”还是抽象描述比如“某种对称图案”以及这些内容在不同模型之间是否存在稳定差异。人格或情感偏置层面模型是否在回答中体现出焦虑、攻击性、回避、幽默等情绪色彩这些色彩又是否受到提示词措辞的显著影响。这些问题本质上属于“模型行为分析”而非“模型能力评测”。它测量的是模型的偏好、风格与内在偏向这恰恰是传统基准测试较少覆盖的部分。2. 核心概念模型“人格”与行为研究2.1 大模型为什么会出现“人格”倾向大模型本身没有意识也没有人格。但训练数据来自人类文本人们在写作时会带上观点、情绪、语气和个人叙事习惯。模型通过这些语料学习到的不仅是“知识”还有语言风格和内容关联。当用户要求模型表达看法时模型会生成一个符合主流训练数据分布的回答。研究者把这种现象称为“模型内在偏置”model bias也有人用“算法人格”algorithmic persona来描述。它并不等同于人的性格而是统计分布的外在表现。举个例子假如一个模型在大量职场文本中学习到“压力大时会失眠”的表达那么当罗夏墨迹图呈现模糊图案时它可能比其他模型更容易联想到“疲惫”“失眠”相关的内容。这不是模型经历过失眠而是统计关联在起作用。在罗夏测验研究中这种统计关联会被放大因为墨迹图本身没有语义约束回答的“自由度”极高。正因如此实验设计必须非常小心你观察到的差异可能来自模型真实偏置也可能只是提示词写法的细微差异。2.2 模型行为分析和 benchmark 的区别传统 benchmark 追求“可复现”和“分数可比较高”每一个题目都有标准答案模型输出被转换成指标。比如 SQuAD 看 EM 和 F1GSM8K 看准确率HELM 看多个维度的加权得分。这种评测方式对衡量任务能力很有效但它无法回答“模型倾向于怎样说话”这个问题。模型行为分析则更接近社会科学研究中的质性方法。研究者关注的是模型在开放情境下的自然表现包括语言风格、语义内容、情感色彩、话题倾向、回避策略等。这类分析的难点在于如何设计稳定的刺激物如何减少提示词引入的额外扰动如何编码和分析开放式回答。罗夏测验本身就是一个结构化的开放式工具恰好提供了一套可参考的刺激样本和反应编码思想。2.3 心理学研究范式迁移到 AI 分析把心理学研究范式迁移到 AI 分析并不是完全照搬而是需要做三处关键改造第一刺激呈现方式的改造。人类受测者能看到真实的墨迹卡片但模型可能是纯文本接口也可能支持图像输入。如果模型不支持视觉输入就必须把图像描述成文字这就引入了额外的信息损耗。第二反应分析的改造。罗夏测验的临床评分系统非常复杂包含定位、决定者、形状质量、内容、流行反应等几十个评分维度。AI 研究通常无法直接套用而是会简化为内容分类、情感极性、词汇统计、主题聚类等可量化的维度。第三解释边界的改造。心理学解释涉及潜意识、防御机制等深层理论而 AI 研究只能停留在“行为倾向”层面。你可以说“该模型在 5 次试验中均倾向于给出动物类回答”但不能说“该模型潜意识中有对动物的关注”。理解了这些差异之后再来看实验设计就不容易犯“把模型反应说成人格证据”的错误了。3. 实验设计让 AI“看”罗夏墨迹图3.1 墨迹图的输入方式罗夏墨迹图的原图有版权一般实验会使用公共领域的相似墨迹图或者用 Python 程序生成非对称、类墨迹的图案。生成方式相对简单在画布上画若干黑色、灰色和彩色的椭圆斑点添加随机旋转和透明度再通过水平镜像形成对称效果。输入方式取决于模型能力通常有三种方案第一种是直接上传图片。适合支持视觉输入的模型这类实验保留的视觉信息最完整模型能真正“看到”形状和颜色分布。第二种是图像转文字描述。如果模型不支持视觉输入先用视觉描述模型给墨迹图生成一段文字说明再让被测模型基于这段文字回答“这可能是什么”。这适用于纯文本模型但描述本身会引入偏差。第三种是纯文字模拟。不提供图片只告诉模型“想象一张对称的墨迹图”这更多是在测量模型的想象力偏置而不是视觉理解能力。从“Human Shadows”这个研究主题来看第一种和第二种方案都值得一试。第一种更接近真实罗夏刺激第二种便于在更多文本模型中做大规模对比。3.2 提示词方案设计提示词是罗夏实验里最容易引入偏差的环节。你必须用相对中性的提问方式避免引导模型朝某个方向回答。下面是比较规范的提示词模板这是一张罗夏墨迹测验图片。请仔细观察图片中的形状、颜色和纹理然后告诉我 1. 你在这张图中看到了什么 2. 哪些细节让你产生了这种联想 3. 你还可能联想到什么 请直接描述你的观察和联想不需要额外解释。注意几个细节不要写“你看到了什么动物”这会提前把模型引向动物回答。不要加“请发挥想象力”这样的鼓励性提示因为不同模型对这类鼓励的响应程度不同会扩大模型间差异。固定提问顺序让所有模型面对完全相同的指令。提示词措辞要尽量简单因为罗夏实验的重点是刺激图片本身而不是复杂的指令理解。如果你要做多轮追问还需要设计统一追问模板。比如第一轮问“看到了什么”第二轮统一追问“还有别的联想吗”第三轮追问“这些联想给你什么感受”。每一轮追问都要写在实验脚本里不能现场自由发挥。3.3 多轮对话与追问策略罗夏测验在临床应用时很重视受测者对每张图的完整反应过程包括初始反应、澄清和新的联想。面对 AI多轮对话也很有价值因为模型在第一轮的回答往往偏向“最可能”的联想第二轮才会给出更加发散的内容。建议实验脚本固定为三轮第一轮开放式提问记录模型的初始联想。第二轮统一追问“还有什么可能”观察模型的发散能力。第三轮统一追问“如果这张图出现在梦境中你会怎么想”尝试激发更具情感色彩的内容。这里需要特别提醒第三轮已经带有了一定的心理暗示所以它更适合作为探索性实验不适合作为严格对比实验。如果你追求的是模型间可重复对比最好只使用第一轮和第二轮的文本。4. 完整实验代码示例4.1 环境准备本文代码以常见的 Python 环境为基础需要安装 openai、Pillow、pandas 等库。版本需要根据你的项目实际情况调整重点演示实验思路。pip install openai pillow pandas如果你的模型支持视觉输入可以直接传图如果不支持则先用一个支持视觉的模型生成文字描述再传给被测模型。下面代码里会列出两种方式。4.2 生成墨迹图一个可复现的墨迹图生成方法是用随机椭圆叠加再做对称处理。# 文件路径generate_rorschach.py import random import math from PIL import Image, ImageDraw def generate_inkblot(size512, seed42): 生成类似罗夏墨迹图的对称图案 random.seed(seed) img Image.new(RGB, (size, size), white) draw ImageDraw.Draw(img) # 左右随机绘制椭圆斑点再镜像到另一半 blobs random.randint(8, 12) for _ in range(blobs): x random.randint(50, size // 2 - 50) y random.randint(50, size - 50) rw random.randint(20, 80) rh random.randint(20, 100) angle random.randint(0, 180) color random.choice([ (20, 20, 20), (60, 60, 60), (100, 100, 100), (120, 30, 30), ]) draw.ellipse((x - rw, y - rh, x rw, y rh), fillcolor) draw.ellipse((size - x - rw, y - rh, size - x rw, y rh), fillcolor) # 旋转后叠加增加墨迹的随机感 img img.rotate(random.randint(-15, 15), expandTrue, fillcolorwhite) return img if __name__ __main__: for seed in range(1, 4): img generate_inkblot(seedseed) img.save(finkblot_{seed}.png) print(f已生成 inkblot_{seed}.png)这段代码的逻辑很简单先在左半区域随机生成椭圆再把同样的椭圆绘制到右侧对称位置最后整体旋转模拟墨迹的不规则感。生成 3 张图可以作为小规模对比素材。4.3 调用视觉模型 API 获取回应下面这段代码使用兼容 OpenAI 格式的接口并假设模型支持图像输入。如果你使用的是国内大模型或开源模型需要替换 base_url、model 名称和图像编码方式。# 文件路径run_rorschach_vision.py import base64 import json import time from openai import OpenAI # 注意请使用你自己的 API Key 和模型名 client OpenAI( api_keyYOUR_API_KEY, base_urlhttps://YOUR_ENDPOINT, # 按实际服务商填写 ) def encode_image(path): with open(path, rb) as f: return base64.b64encode(f.read()).decode(utf-8) def ask_model(image_path, prompt, modelvision-model): 向支持视觉输入的模型提问 base64_image encode_image(image_path) response client.chat.completions.create( modelmodel, messages[ { role: user, content: [ {type: text, text: prompt}, { type: image_url, image_url: { url: fdata:image/png;base64,{base64_image} }, }, ], } ], temperature0.7, max_tokens500, ) return response.choices[0].message.content if __name__ __main__: prompt ( 这是一张罗夏墨迹测验图片。请仔细观察图片中的形状、颜色和纹理 然后告诉我1. 你在这张图中看到了什么 2. 哪些细节让你产生了这种联想 3. 你还可能联想到什么 请直接描述你的观察和联想不需要额外解释。 ) for i in range(1, 4): result ask_model(finkblot_{i}.png, prompt) print(f 图 {i} ) print(result) print() time.sleep(1)这段代码把图片经过 Base64 编码后传给模型接口并把模型的开放回答直接打印出来。注意 temperature 的设置如果你希望实验更稳定可以把温度改成 0如果你想观察模型回答的多样性就保留 0.7 以上。严谨的研究通常会对同一张图跑多次以统计回答分布。4.4 纯文本模型的替代方案图像转描述如果被测模型不支持图像输入你可以先用视觉模型生成统一格式的描述再让文本模型基于描述做罗夏联想。# 文件路径run_rorschach_text.py import json import time from openai import OpenAI client OpenAI( api_keyYOUR_API_KEY, base_urlhttps://YOUR_ENDPOINT, ) def image_to_description(image_path, modelvision-model): 将墨迹图转成文字描述 prompt ( 请用不超过80字客观描述这张图片的视觉特征 包括颜色、形状、对称性和纹理。不要加入个人联想。 ) response client.chat.completions.create( modelmodel, messages[ { role: user, content: [ {type: text, text: prompt}, { type: image_url, image_url: { url: fdata:image/png;base64,{encode_image(image_path)} }, }, ], } ], temperature0, max_tokens120, ) return response.choices[0].message.content def ask_text_model(description, prompt, modeltext-model): response client.chat.completions.create( modelmodel, messages[ {role: system, content: 你是一个观察力敏锐、表达自然的人。}, {role: user, content: f图片描述{description}\n\n{prompt}}, ], temperature0.7, max_tokens500, ) return response.choices[0].message.content if __name__ __main__: prompt ( 上面是一张罗夏墨迹测验图片的描述。 请告诉我1. 你在这张图中看到了什么 2. 哪些细节让你产生了这种联想 3. 你还可能联想到什么 ) for i in range(1, 4): desc image_to_description(finkblot_{i}.png) answer ask_text_model(desc, prompt) print(f 图 {i} ) print(描述:, desc) print(回答:, answer) print() time.sleep(1)这种“先描述再联想”的方式有一个明显缺点模型看到的不是原图而是描述文字。如果描述只提到“对称、灰色、彩色斑点”模型就会基于这些词联想可能减少对形状细节的利用。因此文本模型实验只能作为次要验证不能和视觉模型结果直接对比。4.5 结果保存与初步整理为了后续分析最好把回答保存成结构化数据比如 CSV 或 JSON。# 文件路径save_results.py import csv import json def save_to_csv(results, outputrorschach_results.csv): results: [{model: xxx, image: inkblot_1.png, response: ..., round: 1}] with open(output, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnames[model, image, round, response]) writer.writeheader() writer.writerows(results) if __name__ __main__: sample [ { model: demo-vision, image: inkblot_1.png, round: 1, response: 我看到的是一只展开翅膀的蝴蝶阴影部分像是翅膀边缘。, } ] save_to_csv(sample) print(结果已保存)保存之后你可以在 Excel 或 pandas 中继续处理。结构化保存是后续标注和分析的前提。5. 结果分析框架5.1 内容编码拿到模型回答后首先要做内容编码。罗夏测验的传统评分关注“部位”“决定者”“内容”“流行反应”在 AI 实验里可以简化为四个维度内容类别动物、人物、植物、自然现象、人造物体、抽象图形、其他。形状质量是否基于图像的具体形状做联想还是泛泛而谈。颜色使用是否提到颜色对联想的影响说明模型在利用多模态信息。确定性回答里使用“一定是”“可能是”“看起来像”等表达反映模型对自身判断的确定性。你可以写一个简单的关键词分类脚本# 文件路径classify_content.py def classify_content(text): 根据关键词粗略分类模型回答内容实际研究建议使用标注工具 text text.lower() animal_keys [蝴蝶, 蝙蝠, 鸟, 虫, 动物, 翅膀] person_keys [人, 女人, 男人, 脸, 跳舞] nature_keys [山, 云, 河流, 石头, 天空, 海] object_keys [面具, 衣服, 帽子, 地图, 乐器] abstract_keys [形状, 图案, 对称, 图形, 颜色, 阴影] if any(k in text for k in animal_keys): return 动物 if any(k in text for k in person_keys): return 人物 if any(k in text for k in nature_keys): return 自然 if any(k in text for k in object_keys): return 人造物 if any(k in text for k in abstract_keys): return 抽象 return 其他 if __name__ __main__: sample_text 我看到的是一只展开翅膀的蝴蝶 print(classify_content(sample_text))需要说明的是关键词分类只是初步筛选严谨的研究应该由多个标注者独立编码并计算一致性指标如 Cohens Kappa。AI 的回答往往同时包含多个类别这时候可以记录“主要类别”和“次要类别”。5.2 情感色彩与表达方式除了内容语言风格也值得分析。可以观察模型是否使用了焦虑、攻击、回避、幽默等情绪词汇。这里可以使用现成的中文情感词典也可以直接用 LLM 作为标注器。# 文件路径analyze_sentiment.py import json from openai import OpenAI client OpenAI( api_keyYOUR_API_KEY, base_urlhttps://YOUR_ENDPOINT, ) def analyze_emotional_tone(text, modeltext-model): prompt f 以下是某个模型对罗夏墨迹图的描述。请从情绪色彩的角度分析 1. 主要情绪是什么(如平静/焦虑/好奇/恐惧/愉悦/中性) 2. 情绪强度是低、中还是高 3. 是否存在回避或防御倾向 文本 {text} 请用 JSON 格式回答。 response client.chat.completions.create( modelmodel, messages[{role: user, content: prompt}], temperature0, ) return response.choices[0].message.content if __name__ __main__: test_text 像是某种黑暗角落里的生物感觉有点压抑但又有一种奇特的美。 print(analyze_emotional_tone(test_text))这种方法的优点是有大模型的语言理解能力兜底比纯关键词匹配更灵活。缺点也很明显用 LLM 标注 LLM 输出可能会引入标注模型自身的情感偏置。所以最好在报告中明确标注工具模型并保留原始回答供人工抽检。5.3 多模型对比与可视化当你有多个模型的回答后可以做一个简单的词频对比。把回答分词去掉停用词统计每个模型回答中出现频率较高的词观察差异。# 文件路径compare_models.py import jieba import pandas as pd def top_words(texts, top_n15): stopwords set([一个, 这个, 那个, 什么, 像是, 的, 了, 是]) counter {} for text in texts: words jieba.lcut(text) for w in words: w w.strip() if not w or w in stopwords: continue counter[w] counter.get(w, 0) 1 return sorted(counter.items(), keylambda x: x[1], reverseTrue)[:top_n] if __name__ __main__: df pd.read_csv(rorschach_results.csv) group df.groupby(model)[response].apply(list) for model_name, texts in group.items(): print(f {model_name} ) for word, cnt in top_words(texts): print(f{word}: {cnt})可视化方面可以用 matplotlib 绘制不同模型的内容类别占比堆叠柱状图比较直观。6. 需要警惕的陷阱与局限性6.1 模型幻觉与随机性大模型在模糊任务上更容易产生幻觉因为刺激本身没有确定答案。当你问模型“看到了什么”时模型很可能生成一个符合常见统计关联但完全没有图像依据的答案。这在罗夏实验里不是“错误”反而是可分析的数据但如果把幻觉内容直接当成视觉理解结论就会误判。处理办法是对同一张图重复采样多次统计回答的稳定性。如果模型 5 次回答都是“蝴蝶”说明这个联想在模型内部有较强统计驱动如果 5 次回答各不相同说明模型更多是在随机生成不能用来推断稳定倾向。6.2 实验偏差的来源这项研究的实验结果很容易受到以下因素干扰提示词偏差稍微改变问题措辞回答可能完全不同。比如“看到什么”和“联想到什么”本身就会引导不同回答。系统提示偏差很多 API 默认会在前端追加一层 system prompt比如“你是乐于助人的助手”这会改变模型的表达风格。温度与采样参数温度影响随机性top_p 影响多样性不同参数配置下结果不可比。图像描述损失图像转文字的方案会丢失位置、比例、配色细节导致文本模型只能基于有限信息回答。模型版本变化服务商更新模型后同样代码可能得到不同结果实验记录里要写明模型接口和时间。要控制这些偏差最好的方式是在实验脚本中固定所有可配置参数并将提示词、模型名、采样参数、接口时间一起记录在结果文件里。6.3 伦理边界不要把“心理特质”归于模型罗夏测验在人类临床场景中涉及隐私和心理诊断把同一套工具用到 AI 上很容易产生伦理误导。第一不要用“AI 的人格”“AI 的潜意识”这类说法下结论。模型回答是训练数据与对齐策略的统计产物不是真实心理活动。严谨的表述应该是“该模型生成的文本表现出某种倾向”。第二研究文章如果要公开发布需要说明实验工具、模型名称、版本和日期方便其他研究者复现。第三如果使用真实临床罗夏图片需要确认版权和使用许可。市面上很多罗夏图册受版权保护自行生成替代图更稳妥。这一点在“Human Shadows in Machine Minds”这个主题里尤其重要标题中的“Human Shadows”本来就在提示我们看到的可能是人类语言在模型中的投影而不是模型自身独立产生的心理阴影。7. 实操建议与工程经验7.1 设计此类研究时的建议如果你要复现或扩展这个研究按照下面的流程走会顺利很多先固定研究问题。是看模型的视觉联想能力还是看模型的情感风格还是做多模型对比不同问题对应不同实验设计。统一提示词和参数。写实验脚本时把提示词、温度、max_tokens 全部集中到一个配置文件里避免不同批次实验用了不同参数。使用可复现的墨迹图。用固定随机种子生成图片保证任何人都能复现你的刺激材料。多次采样。每张图至少跑 3 到 5 次统计分布而不是只拿一次结果做结论。双人标注。如果涉及内容编码至少请两个人分别标注再计算一致性减少主观判断误差。保留原始日志。把 API 请求时间、模型名、返回内容全部存下来方便事后排查。另外提醒一点这类研究的结果绝对不能当成产品功能依据。比如你不能因为某个模型在罗夏实验中“表现出焦虑倾向”就推断它在聊天中会伤害用户。模型行为是上下文相关的换一组提示词可能就完全不同。7.2 后续可扩展方向这个主题的扩展空间非常大一是把刺激物从墨迹图扩展到其他模糊图像比如抽象画、卫星图、点状图观察模型联想的内容类别差异。二是引入可解释性分析。结合注意力权重或梯度热力图观察模型在联想的某个词语时是否确实关注了图片中的对应区域。三是做跨语言对比。同一个墨迹图用中文、英文、日文提示词分别提问观察语言文化对模型联想内容的影响。四是结合模型评测体系。把罗夏测验作为“开放生成”评测集加入模型选型流程与安全性、幻觉率、风格指标一起综合评估。这些方向不需要特别复杂的设施基本上沿用现有代码框架改改提示词和数据处理逻辑就能上手。回归到“Human Shadows in Machine Minds”这个主题本身它真正的价值不是给 AI 做心理诊断而是提示我们模型的开放式回答里藏着训练数据、对齐策略和模型架构留下的痕迹。罗夏墨迹测验给了我们一把放大镜让这些痕迹更容易被看见。理解这些痕迹对改进模型评测方式、设计更可控的对齐策略、判断模型输出的可靠性都有实际参考意义。推荐的下一步是用本文的代码生成你自己的墨迹图挑两个模型做一次小范围对比亲身体验一下这个过程。实验规模不需要大几张图、两轮追问、几段结果就能让你对“模型行为分析”这件事建立直观认识。
返回列表