当前位置: 首页 > news >正文

用Python构建个人AI对话实验系统:从PDF解析到孤独感评估

孤独感在当下社会已经成为一个很普遍的体验,而大模型驱动的 AI 对话助手又刚好为“随时聊天”提供了一种近乎零成本的解决方案。于是很多人开始关心一个问题:个人 AI 对话到底能不能减少孤独感?网上相关讨论不少,但大多停留在“和 ChatGPT 聊天感觉很温暖”或者“AI 只是虚假陪伴”这种感性层面。本文想换一个角度,把这个问题当作一个可拆解的技术问题来处理:如何用 Python 读取并整理 PDF 格式的研究资料,如何基于大模型 API 搭建一个个人 AI 对话实验系统,如何记录对话数据并设计一套可评估的孤独感变化实验。整个过程既有概念分析,也有完整代码示例,适合对大模型应用、AI 情感陪伴、数据处理感兴趣的开发者阅读。

1. 背景与核心概念

1.1 “个人 AI 对话”指什么

“个人 AI 对话”通常指用户与某个由大语言模型驱动的虚拟助手之间的连续对话,而不是那种搜索引擎式的问答。它强调的是“个体专属”:对话助手可以记住你之前说过的话,会围绕你当前的情绪状态调整回应方式,甚至会主动提起你感兴趣的话题。

从产品形态上讲,个人 AI 对话可以是一个聊天机器人、一个语音助手、一个“AI 搭子”,也可以是集成在智能眼镜或手机里的小程序。只要满足以下特征,都可以算作个人 AI 对话:

  • 对话主体是单一用户和 AI。
  • 对话具备上下文记忆能力。
  • 系统能根据用户反馈进行个性化调整。
  • 对话目标是建立长期交互关系,而不仅仅是完成一次任务。

这和我们日常理解的“AI 客服”有本质区别。AI 客服的目标是高效解决问题,而个人 AI 对话的目标是“让用户感到被倾听、被理解”。

1.2 孤独感为什么可以被研究

孤独感在心理学中是一个主观体验,指个人感知到的社交关系质量低于期望,从而产生的一种消极情感体验。它并不等于“没有朋友”,一个身处人群的人也可能感到孤独。正因为孤独感是主观的、可测量的,研究者才能通过标准化量表来观察它在不同干预条件下的变化。

在“AI 是否能减少孤独感”这个问题中,核心评估对象并不是 AI 本身是否“聪明”,而是用户在持续使用 AI 对话之后,主观孤独感评分是否出现可观测的变化。这就意味着,我们需要一套完整的研究型工具链:能够把问卷、论文等 PDF 资料数字化,能够执行对话实验,能够记录行为数据,最后还要能输出统计结果。

1.3 为什么需要动手实现一个验证系统

如果只停留在“AI 能不能缓解孤独”的概念讨论,我们很难得到有价值的信息。不同性格的人、不同质量的 AI 回复、不同交互频率,带来的结果可能差异很大。更好的方式是构建一个小型验证系统,把研究问题变成可执行流程:

  1. 从 PDF 中提取问卷题目,生成前测问卷和后测问卷。
  2. 让参与者在实验前填写孤独感量表。
  3. 让参与者和 AI 对话系统进行若干次交互。
  4. 采集对话记录、对话时长、情感倾向等行为指标。
  5. 实验后再次填写量表,对比前后得分变化。

这套流程本身就是一个典型的技术开发任务,涉及文件解析、大模型 API 调用、数据存储、统计分析和可视化。即使你不是心理学研究者,也能从中学到如何把“想法”变成“可运行系统”。

2. 环境准备与版本说明

为了让后续代码可以顺利运行,我们先准备好开发环境。本文的示例以 Python 为主,因为它的数据处理生态最完整,适合快速搭建实验原型。

2.1 基础环境

  • 操作系统:Windows 10/11、macOS 或 Linux 均可。
  • Python 版本:建议 3.10 及以上。
  • 包管理工具:pip。

可以使用下面命令检查 Python 环境:

python --version pip --version

如果你的系统同时安装了 Python 2,可能需要使用python3pip3,这个根据实际环境调整即可。

2.2 需要安装的核心依赖

在项目目录下创建虚拟环境是推荐做法:

python -m venv venv

激活虚拟环境:

  • Windows:
venv\Scripts\activate
  • macOS / Linux:
source venv/bin/activate

然后安装依赖:

pip install pdfplumber openai pandas matplotlib flask

各依赖的主要用途如下:

依赖库版本说明用途
pdfplumber较新的稳定版即可从 PDF 中提取文本,比如论文和问卷
openai1.x 或兼容版本调用大模型对话接口
pandas1.5+处理对话日志和问卷数据
matplotlib3.x可视化前后测得分对比
flask3.x搭建简单的 Web 演示页面,方便实验参与者使用

需要注意,openai 包的接口在 1.x 版本之后发生了较大调整,旧代码中的openai.ChatCompletion.create写法已经不可用。本文代码以新版写法为准,你可以根据实际安装版本做微调。

2.3 大模型 API 的准备

本文示例会调用大模型 API。由于各家服务提供商经常调整接口地址、模型名称和计费方式,这里不写死某个具体厂商,而是以“OpenAI 兼容接口”为例。

你需要准备一个可用的 API Key,并在代码中设置环境变量,避免把密钥写进代码仓库。

export OPENAI_API_KEY="你的key" export OPENAI_BASE_URL="https://你的服务商地址"

如果你使用的平台不提供OPENAI_BASE_URL,也可以直接在代码里写base_url参数。

必须说明的是:请确认你使用的 API 服务符合当地法律法规和平台服务条款,且在合法授权范围内使用。不要在未经授权的情况下抓取、分析或生成涉及个人隐私的对话数据。

3. 核心原理拆解

3.1 大模型对话系统如何产生“陪伴感”

要让 AI 对话减缓解用户孤独感,系统首先要提供“被听见”的体验。这并不仅仅来自大模型本身的理解能力,还来自提示词设计和交互策略。

一个有效的陪伴型 AI 通常会做三件事:

  1. 情绪识别:从用户文本中识别出当前情绪状态,比如开心、焦虑、疲惫、难过。
  2. 共情回应:先表达理解,再提供支持或建议。支持不等于给出标准答案,而是在情感层面接住用户。
  3. 记忆与延续:在后续对话中提及用户之前提过的事情,让用户感受到连续性。

从技术角度看,这些能力都可以通过提示词约束大模型产生。比如在 System Prompt 中明确告诉模型“先识别用户情绪,再回应”和“不要急着给建议”,模型输出的风格会明显不同。

3.2 孤独感的测量方式

在心理学研究中,UCLA 孤独感量表(UCLA Loneliness Scale)是最常用的自评量表之一,包含 20 个题目,例如“你多久感到缺少陪伴?”“你多久感到自己是外向的人?”“你多久觉得让别人走近自己是困难的?”

这类题目通常采用 4 级频率评分:“从不”“很少”“有时”“一直”。计分时部分题目需要反向计分,最后得到总分。总分越高,代表孤独感越强。

我们并不需要在这里讨论量表的版权和具体内容,只需要知道一个技术思路:把量表题目数字化,让参与者在线作答,系统自动计算得分,再对比实验前后的分数变化。

3.3 为什么需要处理 PDF

很多心理学期刊文章、量表文档、研究手册都以 PDF 形式分发。如果需要把 PDF 里的问卷自动化处理,就必须先做文本提取。

举例来说,假设我们的研究资料loneliness_survey.pdf中包含问卷题目和相关说明,用 pdfplumber 可以快速提取文本:

# 文件路径:extract_pdf.py import pdfplumber with pdfplumber.open("loneliness_survey.pdf") as pdf: text_list = [] for page in pdf.pages: page_text = page.extract_text() if page_text: text_list.append(page_text) full_text = "\n".join(text_list) with open("survey_text.txt", "w", encoding="utf-8") as f: f.write(full_text) print("PDF 文本提取完成,总字符数:", len(full_text))

这里需要注意,pdfplumber 对“文本型 PDF”效果很好,也就是 PDF 中本身包含可选文本。如果是扫描件或图片型 PDF,提取出来会是空字符串或乱码,这种情况下需要先做 OCR 识别,常配合pytesseract使用。

3.4 实验设计的基本思路

要回答“个人 AI 对话能否减少孤独感”,不能只靠几个人聊几天就下结论。比较稳妥的做法是设计一个分组对照实验:

  • 实验组:与 AI 对话助手进行为期一周、每天 10 分钟左右的非结构化聊心。
  • 对照组:不进行 AI 对话,或者只使用普通搜索引擎进行信息查询。
  • 实验前后分别测量参与者的孤独感得分。
  • 实验组和对照组在性别、年龄、基线孤独感等维度尽量匹配。

实际实现中,还需要采集对话质量、情绪变化等中间变量。把流程放在代码里,就体现为:问卷模块、对话引擎模块、日志模块、分析模块。

4. 完整实战案例:构建个人 AI 对话孤独感实验系统

接下来我们落地一个最小可用系统。它包含 PDF 问卷读取、AI 对话、日志记录、分数统计和简单可视化五个核心模块。

4.1 创建项目结构

建议项目目录如下:

ai_loneliness_project/ ├── data/ │ ├── loneliness_survey.pdf │ └── ... ├── output/ │ ├── logs/ │ └── figures/ ├── code/ │ ├── extract_pdf.py │ ├── chat_engine.py │ ├── run_experiment.py │ └── analyze.py ├── venv/ └── requirements.txt

这样每个模块职责清晰:extract_pdf.py处理 PDF 资料,chat_engine.py负责大模型对话,run_experiment.py串联整个实验流程,analyze.py做前后测分析。

4.2 使用 pdfplumber 提取问卷题目

假设data/loneliness_survey.pdf是一份包含问卷题目的 PDF 文档。我们可以先提取文本,再用正则表达式把题目解析出来。

# 文件路径:code/extract_pdf.py import re import pdfplumber def extract_text_from_pdf(pdf_path: str) -> str: """从 PDF 中提取全部文本""" with pdfplumber.open(pdf_path) as pdf: pages_text = [] for page in pdf.pages: page_text = page.extract_text() if page_text: pages_text.append(page_text) return "\n".join(pages_text) def extract_questions(text: str) -> list: """用正则粗略提取问卷题目""" # 这里假设题目以数字加顿号或点号开头 pattern = r"\n?\s*(\d+)[、..]\s*(.{10,200}?)(?=\n\s*\d+[、..]|$)" matches = re.findall(pattern, text, re.S) questions = [f"{num}. {content.strip()}" for num, content in matches] return questions if __name__ == "__main__": raw_text = extract_text_from_pdf("../data/loneliness_survey.pdf") questions = extract_questions(raw_text) print("提取到题目数量:", len(questions)) for q in questions[:5]: print(q)

这段代码的目的是把 PDF 中散落的题目结构化,方便后续把题目插入到前测问卷页面中。实际问卷可能包含选项文本、计分说明、指导语,正则规则需要按文档结构调整。在实验中,我更建议人工校验一次提取结果,避免题目遗漏或截断错位。

4.3 构建 AI 对话引擎

对话引擎是整个系统的核心。我们需要设计一个既能让用户敞开心扉,又不会越界给出医疗建议的 System Prompt。

# 文件路径:code/chat_engine.py import os from openai import OpenAI SYSTEM_PROMPT = """你是一个温暖、耐心、真诚的个人 AI 陪伴助手。你的任务是: 1. 先识别用户当前的情绪,并用自己的话表达理解; 2. 不要急于给出建议,而是先陪伴用户梳理感受; 3. 对话要自然、亲切,不要像客服一样机械; 4. 如果用户表现出强烈的自伤、自杀倾向,请明确建议其联系专业心理援助机构,不要安慰过度; 5. 不要声称自己可以代替心理咨询师或医生。""" class PersonalChatAgent: def __init__(self, api_key: str = None, base_url: str = None): self.client = OpenAI( api_key=api_key or os.getenv("OPENAI_API_KEY"), base_url=base_url or os.getenv("OPENAI_BASE_URL"), ) self.history = [{"role": "system", "content": SYSTEM_PROMPT}] def add_message(self, content: str, role: str = "user"): self.history.append({"role": role, "content": content}) def reply(self, user_input: str, temperature: float = 0.7) -> str: """接收用户输入并返回 AI 回复""" self.add_message(user_input, role="user") response = self.client.chat.completions.create( model=os.getenv("OPENAI_MODEL", "gpt-4o-mini"), messages=self.history, temperature=temperature, max_tokens=300, ) assistant_message = response.choices[0].message.content self.add_message(assistant_message, role="assistant") return assistant_message def reset(self): self.history = [{"role": "system", "content": SYSTEM_PROMPT}]

这里有几个小细节需要说明:

  • temperature设为 0.7 左右,既能让回复有温度,又不会过于发散。
  • 长对话中max_tokens不宜太大,否则模型容易输出冗长回复,用户反而觉得有压力。
  • 系统中应内置安全兜底逻辑,当检测到用户处于极端情绪时,应提示其联系专业机构。

4.4 设计前测/后测问卷交互模块

为了评估孤独感变化,我们需要在实验前后给用户呈现量表。由于不同问卷的题目数量、选项描述不同,我们可以把问卷题目保存在 JSON 文件中。下面的代码演示了如何把 PDF 提取后的题目转换成 JSON 配置。

# 文件路径:code/build_survey_json.py import json questions = [ "你多久感到缺少陪伴?", "你多久感到自己是外向的人?", "你多久觉得让别人走近自己是困难的?", "你多久感到被他人理解?", ] survey_config = { "title": "孤独感自评量表(示例)", "instructions": "请根据最近两周的实际感受选择一个最符合你的频率。", "options": ["从不", "很少", "有时", "一直"], "questions": questions, "reverse_scores": [2], # 第 2 题为反向计分 } with open("../data/survey_config.json", "w", encoding="utf-8") as f: json.dump(survey_config, f, ensure_ascii=False, indent=2) print("问卷配置文件已生成")

如果实际项目中有正式量表 PDF,可以先用 4.2 节的方法提取题目,再人工修正后输出为 JSON,避免手动录入大量文本。

4.5 记录对话日志

每次对话后,把用户输入、AI 回复、时间戳保存到本地,为后续分析保留原始数据。这里使用最简单的 JSON 行格式,每行一条记录,方便用 pandas 读取。

# 文件路径:code/log_utils.py import json import os from datetime import datetime def save_interaction_to_log(log_path: str, user_id: str, user_message: str, ai_reply: str): """把一轮对话记录追加写入日志文件""" record = { "user_id": user_id, "timestamp": datetime.now().isoformat(), "user_message": user_message, "ai_reply": ai_reply, } os.makedirs(os.path.dirname(log_path), exist_ok=True) with open(log_path, "a", encoding="utf-8") as f: f.write(json.dumps(record, ensure_ascii=False) + "\n")

4.6 串联实验主流程

下面把前面的模块整合起来,实现一个简单的命令行实验流程:用户先做前测,然后与 AI 连续对话 5 轮,最后填写后测。

# 文件路径:code/run_experiment.py import json from chat_engine import PersonalChatAgent from log_utils import save_interaction_to_log def load_survey(path: str) -> dict: with open(path, "r", encoding="utf-8") as f: return json.load(f) def run_survey(survey: dict, label: str) -> dict: """简单的命令行问卷作答,返回题目索引和得分""" print(f"\n===== {label} =====") print(survey["instructions"]) answers = {} for idx, question in enumerate(survey["questions"]): print(f"\n{idx + 1}. {question}") for opt_idx, opt in enumerate(survey["options"]): print(f"{opt_idx}: {opt}") choice = int(input("请输入选项编号:")) answers[idx] = choice return answers def calculate_score(survey: dict, answers: dict) -> int: """计算总分,处理反向计分""" total = 0 for idx, question in enumerate(survey["questions"]): score = answers[idx] if idx + 1 in survey.get("reverse_scores", []): score = len(survey["options"]) - 1 - score total += score return total def main(): user_id = input("请输入参与者编号:") survey = load_survey("../data/survey_config.json") pre_answers = run_survey(survey, "前测问卷") pre_score = calculate_score(survey, pre_answers) print(f"前测得分:{pre_score}") agent = PersonalChatAgent() print("\n===== 开始与 AI 对话 =====") print("你可以聊任何想聊的话题,输入 exit 结束本轮实验。") rounds = 0 while rounds < 5: user_input = input("\n你说:") if user_input.strip().lower() == "exit": break ai_reply = agent.reply(user_input) print(f"\nAI 助手:{ai_reply}") save_interaction_to_log( log_path=f"../output/logs/{user_id}.jsonl", user_id=user_id, user_message=user_input, ai_reply=ai_reply, ) rounds += 1 post_answers = run_survey(survey, "后测问卷") post_score = calculate_score(survey, post_answers) print(f"后测得分:{post_score}") print(f"前后测得分变化:{post_score - pre_score}") if __name__ == "__main__": main()

这个主流程看起来比较简单,但它已经具备了一个实验雏形:前测、干预、后测、日志记录。

需要特别指出的是,真实心理学实验还需要考虑洗脱期、随机分组、安慰剂对照等问题,这里只做技术演示,不能直接当作严谨的科研结论。

4.7 分析对话日志并可视化

实验结束后,我们可以读取多个参与者的日志,统计平均对话轮数、平均回复长度,以及使用一个简单的情感关键词词典做粗粒度情感分析。

# 文件路径:code/analyze.py import json import os from collections import defaultdict import matplotlib.pyplot as plt import pandas as pd POSITIVE_WORDS = ["开心", "放松", "感谢", "温暖", "安心", "舒服"] NEGATIVE_WORDS = ["难过", "焦虑", "孤独", "烦躁", "害怕", "压力", "累"] def analyze_logs(log_dir: str): records = [] for filename in os.listdir(log_dir): if not filename.endswith(".jsonl"): continue user_id = filename.split(".")[0] with open(os.path.join(log_dir, filename), "r", encoding="utf-8") as f: for line in f: record = json.loads(line.strip()) record["user_id"] = user_id records.append(record) df = pd.DataFrame(records) print("对话记录总数:", len(df)) print("参与者数量:", df["user_id"].nunique()) df["user_positive_count"] = df["user_message"].apply( lambda x: sum(1 for w in POSITIVE_WORDS if w in x) ) df["user_negative_count"] = df["user_message"].apply( lambda x: sum(1 for w in NEGATIVE_WORDS if w in x) ) grouped = df.groupby("user_id")[["user_positive_count", "user_negative_count"]].mean() print("\n每位参与者平均每轮情感词出现频次:") print(grouped) return df if __name__ == "__main__": df = analyze_logs("../output/logs") # 绘制每位参与者的情感词频次对比 grouped = df.groupby("user_id")[["user_positive_count", "user_negative_count"]].mean() grouped.plot(kind="bar", figsize=(10, 6)) plt.title("参与者每轮平均情感词频次") plt.xlabel("参与者ID") plt.ylabel("平均出现次数") plt.tight_layout() plt.savefig("../output/figures/emotion_analysis.png") print("图片已保存到 output/figures/emotion_analysis.png")

这个分析脚本并没有直接测量孤独感变化,而是提供观察窗口:如果参与者在实验过程中负面情感词逐渐减少、正面情感词逐渐增加,这可能是一个值得深入研究的信号。不过,情感词典方式非常粗糙,更严谨的做法是使用大模型对每条对话进行情感维度评估,或者使用情绪分类模型。

5. 常见问题与排查思路

在实际运行这个实验系统时,可能会遇到下面这些问题。我按现象、原因、解决思路整理成一个表格,方便大家快速排查。

问题现象常见原因解决思路
pdfplumber 提取不到文本PDF 是扫描件或图片型 PDF先使用 OCR 工具识别文字,再用 pdfplumber 或 pytesseract 提取
PDF 提取文本乱码字体编码特殊或使用了自定义编码尝试更换 PDF 解析库,比如 PyMuPDF;必要时人工对照
API 调用报 401 错误API Key 错误或环境变量未设置检查环境变量是否已加载,不要在代码里硬编码密钥
API 返回超时网络不稳定或模型服务端负载高增加重试机制和超时时间,比如 timeout=60,retry=3
对话历史越来越长,成本变高没有进行上下文裁剪限制 messages 数量,超过一定轮数后丢弃早期非关键内容
用户输入“我想自杀”等极端内容系统缺少安全兜底在回复前增加敏感词检测或调用内容审核,紧急情况下提示寻求专业帮助
前测后测得分差异不明显实验干预时间太短拉长实验周期,增加对话次数,控制对照组变量

有几条需要重点展开。

问题 1:PDF 扫描件无法提取文本。

这种情况在校验问卷扫描版时非常常见。如果 PDF 本身就是图片,pdfplumber 提取不到文字,那么文本化就没有意义。解决办法是先调用 OCR。一般流程是:先用pymupdf把 PDF 页面导出为高分辨率图片,再用pytesseract做文字识别。需要注意,OCR 需要安装本地 Tesseract 程序,不同语言需要对应语言包,否则中文识别结果会很差。

问题 2:大模型回复过于“官方”。

有时即使 System Prompt 写得很像一个知心朋友,模型输出仍然像客服。这可能是因为基础模型的对话风格太偏向一致性回答。解决方法是:

  • 在提示词里加入“使用口语化表达,不要使用第一,第二,第三”。
  • 在示例中给出一个高共情回复样例,让模型模仿语气。
  • 调高 temperature 到 0.8 到 0.9。
  • 在回复生成后,用另一个本地规则过滤掉明显的“AI 味”词汇,比如“作为一个人工智能”。

问题 3:隐私和伦理风险。

很多人担心个人 AI 对话会诱导情感依赖,或者泄露用户隐私。这正是实验系统需要重点考虑的问题。工程上可以做到:对话记录本地存储、参与者匿名编号、数据导出前脱敏,以及在使用说明中强调 AI 不能替代心理医生。如果研究涉及大学或机构,必须经过伦理审查。

6. 最佳实践与工程建议

6.1 安全边界优先

在我个人看来,做“AI 陪伴”类应用的开发者最应该在意的不是模型多聪明,而是回答的安全边界。用户一旦把 AI 当作情感寄托,就可能在脆弱状态下说出非常私密甚至危险的信息。

建议在代码层面做两层保护:

第一层是敏感事件检测。可以用关键词规则拦截“自杀”“不想活”“伤害自己”等表达,并立即输出求助信息,同时终止常规对话流程。

第二层是免责声明。在实验说明页、对话开场白和每次长时间对话后,都可以温和提醒“我只是一个 AI 程序,无法替代专业心理咨询师”。

# 文件路径:code/safety_check.py CRISIS_KEYWORDS = ["自杀", "不想活", "结束生命", "伤害自己", "活着没意思"] def safety_check(user_input: str) -> bool: """返回 True 表示检测到高危表达""" for keyword in CRISIS_KEYWORDS: if keyword in user_input: return True return False def crisis_response() -> str: return "我听到你现在的状态非常痛苦。虽然我无法完全理解你的感受,但我们非常在乎你的安全。请你一定要联系身边信任的人,或者拨打当地心理援助热线,接受专业帮助。"

在高危场景下,宁可“回复说得不合适”,也不能漏掉提示求助的环节。

6.2 数据存储与最小权限原则

处理参与者数据时,建议遵守两个原则:

  • 最小化:只采集完成实验所必需的字段,比如参与者编号、对话内容、问卷得分。不要采集姓名、手机号等敏感身份信息。
  • 本地化:默认将日志保存在本地文件夹,不要上传到第三方平台。如果必须做云端统计,也要先完成脱敏。

代码中可以把用户 ID 设计成随机哈希值,而不是真实编号:

import hashlib def anonymize(user_name: str) -> str: return hashlib.sha256(user_name.encode("utf-8")).hexdigest()[:16]

6.3 如何提升系统的实验可信度

从工程角度,我们可能无法控制样本量,但可以控制“评估过程不被污染”。最好的做法是引入盲评机制:让评估者只看到对话文本,不知道文本来自实验组还是对照组,也不知道对话前后的得分。这样可以减少主观偏差。

另外,不要只看总分变化这一个指标。可以细化分析 AI 回复里的共情表达数量、对话中用户发言长度的变化、参与者的流失率等。如果实验组后期发言明显变长、负面情绪词减少,即使前后测得分差异不显著,也值得写进结论建议里。

6.4 个性化记忆设计

真正能让人产生陪伴感的 AI,往往具备长期记忆能力。当前对话系统如果不做任何处理,每次实验都会从零开始,用户可能会感到 AI “很健忘”。

生产级应用通常会引入:

  • 短期记忆:保留最近 10 轮历史。
  • 长期记忆:用户重要偏好、提到过的朋友、难忘事件写入向量数据库。
  • 定时总结:每隔一段对话时间,用大模型生成一份用户画像摘要。

在实验系统中,可以先用简单的 JSON 文件保存用户偏好:

# 文件路径:code/memory.py import json import os MEMORY_FILE = "../data/user_memory.json" def save_user_memory(user_id: str, key: str, value: str): memory = {} if os.path.exists(MEMORY_FILE): with open(MEMORY_FILE, "r", encoding="utf-8") as f: memory = json.load(f) memory.setdefault(user_id, {})[key] = value with open(MEMORY_FILE, "w", encoding="utf-8") as f: json.dump(memory, f, ensure_ascii=False, indent=2) def load_user_memory(user_id: str) -> dict: if not os.path.exists(MEMORY_FILE): return {} with open(MEMORY_FILE, "r", encoding="utf-8") as f: memory = json.load(f) return memory.get(user_id, {})

存储内容推荐用“事实描述”而不存储过度主观评价,比如保存“用户养了一只叫豆包的猫”比保存“用户喜欢猫”更安全也更有用。

6.5 可观测性与复现

实验系统的可观测性也很重要。每次 API 调用,除了记录对话文本,还应该记录模型名称、temperature、max_tokens、响应耗时,以及当时使用的 System Prompt 版本。

在单独文件中保存这些运行参数,可以极大提升实验的可复现性。否则三个月后再看日志,你可能完全不知道当时用的是哪个模型版本。

run_params = { "model": os.getenv("OPENAI_MODEL", "gpt-4o-mini"), "temperature": 0.7, "max_tokens": 300, "system_prompt_version": "v1.2", "created_at": datetime.now().isoformat(), }

7. 总结与下一步

回到最开始的问题:个人 AI 对话是否能减少孤独感?

从技术实现角度看,这个问题的答案并不是简单的“能”或“不能”,而是需要被拆解成可测量的指标。本文做了一遍完整的技术演示:用 pdfplumber 从 PDF 中提取问卷资料,用大模型 API 搭建个人对话引擎,用 JSON 文件管理系统记忆和实验配置,用 SQLite/JSON 记录对话日志,最后用 pandas 和 matplotlib 做前后测分析和可视化。

如果你想把这套原型继续深化,下面几个方向值得关注:

  • 接入长期记忆系统,比如向量数据库和 RAG 检索,让 AI 记住用户的真实生活细节。
  • 引入情绪计算模型,对大模型输出做情绪质量和共情能力的自动评估。
  • 设计更严谨的实验方案,包括随机分组、双盲评估、更长的实验周期。
  • 把命令行交互升级为 Web 页面,方便实验对象在自然环境中使用。

最后想提醒大家,这类应用最终面对的是真实的人。在追求对话流畅度的同时,一定要把安全边界、隐私保护和伦理责任放在前面。如果你对本文中的代码有疑问,或者在实际调试中遇到问题,欢迎在评论区聊聊你的场景,一起把方案打磨得更完整。

http://www.cnnetsun.cn/news/4272038.html

相关文章:

  • MuleSoft做AI编排时,LLM网关层的三层语义设计怎么做
  • 业务语义层先治理什么:优先评估高频、高风险和跨部门复用的核心指标与关键维度
  • AI辅导系统如何实现视觉接地?拍照讲题Demo全解析
  • Zero-Mem:从记忆操作中剥离提示词,实现LLM Agent零token成本
  • 【脉络】大模型时代的主流推理框架
  • AI Coding时代:如何重建验证与治理体系?
  • 短视频多模态分析系统设计:从架构到工程落地的实战指南
  • 单片机超声波测距系统设计:从HC-SR04驱动到多任务架构实战
  • 铁路级DC-DC转换器:120W 1/8砖选型与实测经验
  • 模型建立与求解:论文正文模板与写作规范全解
  • 告别对Claude说谎:用CLAUDE.md和上下文工程提升AI编程准确率
  • 蓝桥杯C++B组真题深度复盘:从枚举、BFS到DP的算法实战与避坑指南
  • LLM辅助语法工程:粤语ParGram资源与受控实验评估
  • 【零依赖量化数据实战 #17】A股公司基本面:5 个 URL 做个股画像
  • 虽然我目前已经比大多数人能搞到更多流量,但是我还想要更多
  • C++类模板:从重复代码到通用蓝图的设计模式
  • 从零开始用Python搭建自动化脚本的实用指南
  • 5个常见运维场景,居然用 Python 轻松解决了
  • 本地推理提速指南:从量化到KV Cache的工程优化
  • 一杯荷叶泡泡茶背后的制粒工艺:如何把煎煮流程“压”进茶包?
  • 华为鸿蒙安慰APP—小羊安慰
  • 【Embedded Development】基于VSCode+IAR插件的IAR工程开发环境的搭建
  • 1936_基于ssh协议和QT5实现一个CPU、GPU以及内存负荷监控
  • C语言中函数递归的实现(初识)
  • 基于YOLO的肺部CT结节检测:从数据集解析到模型训练部署全流程
  • 【Gitee】SSH 公钥、GPG 公钥、私人令牌的区别
  • 从KV缓存到分布式存储,读懂大模型推理系统的底层优化逻辑
  • 数据安全相关基础操作文档(精简)
  • RAG 可观测性实战:上线后必须能定位“为什么答错“(五)
  • 数学建模第三天:用Numpy与Pandas掌握数据处理核心技能