成功广告活动的基础概念是记忆。想想你昨天看到的广告,再想想一年前甚至几年前的那些广告。你记忆最深刻的广告往往对你最有效,但可能对别人却未必如此。任何广告代理机构面临的主要挑战,就是设计能够激发不同个体积极反应的推广内容。更重要的是,成功的营销活动致力于让消费者记住品牌、产品和服务。
尼尔森神经科学团队(Brandt & Nieuwenhuis,2017)解释了为什么记忆在广告中如此重要。他们指出,记忆在短短24小时内会显著衰减,这使得广告难以产生持久影响。多种因素,如重复频率以及内容的情感或智力冲击,能够增强记忆保持力。像GenAISys这样的智能体系统的出现,改变了营销格局,因为它们能够复制类似人类专家的营销推理。
在本章中,我们将增强之前章节中构建的GenAISys。首先,我们将设计一个针对特定市场细分的消费者记忆智能体。该智能体的目标是分析消费者如何编码推广信息。我们将从探讨记忆为何重要及其结构开始,审视短期记忆、长期记忆、显性记忆与隐性记忆等关键类别,以及智力编码与情感编码等重要维度。接着,我们将通过将消费者记忆的深入理解整合到知识库中,扩展GenAISys的架构。然后,利用前面章节介绍的多模态能力,开发一个战略性的消费者记忆智能体。该智能体将采用神经科学启发的方法来制定定制化营销信息。通过引入OpenAI先进的o3推理模型,实现元认知,使智能体能在多步骤链式推理(CoT)过程中执行近似人类的自我反思。
此外,我们将把生成式AI模型转变成具备神经科学特征的智能体,具备分析推理能力,而非仅仅是内容生成。复杂系统——如人脑——远非各部分简单相加,机器智能亦如此。基于OpenAI o3推理模型的战略消费者记忆智能体,将运用复杂的神经科学启发式提示,分析酒店评论中的消费者记忆编码模式。所得洞见将输入到一个多模态链式推理管道中,基于第5章“引入多模态多功能链式推理”中介绍的CoT框架。最终,GenAISys将利用详尽的记忆分析,结合GPT-4o生成定制营销内容,并配合DALL·E生成的图像。
最后,我们将进一步增强IPython交互界面,新增功能包括一个能够触发智能体元认知的组件,用于记忆分析和客户服务任务。用户可选择分析各类内容以获得记忆相关洞见,或发起面向客户服务的链式推理交互。
本章结束时,你将学会如何基于消费者记忆智能体架构,逐步构建一个定制化、具备推理能力、可应用于任何领域的GenAISys。
本章涵盖以下主题:
- 消费者记忆在营销中的重要性
- 人类记忆的高级结构
- 构建战略性链式推理消费者记忆智能体
- 使用链式推理分析酒店评论
- 设计神经科学启发的复杂提示语
- 使用OpenAI的o3推理模型进行深度内容分析
- 利用OpenAI GPT-4o生成内容及DALL·E生成图像
- 在链式推理功能中整合推理与生成
- 将消费者记忆智能体的链式推理推广到任意内容
- 增强IPython交互界面
让我们先从设计增强版GenAISys界面及其AI驱动功能开始。
设计消费者GenAISys记忆智能体
消费者神经科学能够通过情感共鸣和个性化的信息显著提升品牌的记忆度。本章开始分析消费者如何编码记忆。Nicks 和 Carriou(2016)指出,有效的消费者神经科学利用叙事沉浸(narrative transportation)的故事讲述方式,让消费者情感投入,生动地记住推广信息。
在我们的实现中,我们将深入分析消费者如何编码记忆,保持真实且贴合实际的做法。如果消费者表达对某项服务的不满,我们的系统将定制消息,强调改进后的服务内容。我们的目标是通过令人难忘且富有情感共鸣的信息,建立真实的连接。
本节内容包括如何增强之前章节中构建的GenAISys:
- 消费者记忆智能体用例:展示一个AI驱动的智能体如何应用源自短期记忆和长期记忆框架的记忆原理,来解读消费者反馈。
- 定义记忆结构:超越之前探讨的短期记忆(STM)、长期记忆(LTM)、情节记忆和语义记忆的基本分类,引入新的类别和维度,提供对输入信息更深层次的分析。
- 增强GenAISys架构:增加新的功能以触发AI智能体,并集成新的链式推理(CoT)场景。
我们先来探讨消费者记忆智能体用例。
消费者记忆智能体用例
本章的用例展示了如何通过链式推理消费者记忆智能体增强GenAISys。我们的目标是通过对酒店评论的详细分析,理解特定消费者在选择酒店时的需求。我们开发的系统执行全面的内容分析,评估情感倾向,并生成个性化营销内容。
链式推理智能体从对酒店评论的详细记忆和情感分析开始。它识别心理特征、情绪标记和特定的记忆标签,并为每个分析片段赋予情感得分。然后,这些得分被综合为整体情感得分和一个0到5的规模评分。通过这种方法,智能体有效捕捉消费者对特定酒店体验的感知、情感处理及记忆保持情况。
基于提取的洞见和认知画像,智能体利用规模评分决定合适的营销策略。最终,消费者记忆智能体生成定制的推广内容,包括个性化消息及相关图片。例如,如果分析显示某位客户普遍不喜欢酒店,旅行社则可以强调客户此前积极提及的替代住宿或改进服务。在这种情况下,智能体会生成配有吸引人图片的个性化信息,如图6.1所示。
该智能体通过分析从客户酒店评论中识别出的认知画像,打造出温暖且个性化的信息:
Customer message: Dear Customer,
We invite you to consider a unique vacation experience that goes beyond the typical hotel stay. Imagine the warmth and comfort of staying with family or friends, where every moment is filled with genuine connections and cherished memories. From waking up to the aroma of freshly brewed coffee made just the way you like it to sharing home-cooked meals and laughter around a family table, this experience offers a heartfelt alternative to the impersonal nature of hotels. Embrace the spontaneity and freedom of living in the moment, surrounded by those who matter most. Whether it's a cozy evening of board games or a relaxed afternoon in the backyard, staying with loved ones provides a true home away from home. This vacation, choose the warmth of a family home and create memories that will last a lifetime. Book your stay with loved ones today and rediscover the true meaning of home.
Warm regards,
[Your Company Name]
生成式AI具有随机性,同一输入不一定产生相同输出,因此每次运行的回复可能会有所不同。
接下来,让我们定义消费者记忆智能体将使用的记忆结构。
定义记忆结构
现在,我们基于第1章介绍的记忆类别,进一步阐述构建消费者记忆智能体所需的人类记忆结构。人类记忆是多层面的:
- 短期记忆(STM) :临时捕获完成当前任务或情感处理所需信息,若不加巩固则迅速消退;
- 长期记忆(LTM) :长期存储重要事件、知识和经验;
- 语义记忆:存储一般知识和事实,与个人经历无关;
- 情节记忆:记录带有具体背景和细节的个人经历事件;
- 程序性记忆:支持无意识地检索技能性任务,如走路或驾驶;
- 情绪记忆:根据情感强度(正面或负面)对经历进行分类;
- 显性记忆:涉及有意识的回忆;
- 隐性记忆:无意识地运作。
我们的消费者记忆智能体将灵活结合这些记忆类别来分析消费者内容,如图6.2所示。这种分类为OpenAI的o3推理模型提供了足够的自由度,以有效解读消费者数据。
上层的主要记忆类别包括:
- 无记忆(Memoryless) :指系统或人类不记得过去事件信息的状态。这类事件通常是我们最容易遗忘的,比如昨天眨了多少次眼睛。
- 短期记忆(Short-Term Memory) :用于临时存储信息以完成任务或处理情绪的记忆。如果没有事件再次刺激,它会迅速衰退。比如阅读长篇文章时的工作记忆。
- 长期记忆(Long-Term Memory) :存储数天至数年甚至更久的信息。这类记忆至关重要,例如知道自己在哪个国家、年龄多少、家人是谁。
- 现实记忆(Reality Memory) :我们确信的关于实际事件、事实和外部世界的认知。
- 虚构记忆(Fiction Memory) :包括想象或假设的内在事件或叙述。
- 时间记忆(Time Memory) :用于区分过去、现在和未来的事件。否则,我们可能会认为自己已经吃过明天的午饭了。
注意,无记忆、短期记忆和长期记忆构成一个子集(浅绿色),而现实、虚构和时间记忆则相互关联(浅橙色)。这些类别并非孤立存在,而是在现实生活中动态交织。换句话说,我们的记忆不是按子集独立运作,而是像AI中的“标签”那样组合存在。一个记忆可以包含多个标签的组合,例如:
- 无记忆的虚构,如梦境
- 短期的现实,如阅读新闻
- 长期的虚构,如很久以前读过的一部小说
观察这些记忆子类别,我们很快意识到主记忆类别下存在大量可能的标签组合,比如语义短期记忆(semantic STM)或情节长期记忆(episodic LTM)。而且,记忆可以无缝融合多个子类别,比如“我去年去过罗马”这句话同时包含情节、语义和时间标签。此外,我们的记忆还涵盖隐性(无意识地整天眨眼)和显性(因眼睛不适而有意眨眼)两种类型。
在我们的消费者记忆智能体中,我们将要求对内容进行全面分析,并为每个文本片段分配适当的记忆标签。但仅仅详细标记还不够。为了有效捕捉消费者体验,我们将为每个记忆标签赋予三个分析维度:
- 智力维度:识别文本中的思想、逻辑和推理;
- 情感维度:定位情绪、感受和整体氛围——这对有效的消费者互动至关重要,同时提供一个可量化的情感分数(0到1之间),可转换为客户满意度调查中熟悉的1到5评分;
- 物理维度:突出感官体验和身体感受,比如“天气太冷不能游泳”或“睡了那张酒店床后背痛”。
考虑到这些增强,我们接下来将探讨如何将它们整合到我们不断演进的GenAISys架构中。
增强GenAISys架构
本章将在此前第5章图5.3中展示的三层架构基础上继续构建,图示如下:
我们的方法将采取自下而上的方式,从基础功能开始,逐步向上构建,直至AI智能体和GenAISys界面:
- 第3层(功能与智能体) :在这里,我们将在自定义的OpenAI库(reason.py)中引入更多功能,专门针对消费者记忆智能体和链式推理(CoT)设计。同时,我们将开发一个独立的记忆分析函数,能够提供类似神经科学的分析,适用于任何内容。
- 第2层(AI智能体) :该层负责管理GenAISys的行为和决策。我们将建立明确的输入触发机制和命名规范,以有效激活和控制AI智能体。
- 第1层(IPython界面) :扩展交互界面以便用户操作。我们将新增一个组件,方便用户选择如何调用消费者记忆智能体。初期重点聚焦于酒店评论,随后推广到任意输入形式。
接下来,让我们开始构建消费者记忆智能体。
构建消费者记忆智能体
本节中,我们将赋予GenAISys神经科学分析能力,专门用于分析酒店评论。消费者记忆智能体将捕捉用户的认知、情感和身体状态,通过如图6.4所示的六步链式推理(CoT)流程解码每段评论:
消费者记忆智能体的链式推理(CoT)将使用OpenAI的o3、GPT-4o和DALL·E完成以下六个步骤:
步骤1:记忆与情感分析
智能体将利用复杂的记忆结构系统消息,逐段分析酒店评论内容,并对内容进行标记。
步骤2:提取评分
智能体处理步骤1的输出,提取每个内容片段的情感评分。
步骤3:统计分析
智能体利用所有标记片段的评分,计算内容的整体认知评分。
步骤4:内容生成决策
智能体根据评分做出决策:如果评分超过正面阈值,将生成鼓励消费者选择酒店的消息;如果评分为负,则生成客栈相关消息。决策确定后,智能体将结合消费者的记忆标签,创建定制化的推广信息。
步骤5:图像生成
智能体基于步骤4的输出,生成符合消费者心态的图像。
步骤6:消息生成
智能体整合所有信息,生成个性化的客户消息。
在逐步开发这些环节后,我们将在接下来的章节“GenAISys界面:从复杂到简单”中实现完整集成,目标是将链式推理功能推广应用于酒店评论以外的内容。
要开始这段旅程,请打开GitHub上Chapter06目录中的 1_Building_the_Consumer_Memory_Agent.ipynb 笔记本(github.com/Denis2054/B…
数据集:酒店评论
本章将使用合成的酒店评论数据集来构建记忆智能体。我们将处理酒店评论,同时也将把智能体的记忆结构泛化到其他需要分析的内容。出于版权原因,所用数据集是手工和生成式AI协助制作的合成评论数据。
如果你想探索更多数据集,可以使用Kaggle上提供的TripAdvisor酒店评论数据集,适用于非商业私人项目,链接为:www.kaggle.com/datasets/an…。
请运行GitHub中与第5章相同的“环境设置”部分,并直接从GitHub仓库下载数据集:
download("Chapter06","hotel_reviews.csv")
我们将使用 pandas 的 DataFrame 来处理该数据集。程序现在加载了CSV文件并展示数据:
import pandas as pd
# 将CSV文件加载到Pandas DataFrame中
dfta = pd.read_csv('/content/hotel_reviews.csv', sep=',')
# 显示DataFrame
dfta
该数据集包含两个主要列:Review(评论)和Rating(评分)。例如,第0条记录的评分较为中肯,为3分,而第1条记录的评分则明显积极,为5分:
仅凭评分无法提供足够的深度——我们需要更细致的情感分析,才能全面理解客户满意或不满意的原因。我们将选择一条具有挑战性的评论开始分析:
index_number = 0 # 指定索引号
程序接下来提取该评论及其评分:
# 提取所需字段
review = row['Review']
rating = row['Rating']
# 显示结果
print(f"Review: {review}")
print(f"Rating: {rating}")
except IndexError:
print(f"错误:索引 {index_number} 超出DataFrame范围。")
except KeyError as e:
print(f"错误:DataFrame中未找到列 '{e}'。")
输出显示了该评论及其评分:
Review: We got a nice hotel. The parking was rather expensive. However, we got a good deal for my birthday. We arrived in during the night because of a late flight but the parking was open 24hours The check in was rapid. The room was a large size. Cool. But we didn't get the view expected. The bed was super comfortable and got a nice sleep for a few hours but then there was a raucous of a noisy crowd going to bed late. Anyway the price was acceptable and we made it to the shopping mall next to the hotel which reminded me of the one we had at home.
Rating: 3
我们选择了一条较为复杂的评论,因为它同时包含负面和正面情绪。评论中的负面部分将考验智能体生成建设性解决方案的能力。在继续之前,请你先自行分析每个评论片段的记忆标签、情感评分和维度。这个练习有助于厘清记忆类别的使用,并为你后续将自己的见解与智能体分析结果进行比较提供基准。将提取的评论设为初始输入:
input1 = review
接下来,我们将为步骤1针对input1设计一个复杂的系统消息。
步骤1:记忆与情感分析
此步骤通过引入OpenAI的o3推理模型,实现了对消费者记忆智能体的高级推理能力,结合了元认知和元推理。换句话说,智能体不仅仅是处理文本,而是主动反思其内部推理过程,对文本逐段分析,分类记忆类型并分配情感评分。
具体来说,o3模型将在我们精心设计的系统消息内运行。该系统消息将明确指导模型,促使其进行深度推理,确保根据类人认知过程准确分配记忆标签。我们正真正处在推理与自我反思AI的时代!
本节中,我们将完成以下任务:
- 设计一个复杂的系统消息,融入之前定义的详细记忆结构。该消息命名为
system_message_s1,将单独存储在Python文件中以便模块化管理。 - 依赖OpenAI的o3推理能力完成繁重的细粒度段落级分析,免去人工解读的负担。
注意,我们使用o1作为统称,向LLM指明其作为推理模型的身份。此外,虽然API中我们尽量调用o3,但LLM回复时可能会自称为o1。
现在,让我们一步步构建这个详细的系统消息。
为步骤1设计复杂的系统消息
我们必须设计一个足够全面的系统消息,使模型能够深入理解并执行受神经科学启发的记忆分析。为此,我们将消息精心划分为清晰标注的多个部分,每个部分引导智能体完成分析的不同环节。
0. 模型介绍与智能体角色
第一行在两个层面上为智能体定下基调。第一层提供必要概念,帮助智能体理解本任务中的高级记忆分析;第二层则详细描述智能体的职责:
你是一款生成式AI模型,是一个高级记忆分析模型。你的职责是审查输入文本的每个片段,并生成一组“记忆编码标签”,类似于人脑在神经科学中编码记忆的方式。对于输入中的每个片段,你需要确定适用的记忆类别,解释其理由,并分配额外的元数据(如维度、情感等)。
现在,让我们逐条理解消息的这部分内容,明白智能体正在学习什么:
- 生成式AI模型,高级记忆分析模型:这里我们以特殊方式设定系统角色,要求模型不仅仅生成文本,而是进行思考、分析和推理。
- 审查每个片段:我们教模型模拟神经科学的方法。人脑以离散包的形式编码信息,这里让模型模仿人脑记忆过程。每个文本片段可以是一句话、一句分段或者一个段落。这样,模型将以类似人脑独立编码信息的方式来分析文本。
- 生成一组“记忆编码标签”,类似人脑编码记忆的方式:人脑通过标签(tag)编码记忆,这一术语在这里用于高级概念,无需深入生物过程。大脑会为每条编码的信息打上标签,以区分过去事件和未来事件,或语义信息与个人情感体验。这些标签就是我们期望模型在文本中识别的记忆类别。
- 讨论理由并分配额外元数据:模型必须说明为何将某个标签赋予该片段。每个类别,如短期记忆(STM)或长期记忆(LTM),都需解释其依据。模型还需为描述添加维度,包括智力和情感因素。
你可能会注意到代码中有一个Markdown分隔线(---),它告诉模型即将进入新的主题。虽然看似不起眼,但就像我们给人类指令时强调话题转换一样,这一点很重要。现在,我们将给智能体明确的目的。
1. 目的
第三行是标题,告诉模型我们进入消息的第一个重要部分:
### 1. 目的
第四行定义了OpenAI推理模型o3的目标:
你的目标是对文本的每个片段执行深入的记忆分析。换句话说,你将使用特定的记忆类别(也称“记忆编码标签”)对发现的每个片段进行分类和标注。这个过程帮助洞察文本不同部分在人体记忆中的编码方式。
需要注意的是,消息中提到“o1”,这是OpenAI推理模型的统称。核心思想是让API明白我们期望的是推理功能。无论选用哪个推理模型,这条指令都将激活推理。该目的部分的关键内容强调了我们的期待:
- 深入的记忆分析:我们不希望是传统的简单分析,而是深入到每个片段细节的反思。
- 使用特定记忆类别对每个片段进行分类和标注:这是对模型应标注的记忆类别的明确指示。再次提醒智能体,我们不是要生成文本,而是对片段进行分类和标注。
- 洞察文本不同部分可能在人体记忆中的编码方式:这是明确要求模型进行类人思考,模拟大脑编码记忆的过程。
现在,我们需要为智能体提供学习记忆类别的标题。前几行给出了明确指令。至此,我们进入消息的第2部分。
2. 记忆编码标签
我们现在教智能体如何识别不同类别的人类记忆编码标签。这是进入人类记忆编码核心的部分。记忆类别就是本章“定义记忆结构”部分讨论的内容:
### 2. 记忆编码标签(类别)
这个标题非常重要,智能体将通过它来领会我们期望的标签。标题一经传达,智能体即已接受此指引。接着,我们向模型清晰说明期望它执行的操作:
以下是你必须使用的记忆类别列表,把它们视为你的“标签体系”。一个片段可能包含一个或多个类别。如果没有相关类别,你可以赋予特殊标签“memoryless”,表示该片段无显著记忆编码。
关注这段话的重点:
- 标签体系:让模型与人脑对不同记忆类别编码的方式保持一致,利用标签区分过去与现在;
- 一个片段可能包含多个类别:告诉模型记忆可以多重编码,就像人脑一样;
- 如果无相关类别…使用memoryless:告知模型找不到适用类别时,须打上“memoryless”标签。
然后,我们明确列出类别(如STM、LTM、情节记忆、语义记忆、时间记忆、现实记忆、虚构记忆、无记忆等),与之前讨论一致:
-
短期记忆(STM)
- 用于看似短暂、最近获得或仅与当前环境相关的信息。
…
- 用于看似短暂、最近获得或仅与当前环境相关的信息。
-
无记忆(Memoryless)
- 若片段与任何记忆编码无关,或纯功能性文本(如免责声明、随机填充内容),标记为“memoryless”。
虽然描述了记忆标签,但仅靠它们不足以完整捕捉人类记忆,人类还依赖其他维度来编码事件。
3. 维度
维度部分为智能体的分析增添智力、情感和物理特征。以下信息源自“定义记忆结构”章节:
维度描述
-
智力维度
-
逻辑、分析或事实推理过程。
- 解释:如果文本聚焦于理性论证、数据或事实细节,应标记为“智力”。
-
情感维度
-
感觉、情绪或情感元素。
- 解释:如果文本表现出快乐、悲伤或其他强烈情绪内容,则标记为“情感”。
-
物理维度(含感官体验)
到此为止,我们定义了记忆类别及附加维度。但情感分析还需更细致。
4. 情感评分
正如“定义记忆结构”一节所述,情感评分衡量片段的情绪价值。它是介于0(负面)和1(正面)之间的数值,若无法检测到情绪,则为0.5(中性):
### 4. 情感评分
为每个片段分配一个情感评分,范围为0.0至1.0,其中:
- 0.0 = 非常负面
- 0.5 = 中性
- 1.0 = 非常正面
如果片段纯属事实陈述,无情感倾向,则使用0.5(中性)。
请注意,消息的每个部分均以清晰的Markdown标记开始和结束,用以指示话题转换。
5. 回复格式
我们需要回复中清晰展示原文中每个片段,列出对应的记忆标签,确定每个片段所属维度(智力、情感或物理),提供情感评分,并简要解释理由:
### 5. 回复格式
针对输入文本的每个片段:
- 展示片段摘录或简短摘要;
- 记忆标签:列出相关类别;
- 维度:选择智力、情感或物理;
- 情感评分:0.0 到 1.0;
- 简短解释:说明标签和维度的理由。
为确保模型理解要求,我们给出示例格式:
示例格式:
片段1:“摘录……”
- 记忆标签:[时间记忆-过去,现实记忆]
- 维度:情感
- 情感评分:0.7
- 解释:说话者提及了一个带有积极情绪的过去真实事件。
如果是传统生成式AI模型,这里就可结束。但这条消息较复杂,我们还需补充指令,强调期望。
6. 额外指令
我们避免让前面部分过于冗长,过多指令可能令模型混淆。这里提醒系统,始终需逐段分析。若找不到类别,则标记“memoryless”,绝不可胡乱生成。同时,只需简短清晰的解释:
### 6. 额外指令
- 始终逐段分析;
- 无匹配类别时,使用“memoryless”;
- 解释简洁明了。
现在最棘手的部分来了。我们告诉模型找不到类别时用“memoryless”,但如果模型有模糊判断,可选最可能的类别并必须提供情感评分:
- 对正确类别不确定时,选最可能类别;
- 必须包含情感评分。
至此,我们已向模型提供了大量指令。现在让我们确保它记住核心任务。
7. 主要任务回顾
在给模型下达了所有指令之后,我们将提醒模型其主要任务是对文本片段进行记忆标签分析。我们也期望输出格式符合之前定义的结构化格式:
### 7. 主要任务
当我提供多段文本时,你必须对每个片段进行彻底的记忆标签分析。请按照上述结构化格式返回结果。
[系统提示结束]
注意我们添加了“[系统提示结束]”,确保模型理解全局提示的消息部分已完全定义。我们用“提示(prompt)”一词,明确它是一组指令,而不仅仅是普通消息。
运行记忆分析
我们设计的复杂系统消息存储在GitHub仓库commons目录下cot_message_c6.py文件中的变量system_message_s1里。这样做的目的是将消息与函数调用分开,方便GenAISys的AI智能体在本步骤或其他步骤复用函数,执行不同任务。
首先下载包含消息的文件:
download("commons","cot_messages_c6.py")
然后导入system_message_s1和后续步骤4会用到的消息(稍后会讲):
from cot_messages_c6 import (
system_message_s1, generation, imcontent4, imcontent4b
)
print(system_message_s1) # 打印以验证
打印函数已取消注释,会显示刚创建的消息。可随时注释以验证消息是否正确导入。接着,我们准备发送给o3模型的消息:
# 步骤1:记忆与情感分析
mrole = system_message_s1
user_text = review
mrole是我们设计的系统消息system_message_s1,user_text是从酒店评论数据集中选定的评论。
现在调用o3模型,将结果存储在变量中:
retres = reason.make_openai_reasoning_call(user_text, mrole)
make_openai_reasoning_call函数位于GenAISys的AI库reason中。它接受上述两个参数,创建OpenAI客户端,发送请求,并返回响应:
# 实现在Chapter06中
def make_openai_reasoning_call(user_text, mrole):
system_prompt = mrole
client = OpenAI()
rmodel = "o3-mini" # o1或其他模型。该模型在/commons目录下定义,方便OpenAI更新时全局修改所有笔记本
response = client.chat.completions.create(
model=rmodel,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_text}
],
)
return response.choices[0].message.content
此次调用使用了o3推理模型系列中的o3-mini版本,也可以选择其他版本或推理模型。程序随后打印存储在retres中的输出结果:
# 打印生成的输出(记忆分析)
print(retres)
输出展示了系统消息和o3推理模型的深度。AI模型将内容拆分为多个片段,解码了人类评论者潜意识中使用的记忆标签,如第一个片段所示。
模型首先给出片段编号和内容。我们重点关注第7段,值得注意:
片段7:“但我们没看到预期的景色。”
它还给出了该片段对应的记忆标签:
- 记忆标签:[情节记忆(Episodic Memory),现实记忆(Reality Memory)]
随后给出了该片段的维度:
- 维度:情感
紧接着给出情感评分:
- 情感评分:0.4
最后给出了对该片段分析的总结性解释:
- 解释:对景色的失望引入了负面情绪元素,影响了整体住宿体验的感受。
模型随后继续对评论的所有片段进行分析。至此,我们完成了一次复杂的记忆分析,为后续步骤奠定基础。接下来,我们将提取情感评分。
步骤2:提取情感评分
从这一点开始,存储在review中的原始输入将不再使用。链式推理(CoT)过程依赖于上一步的输出,该输出会根据上下文不断变化。接下来,我们要提取步骤1“记忆与情感分析”中所有片段对应的情感评分。这些信息将在步骤4“内容生成”时用于决策。
为提取评分,首先创建一个提取函数并提供详细指令:
def extract(tasks_response):
umessage = """
1) 阅读以下文本分析,返回文本每部分的详细记忆标签
2) 然后仅返回记忆标签列表,绝无其他文字
3) 不使用任何格式,不用井号,也不用Markdown。仅以纯文本回复
4) 同时为每个标签提供情感分析评分,格式如下(无括号):memory tag sentiment Score
"""
我们已明确指示GenAISys仅以简洁格式返回情感评分。现在调用先前定义的reason.make_openai_api_call(位于reason.py,即之前章节开始构建的AI库)。API调用的输入是将上一步输出retres追加到指令消息umessage后组成的:
umessage += retres
系统角色提醒智能体其心理营销专家身份:
mrole = "system"
mcontent = "You are a marketing expert specialized in the psychological analysis of content"
用户角色传入消息umessage,发起API调用:
user_role = "user"
task_response = reason.make_openai_api_call(
umessage, mrole, mcontent, user_role
)
return task_response
智能体返回task_response,我们将从中提取记忆情感评分,进行处理和校验:
# 步骤2:提取评分
task_response = extract(retres)
print(task_response)
输出是我们期望的每个片段对应记忆标签的评分列表,例如:
Reality Memory sentiment 0.8
Episodic Memory sentiment 0.8
Reality Memory sentiment 0.4
Episodic Memory sentiment 0.4
Episodic Memory sentiment 0.8
Reality Memory sentiment 0.8
Time Memory Past sentiment 0.8
Episodic Memory sentiment 0.5
…
接下来,我们需要整合这些评分,以供后续决策使用。
步骤3:统计分析
本步骤将使用简单的非AI正则表达式(re)模块进行模式匹配和提取。这表明GenAISys的链式推理(CoT)可以包含非AI函数,扩展其功能范围,超越纯生成式AI模型。
待分析的文本是上一步的输出:
# 输入文本
text = task_response
我们需要提取小数值:
# 用正则表达式提取情感评分
pattern = r"(\d+.\d+)"
scores = [float(match) for match in re.findall(pattern, text)]
接着显示提取的评分:
# 输出提取的评分
print("提取的情感评分:", scores)
输出结果示例:
提取的情感评分:[0.8, 0.8, 0.4, 0.4, 0.8, 0.8, 0.8, 0.5, 0.5, 0.5, 0.7, …]
如果函数成功返回评分,我们先计算总体评分:
# 可选:计算总体评分和缩放评分
if scores:
overall_score = sum(scores) / len(scores)
然后将评分按1到5的尺度转换:
scaled_rating = overall_score * 5
最后显示总体评分及缩放后的评分:
print("总体评分(0–1):", round(overall_score, 2))
print("缩放评分(0–5):", round(scaled_rating, 2))
输出符合预期:
总体评分(0–1):0.63
缩放评分(0–5):3.14
输出需要一定的人为分析:
-
在实际项目中,这个流程可能不会如此顺利!AI智能体可能完全不会产出我们期望的结果,或者某一步可用但评分不准确。遇到这种情况时,我们必须尝试替代方案。构建GenAISys,和任何AI系统一样,是一个迭代过程。
-
该酒店评论的原始评分是3,而我们得到了3.14的更细化评分。线上评分具有主观性,可能无法准确反映评论内容。通过类似本节的高级分析流程,AI智能体能提供更细腻的评分。我们也可以将酒店原评分与我们的评分取平均。但我们的目标是生成定制化的消费者信息。在实际项目中,我们会利用消费者记忆智能体,配合市场调研小组,获取实时反馈。
目前,我们已有足够信息确定待生成内容。
步骤4:内容生成
在决定要生成的内容之前,智能体首先读取信息消息。第一条消息是umessage4:
from cot_messages_c6 import umessage4
该消息包含如何创建推广活动的指令。我们将消息保存在变量中,以便根据任务需要调用不同的提示。
智能体必须先利用已分析的记忆标签生成文本,而非分析文本:
umessage4 = """
1) 你的任务是基于文本的记忆分析,为客户生成一段引人入胜的文字。
2) 文本分析以以下格式提供:文本片段、记忆标签、维度、情感评分和解释。
文本还包含整体情感评分和文本中的记忆标签列表。
3) 生成文本时,只能使用所提供的记忆标签。
"""
随后,智能体收到关于情感分析的指令:
4) 使用整体情感评分决定回复的语气。
如果整体情感评分为正面,则生成一段针对每个片段及其记忆标签和情感评分的引人入胜的文本;
如果整体情感评分为负面,分析原因并寻找解决方案以满足客户;
遇负面评分时,确保体现对负面情绪的同理心,并实现从负面到正面的转变;
4) 聚焦以“主题”开头的关键词,关注文本核心主题以让客户满意。
"""
接着,智能体收到关于内容生成的最终指令:
5) 利用你的训练,为该主题建议命名实体,确保客户收到与记忆标签和情感评分相匹配的定制化信息。
"""
我们现在创建输入,将之前得到的缩放评分和智能体发现的记忆标签加入其中:
ugeneration = generation + "每个文本片段的高级记忆分析及情感评分:" + retres + ",整体缩放评分:" + str(scaled_rating) + ",文本记忆标签列表:" + task_response
智能体现在有了完整的任务表示。我们用imcontent4说明智能体角色:
imcontent4 = "你是一名专注于内容心理分析的营销专家"
现在,智能体准备调用生成函数make_openai_api_call:
ugeneration = generation + …
mrole4 = "system"
mcontent4 = imcontent4
user_role = "user"
pre_creation_response = make_openai_api_call(
ugeneration, mrole4, mcontent4, user_role
)
print(pre_creation_response)
返回的pre_creation_response响应会体现同理心(如果情感为负面)或根据评论语气进行调整:
**片段7:“但我们没看到预期的景色。”**
记忆标签:[情节记忆,现实记忆]
情感评分:0.4
当期望未达成时感到失望是可以理解的。对于未来的住宿,…
输出采用认知格式。接下来我们用一条消息清理并准备内容,用于图像生成:
umessage4b = "请清理并简化以下文本,使其成为DALL·E提示的可用描述。重点将详细分析转化为简洁的视觉描述,以便生成引人注目的推广图像。" + pre_creation_response
mrole4b = "system"
mcontent4b = imcontent4b
user_role4b = "user"
creation_response = make_openai_api_call(
umessage4b, mrole4b, mcontent4b, user_role4b
)
print(creation_response)
输出是一条清晰指令,要求创建一张带有令人兴奋豪华优惠的图片,深受欢迎:
“豪华酒店住宿,宽敞客房,快速入住;享受舒适床铺和便捷的24小时停车。特惠活动和邻近购物区如家般温馨。尽管有少量噪音和视野问题,整体体验积极且难忘。”
每次请求的输出可能略有不同,但语气应保持一致。同时,我们可以调整指令以生成其他内容。在此情况下,智能体已准备好利用该指令创建图像。
步骤5:生成图像
在此阶段,消费者记忆智能体使用步骤4“内容生成”中生成的指令(creation_response),通过OpenAI的DALL·E创建定制的推广图像:
# 步骤5:生成图像
import requests
prompt = creation_response
image_url = reason.generate_image(prompt)
generate_image(prompt)函数复用自前一章。通过持续复用函数,我们减少开发工作量,确保代码可维护性。与第5章类似,图像被生成并保存为文件c_image.png:
save_path = "c_image.png"
image_data = requests.get(image_url).content
with open(save_path, "wb") as file:
file.write(image_data)
图像现已准备好,作为最终个性化消息的配图。我们将在流程结束时展示该图像。
步骤6:生成定制消息
有了推广图像后,我们现在生成简洁且引人入胜的客户消息。首先,确认步骤5生成的creation_response可用:
if creation_response != "":
umessage = """
1) 仔细阅读以下文本
2) 用段落总结,不需编号
3) 输出应为可发送给客户的文本
"""
智能体输出一段润色后的消息,适合客户沟通:
尊敬的客户,
体验豪华酒店住宿,宽敞客房与快捷入住流程。享受舒适床铺和24小时便捷停车。把握特惠活动与如家般的附近购物。尽管有少量噪音和视野问题,整体体验仍然积极且难忘。
此致敬礼,
如果需要,我们可以用Python的textwrap模块以另一种格式显示输出:
import os
from IPython.display import Image, display
import textwrap
# 设置每行宽度
line_width = 70
# 按指定宽度换行文本
wrapped_message = textwrap.fill(process_response, width=line_width)
print(wrapped_message)
显示的消息清晰、专业,适合直接发送给客户:
尊敬的客户, 体验豪华酒店住宿,宽敞客房
与快捷入住流程。…
为了提升消息效果,可以调整提示,省略AI或系统内部信息,专注客户导向语言。
最后,系统将生成的图像与消息一同展示,形成吸引人的个性化推广套餐:
# 定义图像路径
image_path = "/content/c_image.png"
# 检查图像文件是否存在
if os.path.exists(image_path):
# 显示图像
display(Image(filename=image_path))
else:
print(f"未找到图像文件 {image_path}")
最终视觉效果突显酒店升级后的豪华体验,与基于客户评论分析得到的期望完美契合。
你现在可以尝试更多评论,测试智能体的深度和灵活性。我们已经成功开发出一个复杂且受神经科学启发的链式推理(CoT)消费者记忆智能体。在下一节,我们将把整个流程整合进reason.py AI库,并进一步完善我们的GenAISys框架。
GenAISys界面:从复杂到简洁
本章的旅程让我们深入体验了自我反思、推理与元认知智能体AI的时代。在最后一节中,我们将从消费者记忆链式推理的复杂内部机制转向清晰直观的用户体验。我们会新增一个CoT组件,允许任何用户对任意文本触发记忆分析或完整内容生成。随后,我们将扩展AI智能体,使其能够响应该组件的选项。最后,我们将通过一次航班评论演示这一通用工作流,展示相同的记忆逻辑如何应用于新领域。
打开GitHub上的 2_Running_the_Reasoning_GenAISys.ipynb 笔记本,运行与第5章相同的“环境设置”部分。我们将从为IPython界面添加CoT组件开始。
添加CoT组件
为了让记忆智能体更简单直观,我们引入了一个简洁的下拉菜单(见图6.6)。用户可以轻松选择希望GenAISys智能体执行的任务:
- 无(默认) :不激活任何推理任务
- 分析:激活独立的记忆分析功能
- 生成:执行完整的消费者记忆智能体工作流(步骤1–6),包括情感分析、内容生成和定制消息创建
这一简化的用户交互显著降低了终端用户的复杂度,将复杂的内部运作隐藏到后台。
该组件的实现分为三个步骤——添加组件、添加监听器(observer)、以及将选项传递给AI智能体:
添加组件
添加组件只需几行代码。我们在IPython界面中定义一个下拉菜单(instruct_selector):
# 确保memory_selector选项中包含'Instructions'
instruct_selector = Dropdown(
options=["None", "Analysis", "Generation"],
value="None", # 确保默认值active_memory在选项中
description='Reasoning:',
layout=Layout(width='50%')
)
该下拉菜单提供了清晰的选项,确保用户能够轻松理解他们的选择:无、分析或生成。接着,我们将instruct_selector整合进现有的界面布局(VBox)中:
VBox(
[user_selector, input_box, agent_checkbox,
tts_checkbox, files_checkbox, instruct_selector],
layout=Layout(display='flex', flex_flow='column',
align_items='flex-start', width='100%')
)
当用户提交选择时,一个处理函数(handler)会更新输出消息,告知用户选择已被采纳,代码如下:
def handle_submit(sender):
user_message = sender.value
if user_message.strip():
sender.value = "" # 清空输入框
# 判断instruct_selector是否为“Analysis”或“Generation”
if instruct_selector.value in ["Analysis", "Generation"]:
with reasoning_output:
reasoning_output.clear_output(wait=True)
print("Thinking...") # 仅在这里显示“Thinking...”
print("Reasoning activated") # 恢复默认消息…
我们希望显示“Thinking...”,以提醒用户系统正在处理。
添加监听器
第二步是插入一个监听器(observer),用于检测用户的选择变化并更新显示。通过instruct_selector.observe调用监听:
# 确保memory_selector选项中包含'Instructions'
instruct_selector = Dropdown(
options=["None", "Analysis", "Generation"],
value="None", # 确保默认值active_memory在选项中
description='Reasoning:',
layout=Layout(width='50%')
)
instruct_selector.observe(on_instruct_change, names='value')
将选择传递给AI智能体
最后一步是将用户的选择无缝传递给AI智能体调用。所选推理模式(active_instruct)整合进智能体执行流程:
if agent_checkbox.value:
pfiles = 1 if files_checkbox.value else 0
active_instruct = instruct_selector.value # 获取选中的指令
response = chat_with_gpt(user_histories[active_user],
user_message, pfiles, active_instruct)
通过将以上几行代码清晰集成,AI智能体能动态激活合适的推理模式,而不增加用户操作复杂度。我们现在可以进一步增强AI智能体了。
增强AI智能体
AI智能体现在会通过一个名为active_instruct的新参数接收用户在组件中的选择,从而触发相应决策:
def chat_with_gpt(messages, user_message, files_status, active_instruct):
当用户选择“分析”(Analysis)时,AI智能体调用之前构建的推理函数make_openai_reasoning_call执行记忆分析:
if active_instruct == "Analysis" and continue_functions == True:
from cot_messages_c6 import (
system_message_s1, generation, imcontent4, imcontent4b)
mrole = system_message_s1
reasoning_steps = reason.make_openai_reasoning_call(
user_message, mrole
)
aug_output = reasoning_steps
continue_functions = False
同样,当选择“生成”(Generation)时,智能体调用自定义的memory_reasoning_thread函数执行完整的记忆智能体工作流:
if active_instruct == "Generation" and continue_functions == True:
from cot_messages_c6 import (
system_message_s1, generation, imcontent4, imcontent4b)
reasoning_steps = reason.memory_reasoning_thread(
user_message, system_message_s1,
generation, imcontent4, imcontent4b
)
aug_output = reasoning_steps
continue_functions = False
通过这些简单的集成,GenAISys界面现在透明地提供了强大的推理能力。
泛化GenAISys能力
借助增强的界面,用户可以轻松将记忆智能体推理应用于酒店评论以外的多样内容。我们用用户关于一次航班的通用评论来展示这种灵活性。用户仅需选择“分析”(Analysis),然后提交航班评论,无需额外指令:
用户01:
“从东京飞往檀香山的航班总体不错,但餐食很糟糕!”
GenAISys立刻返回详细的分段记忆分析:
智能体:
片段1:“从东京飞往檀香山的航班总体不错”
- 记忆标签:[现实记忆,时间记忆-过去]
- 维度:情感
- 情感评分:0.7
- 解释:该片段叙述了一个真实的过去经历(航班),并表达了积极的情感评价(“不错”)。由于指涉已完成的事件,归类为现实记忆和过去时间记忆……
随后用户再次输入该句,但这次选择“生成”(Generation)并勾选“文件”选项,以便生成的图像与文本一起展示。用户只需选择选项、输入文本并提交。整个体验无缝衔接,无需额外指令,且响应完整:包含完整分析、处理和最终客户消息,正如我们前节设计的——从记忆分析、情感评分、内容生成到定制客户消息和引人注目的图片(见图6.8),只要界面中勾选了“文件”选项,图片便会显示:
流程:执行记忆与情感分析。
记忆分析结果:片段1:“从东京飞往檀香山的航班总体不错,但餐食很糟糕!”
- 记忆标签:[现实记忆,情节记忆,时间记忆-过去]
- 维度:情感
- 情感评分:0.4
- 解释:该片段叙述了一个具体的过去旅行事件(两地间航班),包含个人体验和主观评价(总体对航班满意,对餐食极度不满)。使用了体验细节和判断,说明该体验被编码为真实、情节化、带有情感重点的过去记忆,整体情感略偏负面。
……
尊敬的客户,
体验从东京飞往檀香山的宁静航程,同时享用由著名厨师松久信幸启发的美味佳肴。纵享丰富多彩的菜肴,提升您的旅途体验。
此致敬礼,
从用户的角度来看,我们的GenAISys运行得非常顺畅。我们给用户一种生成式AI一切都很简单的错觉。当然,在真实项目中,我们需要投入资源,尝试各种文本类型,发现限制,解决问题,以覆盖边缘案例并优化输出。现在,让我们总结本章的内容,并将GenAISys推向一个新的高度。
总结
本章将我们的GenAISys远远超越了传统AI,进入了元认知、自我反思推理的领域。我们定义了一个务实的记忆模型,结合了主要类别(短期、长期、现实、虚构和时间)以及语义和情节标签,并在此基础上叠加了智力、情感和物理维度。基于该框架,我们构建了一个六步链式推理(CoT)智能体,解码每个评论片段,标注记忆类别,量化情感,并生成整体认知评分。根据认知画像和情感评分,智能体生成个性化推广文本,并创建对应的DALL·E图像,最终整合为一条精致的客户消息。
新增的下拉组件让用户可以选择“无”、“分析”或“生成”,使复杂的推理任务变成一键体验。后台,AI智能体根据选择将请求路由到独立的记忆分析功能或完整的消费者记忆工作流。我们还演示了该智能体对航班评论的分析、评分和响应,展示了GenAISys如何从酒店服务扩展到更广泛的客户服务场景。
凭借这些进展,GenAISys已准备好支持实时、生产级的决策。下一章将聚焦于扩展GenAISys架构功能,以实现即时、高吞吐的AI操作。