Type something to search...
使用 CrewAI 为 NPC 注入生命--初步对话分析

使用 CrewAI 为 NPC 注入生命--初步对话分析

对话分析使用输出来自:使用代理通过 CrewAI 为 NPC 赋予生命

分析

  • 模拟1:软件工程师、计算机科学家、计算机工程师的群体
  • 结论
  • 支持

分析方法

  • 提取的特征
  • 拆分 global_conversations.txt
  • 情感、主题、词汇多样性、情绪
  • 自相似性
  • 笔记本

背景

之前我在我的文章 使用代理为NPC注入生命使用CrewAI为NPC注入生命 中讨论了我为什么对模拟二维社会感兴趣。让我们分析一下使用对话派对模拟器进行的简短对话。请注意,这是在任何NPC与世界交互的开发之前。

软件工程师、计算机科学家、计算机工程师的人口

我们添加了在相关研究领域有背景的NPC。他们的初始任务应该使他们能够轻松地相互讨论。

NPCs

模拟中的非可玩角色

Carly Cummings — 计算机科学家,初始任务:应用位运算

Katherine Jones — 计算机工程师,初始任务:创建半加器

Ashley Brown — 电气工程师,初始任务:应用布尔逻辑

结论

  • 三个 NPC 始终围绕主题,或者更具体地说,他们很少偏离起始话题。
  • 在特定的对话中,词汇使用的范围令人印象深刻地多样化;然而,在回答中可以看到讨论的回响,这在比较文本之间的相似性时显而易见。
  • 主题分析揭示了两个对话。需要注意的是,这可能是因为 2 个人没有互动。双向对话的组合是:Carly<->Katherine, Carly<-Ashley

支持

文本

对话文本可以在本笔记本的开头找到

情感分析:

记住:-1 是负面,0 是中性,+1 是正面

从分析的对话中,我们可以看到一些非常中性和相对积极的对话发生。

主题

识别出两个主题分组:

主题 0 包括:‘查询’,‘缓存’,‘查询’,‘优化’,‘数据库’,‘高效’,‘策略’,‘性能’,‘检索’,‘数据’

主题 1 包括:‘增强’,‘像’,‘算法’,‘数据’,‘高效’,‘布尔’,‘操作’,‘设计’,‘cpu’,‘逻辑’]

词汇多样性

请记住:这是单词集合与所有单词的比率。换句话说,随着词汇多样性接近1(最大独特性),更多的单词是独特的;而随着词汇多样性接近0(最小独特性),更多的单词被重复使用。

我们可以从这个图表中看到每次对话中单词使用的中到高独特性。

情感识别

使用 Hugging Face Transformers 进行情感识别:emotion_pipeline = pipeline(‘sentiment-analysis’, model=’bhadresh-savani/distilbert-base-uncased-emotion’)

在交流中识别出的情感是惊讶和快乐。

语义相似性

记住:1 表示完全相似,而 -1 表示完全不相似

显然,谈话保持在相似的话题上;例如,我们最不相似的余弦相似度约为 0.8,这相当相似。

分析方法

提取的特征

  1. 情感分析:使用 TextBlob 进行快速极性评估
  2. 主题建模:使用 LDA 识别主题;确保进行数据预处理以获得更好的结果(例如,去除停用词、词形还原)。
  3. 词汇多样性:简单的类型-标记比率。
  4. 情感识别:使用 Hugging Face 上的基于 BERT 的模型识别超越简单情感的情感。
  5. 语义相似性:利用 BERT 进行嵌入相似性的基本示例,指示对话轮次之间的上下文对齐。

分割 global_conversations.txt

我们有一个关于谁在和谁说话的模式,因此我们在这些向量上进行分割;忽略说话者和听众

import re
def split_conversation(raw_conversation):
  
  # 我们的对话大致是 "<person talking> (talking to <person>):..." 
  # 让我们在这个基础上进行分割 
  lines = re.split(r'^.*?\(talking to.*?\)\:', raw_conversation, flags=re.MULTILINE)
 
  
  # 移除空行以及每行的前后空白
  return [line.strip() for line in lines if line.strip()]

情感主题与情绪

import nltk
nltk.download('punkt_tab')
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('vader_lexicon')
import gensim
import numpy as np
import pandas as pd
from textblob import TextBlob
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
from nltk.corpus import stopwords
import transformers
from transformers import pipeline, BertTokenizer, BertModel
from gensim import corpora, models
from collections import Counter
import networkx as nx

def sentiment_analysis(conversations):
    sentiments = []
    for conversation in conversations:
        blob = TextBlob(conversation)
        sentiments.append(blob.sentiment.polarity)
    return sentiments

def topic_modeling(conversations, num_topics=2):
    cv = CountVectorizer(stop_words='english')
    dtm = cv.fit_transform(conversations)
    lda = LatentDirichletAllocation(n_components=num_topics, random_state=0)
    lda.fit(dtm)
    topic_results = lda.transform(dtm)
    topic_words = {}
    for i, topic in enumerate(lda.components_):
        topic_words[f"Topic {i}"] = [cv.get_feature_names_out()[j] 
                                     for j in topic.argsort()[-10:]]
    return topic_words

def lexical_diversity(conversations):
    diversities = []
    for conversation in conversations:
        words = nltk.word_tokenize(conversation)
        diversity = len(set(words)) / len(words) #"set of words"/"num words"
        diversities.append(diversity)
    return diversities

## 使用Hugging Face Transformers进行情感识别
emotion_pipeline = pipeline('sentiment-analysis', 
                            model='bhadresh-savani/distilbert-base-uncased-emotion')

def detect_emotions(conversation_texts):
    return emotion_pipeline(conversation_texts)

sentiments = sentiment_analysis(conversations)
topics = topic_modeling(conversations)
diversities = lexical_diversity(conversations)
emotions = detect_emotions(conversations)

print(f'Sentiments: {sentiments}')
print(f'Topics: {topics}')
print(f'Lexical Diversities: {diversities}')
print(f'Emotions: {emotions}')

自相似性

我们使用 Hugging Face transformers 初始化一个 BERT tokenizer 和模型,这些模型是在“bert-base-uncased”语料库上进行预训练的,用于计算给定文本列表之间的语义相似性。get_embeddings() 函数对句子进行分词,使用 BERT 生成其嵌入,并对向量进行平均以生成单个嵌入。calculate_cosine_similarity() 函数计算两个嵌入向量之间的余弦相似度,量化它们的语义相似性。semantic_similarity() 函数处理所有对话,获取它们的嵌入,并用成对的余弦相似度填充矩阵。在填充矩阵时,务必将自相似比较设置为 1.0。该矩阵是热图的基础,其中黄色表示更相似,蓝色表示不太相似。

from transformers import BertTokenizer, BertModel
import torch
import numpy as np
import matplotlib.pyplot as plt

## init BERT tokenizer and model
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

def get_embeddings(sentence):
    inputs = tokenizer(sentence, return_tensors='pt', truncation=True, padding=True)
    with torch.no_grad():
        outputs = model(**inputs)
    return outputs.last_hidden_state.mean(dim=1).squeeze()

def calculate_cosine_similarity(embed1, embed2):
    cos_sim = np.dot(embed1, embed2) / (np.linalg.norm(embed1) * np.linalg.norm(embed2))
    return cos_sim

def semantic_similarity(conversations):
    embeddings = [get_embeddings(conversation).numpy() for conversation in conversations]
    similarities = np.zeros((len(conversations), len(conversations)))

    for i in range(len(conversations)):
        for j in range(len(conversations)):
            if i != j:
                similarities[i][j] = calculate_cosine_similarity(embeddings[i], embeddings[j])
            else:
                similarities[i][j] = 1.0  # Similarity of a sentence with itself

    return similarities

## calculate semantic similarities for the entire conversation set
similarities = semantic_similarity(conversations)

## semantic similarity as a heatmap
plt.figure(figsize=(8, 6))
plt.imshow(similarities, cmap='viridis', interpolation='nearest')
plt.colorbar(label='Cosine Similarity')
plt.xticks(ticks=range(len(conversations)), labels=[f"Conv-{i+1}" for i in range(len(conversations))], rotation=45)
plt.yticks(ticks=range(len(conversations)), labels=[f"Conv-{i+1}" for i in range(len(conversations))])
plt.title('Semantic Similarity Heatmap Among Conversations')
plt.xlabel('Conversation Index')
plt.ylabel('Conversation Index')
plt.show()

笔记

如果您觉得这篇文章很有启发性,请考虑为这篇文章点赞——这不仅支持作者,还帮助其他人发现有价值的见解。此外,不要忘记订阅更多深入探讨创新技术和人工智能发展的文章。非常感谢您的参与!

Related Posts

使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
10 个强大的 Perplexity AI 提示,让您的营销任务自动化

10 个强大的 Perplexity AI 提示,让您的营销任务自动化

在当今快速变化的数字世界中,营销人员总是在寻找更智能的方法来简化他们的工作。想象一下,有一个个人助理可以为您创建受众档案,建议营销策略,甚至为您撰写广告文案。这听起来像是一个梦想? 多亏了像 Perplexity 这样的 AI 工具,这个梦想现在成为现实。通过正确的提示,您可以将 AI 转变为您的 个人营销助理。在本文中,我将分享 10 个强大的提示,帮助您自动

阅读更多
10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

人工智能技术,如机器学习、自然语言处理和数据分析,正在重新定义传统设计方法。从自动化重复任务到实现个性化用户体验,人工智能使设计师能够更加专注于战略思维和创造力。随着这一趋势的不断增长,UI/UX 设计师越来越多地采用 AI 驱动的工具来促进他们的工作。利用人工智能不仅能提供基于数据的洞察,还为满足多样化用户需求的创新设计解决方案开辟了机会。 1. 用户角色开发 目的

阅读更多
在几分钟内完成数月工作的 100 种人工智能工具

在几分钟内完成数月工作的 100 种人工智能工具

人工智能(AI)的快速发展改变了企业的运作方式,使人们能够在短短几分钟内完成曾经需要几周或几个月的任务。从内容创作到网站设计,AI工具帮助专业人士节省时间,提高生产力,专注于创造力。以下是按功能分类的100个AI工具的全面列表,以及它们在现实世界中的使用实例。 1. 研究工具 研究可能耗时,但人工智能工具使查找、分析和组织数据变得更加容易。**ChatGPT, Cop

阅读更多
你从未知道的 17 个令人惊叹的 GitHub 仓库

你从未知道的 17 个令人惊叹的 GitHub 仓库

Github 隐藏的宝石!! 立即收藏的代码库 学习编程相对简单,但掌握编写更好代码的艺术要困难得多。GitHub 是开发者的宝藏,那里“金子”是其他人分享的精心编写的代码。通过探索 GitHub,您可以发现如何编写更清晰的代码,理解高质量代码的样子,并学习成为更熟练开发者的基本步骤。 1. notwaldorf/emoji-translate *谁需

阅读更多