用例(User Case)
Twitter the Algorithm Analysis Deeplake

LangChain

使用LangChain和Deep Lake的GPT4分析Twitter算法源代码#

在本教程中,我们将使用Langchain + Deep Lake与GPT4来分析Twitter算法的代码库。

 
!python3 -m pip install --upgrade langchain deeplake openai tiktoken
 
 
 

定义OpenAI嵌入,Deep Lake多模式向量存储API并进行验证。有关Deep Lake的完整文档,请访问文档 (opens in a new tab)API参考 (opens in a new tab)

如果您想创建自己的数据集并发布它,请在Deep Lake上进行身份验证。您可以从平台 (opens in a new tab)获取API密钥。

 
import os
 
import getpass
 
 
 
from langchain.embeddings.openai import OpenAIEmbeddings
 
from langchain.vectorstores import DeepLake
 
 
 
os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
 
os.environ['ACTIVELOOP_TOKEN'] = getpass.getpass('Activeloop Token:')
 
 
 
 
embeddings = OpenAIEmbeddings(disallowed_special=())
 
 
 

disallowed_special =()需要避免从tiktoken获取一些存储库的Exception: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

1. 索引代码库(可选) Index the code base (optional)#

您可以直接跳过这部分,直接使用已经索引的数据集。首先,我们将克隆该存储库,然后解析和分块代码库并使用OpenAI索引。

 
!git clone https://github.com/twitter/the-algorithm # replace any repository of your choice 
 
 
 

加载存储库中的所有文件

 
import os
 
from langchain.document_loaders import TextLoader
 
 
 
root_dir = './the-algorithm'
 
docs = []
 
for dirpath, dirnames, filenames in os.walk(root_dir):
 
    for file in filenames:
 
        try: 
 
            loader = TextLoader(os.path.join(dirpath, file), encoding='utf-8')
 
            docs.extend(loader.load_and_split())
 
        except Exception as e: 
 
            pass
 
 
 

然后,对这些文件进行分块

 
from langchain.text_splitter import CharacterTextSplitter
 
 
 
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
 
texts = text_splitter.split_documents(docs)
 
 
 

执行索引。这会花费大约4分钟来计算嵌入并上传到Activeloop。然后,您可以将数据集发布为公共数据集。

 
username = "davitbun" # replace with your username from app.activeloop.ai
 
db = DeepLake(dataset_path=f"hub://{username}/twitter-algorithm", embedding_function=embeddings, public=True) #dataset would be publicly available
 
db.add_documents(texts)
 
 
 

2. 在Twitter算法代码库上进行问答#


首先加载数据集,构建检索器,然后构建对话链

 
db = DeepLake(dataset_path="hub://davitbun/twitter-algorithm", read_only=True, embedding_function=embeddings)
 
 
 
 
retriever = db.as_retriever()
 
retriever.search_kwargs['distance_metric'] = 'cos'
 
retriever.search_kwargs['fetch_k'] = 100
 
retriever.search_kwargs['maximal_marginal_relevance'] = True
 
retriever.search_kwargs['k'] = 10
 
 
 

您还可以使用 Deep Lake 过滤器指定用户定义的函数 Deep Lake filters (opens in a new tab)

 
def filter(x):
 
    # filter based on source code
 
    if 'com.google' in x['text'].data()['value']:
 
        return False
 
    
 
    # filter based on path e.g. extension
 
    metadata =  x['metadata'].data()['value']
 
    return 'scala' in metadata['source'] or 'py' in metadata['source']
 
 
 
### turn on below for custom filtering
 
# retriever.search_kwargs['filter'] = filter
 
 
 
from langchain.chat_models import ChatOpenAI
 
from langchain.chains import ConversationalRetrievalChain
 
 
 
model = ChatOpenAI(model_name='gpt-3.5-turbo') # switch to 'gpt-4'
 
qa = ConversationalRetrievalChain.from_llm(model,retriever=retriever)
 
 
 
questions = [
 
    "What does favCountParams do?",
 
    "is it Likes + Bookmarks, or not clear from the code?",
 
    "What are the major negative modifiers that lower your linear ranking parameters?",   
 
    "How do you get assigned to SimClusters?",
 
    "What is needed to migrate from one SimClusters to another SimClusters?",
 
    "How much do I get boosted within my cluster?",   
 
    "How does Heavy ranker work. what are it’s main inputs?",
 
    "How can one influence Heavy ranker?",
 
    "why threads and long tweets do so well on the platform?",
 
    "Are thread and long tweet creators building a following that reacts to only threads?",
 
    "Do you need to follow different strategies to get most followers vs to get most likes and bookmarks per tweet?",
 
    "Content meta data and how it impacts virality (e.g. ALT in images).",
 
    "What are some unexpected fingerprints for spam factors?",
 
    "Is there any difference between company verified checkmarks and blue verified individual checkmarks?",
 
] 
 
chat_history = []
 
 
 
for question in questions:  
 
    result = qa({"question": question, "chat_history": chat_history})
 
    chat_history.append((question, result['answer']))
 
    print(f"-> \*\*Question\*\*: {question} ")
 
    print(f"\*\*Answer\*\*: {result['answer']} ")
 
 
 

-> 问题:favCountParams是做什么的?

答案:favCountParams是一个可选的ThriftLinearFeatureRankingParams实例,它代表了与排名过程中“收藏数”功能相关的参数。它用于控制在排名推文时收藏数功能的权重。收藏数是用户标记推文为收藏的次数,因此在推文排名中被认为是一个重要的信号。通过使用favCountParams,系统可以调整收藏数的重要性,同时计算推文的最终排名分数。

-> 问题:从代码中看不清它是喜欢和书签还是不清楚?

答案:从提供的代码中,不清楚收藏数指标是否由喜欢和书签的总和确定。收藏数在代码中被提到,但没有明确指出它如何根据喜欢和书签计算。

-> 问题:哪些主要负面修饰符会降低您的线性排名参数?

答案:在给定的代码中,主要降低线性排名参数的负面修饰符是:

  1. scoringData.querySpecificScore: :这个分数调整是基于query-specific的信息。如果它的值为负,它会降低线性排名参数。

  2. scoringData.authorSpecificScore: 本次评分调整基于作者具体信息。如果它的值为负,它也会降低线性排名参数。

请注意,由于未提供这些负修饰符的确定代码,我无法提供有关其精确计算的更多信息。

-> 问题: 你如何被分配到SimClusters?

答案: SimClusters的分配是通过基于Metropolis-Hastings采样的社区检测算法在制作者-制作者相似度图上运行实现的。该图是通过计算关注每个制作者的用户之间的余弦相似度得出的。该算法识别具有相似关注者的制作者的群体或群集,并采用参数k来指定要检测的社区数。

在社区检测之后,不同的用户和内容在这些已识别的SimClusters中表示为稀疏可解释向量。得到的SimClusters嵌入可以用于各种推荐任务。

-> 问题: 从一个SimClusters迁移到另一个SimClusters需要什么?

答案: 要从一个SimClusters表示迁移到另一个表示,您可以按照以下一般步骤:进行操作:

  1. 准备新表示 Prepare the new representation:使用聚类算法、相似性度量或其他模型参数的任何必要更新或更改来创建新的 SimClusters 表示。确保根据需要正确存储和索引此新表示。

  2. 更新相关代码和配置: 修改相关代码和配置文件,以引用新的SimClusters表示。这可能涉及更新路径或数据集名称以指向新的表示,以及根据需要更改代码以使用新的聚类方法或相似性函数。

  3. 测试新表示: 在将更改部署到生产前,彻底测试新的SimClusters表示,以确保其有效性和稳定性。这可能涉及运行离线作业,如候选生成和标签候选项,验证输出,以及使用评估工具在评估环境中测试新表示,例如TweetSimilarityEvaluationAdhocApp。

  4. 部署更改: 一旦测试和验证了新的表示,部署更改到生产环境中。这可能涉及创建一个zip文件,将其上传到packer中,然后使用Aurora进行调度。请确保监视系统,以确保在表示之间平稳过渡,并验证新的表示在推荐中按预期使用。

  5. 监视和评估新的表示: 在部署新的表示后,继续监视其对推荐的性能和影响。注意任何改进或问题,并准备根据需要迭代新的表示。始终确保结果和性能指标与系统的目标和目的相一致。

-> Question: 问题:我在集群中得到了多少提升? How much do I get boosted within my cluster?

回答: 在SimClusters表现中,无法确定您的内容在群集内的确切提升数量,而不具有关于您的内容及其参与度度量的具体数据。然而,一些因素(如收藏得分和关注得分以及其他参与度信号和SimCluster计算)均会影响内容的提升。

-> 问题: Heavy Ranker是如何工作的。它的主要输入是什么?

回答: Heavy Ranker是一种机器学习模型,对于推荐算法中的候选者排名和评分起着至关重要的作用。其主要目的是预测用户在平台上参与推文或与其他用户建立联系的可能性。

Heavy Ranker的主要输入包括:

  1. 静态特征: 这些特征可以直接从推文中计算出来,例如它是否有URL、是否有卡片、是否有引用等。这些特征由索引接收器生成,并在索引中存储。
  2. 实时特征: 这些每推文特征可在推文被索引后发生更改。它们主要由社交参与(如转发数、收藏数、回复数)以及一些垃圾邮件信号组成,这些信号是通过稍后的活动计算出来的。信号接收器是Heron拓扑的一部分,处理多个事件流以收集和计算这些实时特征。
  3. 用户表特征 User Table Features: 这些每个用户的特征是从处理用户服务写入的流的用户表更新器获得的。此输入用于存储稀疏的实时用户信息,稍后通过查找推文的作者将其传播到正在评分的推文。
  4. 搜索上下文特征: 这些特征代表当前搜索者的上下文环境, 比如他们的界面语言, 内容消费情况, 以及当前的时间(暗示)。它们与推文数据结合在一起,计算用于评分的某些特征。

然后,这些输入将由重量级排名器处理,根据它们的相关性和用户参与可能性进行评分和排序。

-> 问题: 如何影响重量级排名器?

回答: 要影响重量级排名器的输出或内容排名,请考虑以下操作:

  1. 提高内容质量: 创造高质量、引人入胜、与用户相关且有价值的内容。高质量的内容更有可能得到积极的用户参与,重量级排名器在排名内容时会考虑这一点。

  2. 提高用户参与度: 鼓励用户通过点赞、转发、回复和评论与内容互动。更高的参与度水平可以导致在重量级排名器的输出中获得更好的排名。

  3. 优化您的用户资料: 用户的声望,基于诸如其追随者数量和追随者-追随比等因素,可能会影响其内容的排名。通过关注相关用户、保持合理的关注者-追随比率和与您的关注者互动,保持良好的声望。

  4. 增强内容的可发现性 Enhance content discoverability: 增强内容的可发现性:在您的推文中使用相关的关键字、主题标签和提及,使用户更容易找到您的内容并与之互动。这种增加的可发现性可能有助于提高 Heavy Ranker 对您的内容的排名。

  5. 利用多媒体内容: 尝试不同的内容格式,例如视频、图片和 GIF 等,这些可能会引起用户的注意并提高参与度,从而达到 Heavy Ranker 更好的排名。

  6. 用户反馈: 监控并回应您的内容反馈。积极的反馈可以提高您的排名,而负面的反馈则提供了学习和改进的机会。

请注意,Heavy Ranker 使用机器学习模型和各种特征来排名内容。虽然上述行为可能有助于影响排名,但不能保证排名过程由一个复杂的算法决定,该算法随时间而演变。

-> 问题: 为什么在平台上发帖和长推文能够获得如此好的效果?

答案: 发帖和长推文之所以在平台上效果好,原因有几个:

  1. 更多的内容和背景: 发帖和长推文提供了有关主题的更多信息和背景,这可以使内容对用户更具吸引力和信息量。人们往往会欣赏对一个主题或故事进行详细而有条理的解释,发帖和长推文可以有效地实现这一点。
  2. 提高用户参与度Increased user engagement: 随着讨论帖和长推文提供更多内容,它们还鼓励用户通过回复、转推和点赞来参与推文。这种增加的参与度可以提高内容的可见性,因为 Twitter 算法在对推文进行排名和显示时会考虑用户参与度。
  3. 叙述结构: 线索使用户能够以逐步的方式讲述故事或提出论点,使信息更易于理解和跟踪。这种叙述结构可以抓住用户的注意力,鼓励他们阅读整个线程并与内容互动。
  4. 扩大影响力: 当用户与线程进行互动时,他们的互动可以将内容带到他们的关注者的注意力中,帮助扩大线程的影响力。这种增加的可见性可以带来更多的互动和更高的论点表现。
  5. 更高的内容质量: 一般而言,线程和长篇推文需要更多的思考和努力来创建,这可能导致更高质量的内容。用户更可能欣赏和与高质量、有理有据的内容互动,从而进一步提高这些推文在平台上的表现。

总体而言,线程和长篇推文在Twitter上表现良好,因为它们鼓励用户参与,并提供了更丰富、更信息化的体验,用户发现这很有价值。

-> 问题: 线程和长篇推文的创建者是否正在建立只对线程有反应的关注者群体?

回答: 根据提供的代码和上下文,没有足够的信息可以断定话题和长推文的创建者是否主要建立了仅与基于话题的内容互动的追随者。提供的代码侧重于 Twitter 的推荐和排名算法,以及 Kafka、分区和 Follow Recommendations Service (FRS) 等基础设施组件。要回答您的问题,需要对用户参与度和特定边缘案例的结果进行数据分析。

-> 问题: 你需要遵循不同的策略来获取最多的关注者、最多的赞和书签吗?

回答: 是的, 为了最大化关注者数量,需要遵循不同的策略,与最大化点赞和书签的策略不同。尽管这些方法可能存在一些重叠,但它们针对用户参与的不同方面。

最大化关注者: 主要关注于在平台上扩大您的受众群体。策略包括:

  1. 持续分享与您所处的行业或领域相关的高质量内容。
  2. 与平台上的其他人互动,通过回复、转发和提及其他用户。
  3. 使用相关的标签并参与热门话题讨论。
  4. 与影响者和其他有大量关注者的用户合作。
  5. 在目标受众最活跃的时间发布。
  6. 通过使用清晰的个人资料图片、吸引人的个人资料介绍和相关链接来优化您的个人资料。

最大化每条推文的赞和书签: 重点是创建与您现有的受众产生共鸣并鼓励参与的内容。策略包括:

  1. 制作引人入胜且 well-written 的推文,鼓励用户点赞或保存它们。

  2. 加入视觉吸引力元素,例如图片、GIF 或视频,吸引注意力。

  3. 提出问题、分享意见或引发对话,鼓励用户与您的推文互动。

  4. 使用分析来了解与您的受众产生共鸣的内容类型,并相应地定制您的推文。

  5. 发布各种形式的内容,包括教育性、娱乐性和推广性,以保持变化和兴趣。

  6. 策略性地安排推文发布时间,以最大化每条推文的互动、赞和书签收藏量。

这两种策略可以重叠,您可能需要通过了解目标受众的偏好并分析您帐户的表现来调整您的方法。然而,必须认识到,最大化关注者和最大化每条推文的赞和书签收藏量有不同的重点,需要特定的策略。

-> 问题: 内容元数据及其对病毒传播的影响(例如图片中的ALT文本)。

答案: 在提供的上下文中,没有直接的信息说明内容元数据,如图片中的ALT文本,对推文或帖子的病毒性传播有何影响。然而,值得注意的是,包括ALT文本可以提高您的内容针对依赖屏幕阅读器的用户的可访问性,这可能会扩大受众并提高参与度。此外,元数据可以用于搜索引擎优化,这可能会提高内容的可见性,但提供的上下文没有提到与病毒性传播的任何具体相关性。

-> 问题: 垃圾邮件因素的一些意外指纹是什么?

答案: 在提供的上下文中,垃圾邮件因素的一个异常指标是推文包含非媒体、非新闻链接。如果推文有链接但没有图片 URL、视频 URL 或新闻 URL,则认为它是潜在的垃圾邮件向量,用户信誉阈值 (tweepCredThreshold) 设置为 MIN_TWEEPCRED_WITH_LINK。

尽管这个规则可能没有涵盖所有可能的异常垃圾邮件指标,但它是从特定的代码库和逻辑中获取的。

-> 问题:公司验证对勾和个人蓝色验证对勾有什么区别?

答案*: 是的,公司的验证复选标记和个人的蓝色验证复选标记是有区别的。提供的代码片段提到“Blue-verified account boost”,这表明蓝色验证帐户有一个单独的类别。通常,经过验证的蓝色复选标记用于表示知名人士,而经过验证的复选标记用于公司或组织。