使用LangChain、GPT4和Activeloop的Deep Lake对Twitter算法源代码进行分析
在本教程中,我们将使用Langchain + Activeloop的Deep Lake和GPT4来分析Twitter算法的代码库。
python3 -m pip install --upgrade langchain 'deeplake[enterprise]' openai tiktoken
定义OpenAI嵌入、Deep Lake多模态向量存储API并进行身份验证。有关Deep Lake的完整文档,请参阅文档和API参考。
如果您想创建自己的数据集并发布它,请在Deep Lake中进行身份验证。您可以从平台获取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:")
activeloop_token = getpass.getpass("Activeloop Token:")
os.environ["ACTIVELOOP_TOKEN"] = activeloop_token
API参考:
- OpenAIEmbeddings 来自
langchain.embeddings.openai
- DeepLake 来自
langchain.vectorstores
embeddings = OpenAIEmbeddings(disallowed_special=())
disallowed_special=() 是为了避免一些存储库在tiktoken中出现Exception: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
的问题。
1. 索引代码库(可选)
您可以直接跳过此部分,直接开始使用已经索引的数据集。首先,我们将克隆存储库,然后解析和分块代码库,并使用OpenAI索引。
git clone https://github.com/twitter/the-algorithm # 替换为您选择的任何存储库
加载存储库中的所有文件
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
API参考:
- TextLoader 来自
langchain.document_loaders
然后,对文件进行分块
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(docs)
API参考:
- CharacterTextSplitter 来自
langchain.text_splitter
执行索引。这将花费约4分钟来计算嵌入并上传到Activeloop。然后,您可以将数据集发布为公开。
username = "davitbun" # 替换为您在app.activeloop.ai中的用户名
db = DeepLake(
dataset_path=f"hub://{username}/twitter-algorithm",
embedding_function=embeddings,
)
db.add_documents(texts)
可选
:您还可以使用Deep Lake的托管张量数据库作为托管服务并在那里运行查询。为此,在创建向量存储时,需要将运行时参数指定为{'tensor_db': True}。此配置使得可以在托管张量数据库上执行查询,而不是在客户端上执行。需要注意的是,此功能不适用于本地或内存中存储的数据集。如果已经在托管张量数据库之外创建了向量存储,则可以按照规定的步骤将其转移到托管张量数据库中。
# username = "davitbun" # 替换为您在app.activeloop.ai中的用户名
# db = DeepLake(
# dataset_path=f"hub://{username}/twitter-algorithm",
# embedding_function=embeddings,
# runtime={"tensor_db": True}
# )
# db.add_documents(texts)
2. 在Twitter算法代码库上进行问答
首先加载数据集,构建检索器,然后构建对话链
db = DeepLake(
dataset_path="hub://davitbun/twitter-algorithm",
read_only=True,
embedding_function=embeddings,
)
Deep Lake 数据集在 hub://davitbun/twitter-algorithm 中已存在,从存储中加载
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 filters指定用户定义的函数
def filter(x):
# 基于源代码进行过滤
if "com.google" in x["text"].data()["value"]:
return False
# 基于路径进行过滤,例如扩展名
metadata = x["metadata"].data()["value"]
return "scala" in metadata["source"] or "py" in metadata["source"]
### 打开以下内容以进行自定义过滤
# retriever.search_kwargs['filter'] = filter
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
model = ChatOpenAI(model_name="gpt-3.5-turbo") # 切换到 'gpt-4'
qa = ConversationalRetrievalChain.from_llm(model, retriever=retriever)
API 参考:
- ChatOpenAI 来自
langchain.chat_models
- ConversationalRetrievalChain 来自
langchain.chains
questions = [
"favCountParams 是做什么的?",
"代码中是否是 Likes + Bookmarks,或者从代码中无法确定?",
"降低线性排名参数的主要负面修饰因素有哪些?",
"如何被分配到 SimClusters?",
"从一个 SimClusters 迁移到另一个 SimClusters 需要什么?",
"在我的群集中,我会得到多大的提升?",
"Heavy ranker 是如何工作的?它的主要输入是什么?",
"如何影响 Heavy ranker?",
"为什么平台上的线程和长推文表现得如此好?",
"线程和长推文的创建者是否正在建立只回应线程的追随者?",
"为了获得最多的关注者和获得每条推文最多的赞和收藏,是否需要采用不同的策略?",
"内容元数据以及它对传播的影响(例如图像中的 ALT)。",
"一些意外的垃圾邮件因素的指纹是什么?",
"公司验证的勾号和个人验证的蓝色勾号之间有什么区别?",
]
chat_history = []
for question in questions:
result = qa({"question": question, "chat_history": chat_history})
chat_history.append((question, result["answer"]))
print(f"-> **问题**:{question} \n")
print(f"**回答**:{result['answer']} \n")
-> 问题:favCountParams 是做什么的?
回答:favCountParams
是一个可选的 ThriftLinearFeatureRankingParams 实例,表示与排名过程中的“收藏数”特征相关的参数。它用于在排名推文时控制收藏数特征的权重。收藏数是用户将推文标记为收藏的次数,它被认为是推文排名中的重要信号。通过使用 favCountParams
,系统可以在计算推文的最终排名分数时调整收藏数的重要性。
-> 问题:代码中是否是 Likes + Bookmarks,或者从代码中无法确定?
回答:从提供的代码中,无法确定收藏数指标是否由赞和收藏的总和确定。代码中提到了收藏数,但没有明确说明它如何根据赞和收藏来计算。
-> 问题:降低线性排名参数的主要负面修饰因素有哪些?
回答:在给定的代码中,降低线性排名参数的主要负面修饰因素包括:
scoringData.querySpecificScore
:该分数调整基于查询特定的信息。如果其值为负数,它将降低线性排名参数。scoringData.authorSpecificScore
:该分数调整基于作者特定的信息。如果其值为负数,它也会降低线性排名参数。
请注意,由于没有提供确定这些负面修饰因素的精确计算的代码,我无法提供更多关于它们的详细信息。
-> 问题:如何被分配到 SimClusters?
回答:通过基于 Metropolis-Hastings 采样的基于社区检测算法在 Producer-Producer 相似性图上进行分配到 SimClusters。该图是通过计算每个生产者的用户之间的余弦相似度得到的。该算法识别具有相似关注者的生产者的社区或群集,并使用参数 k 来指定要检测的社区数量。
在社区检测之后,不同的用户和内容在这些识别出的社区(SimClusters)中被表示为稀疏的、可解释的向量。得到的 SimClusters 嵌入可以用于各种推荐任务。
-> 问题:从一个 SimClusters 迁移到另一个 SimClusters 需要什么?
回答:要从一个 SimClusters 表示迁移到另一个,可以按照以下一般步骤进行:
准备新的表示:使用任何必要的更新或更改聚类算法、相似度度量或其他模型参数创建新的 SimClusters 表示。确保将此新表示适当地存储和索引。
更新相关的代码和配置:修改相关的代码和配置文件,以引用新的 SimClusters 表示。这可能涉及更新路径或数据集名称,以指向新的表示,以及根据需要更改代码以使用新的聚类方法或相似性函数。
测试新的表示:在将更改部署到生产环境之前,彻底测试新的 SimClusters 表示,以确保其有效性和稳定性。这可能涉及运行离线作业,如候选生成和标签候选,验证输出,以及使用 TweetSimilarityEvaluationAdhocApp 在评估环境中测试新的表示。
部署更改:一旦测试和验证了新的表示,将更改部署到生产环境。这可能涉及创建一个压缩文件,将其上传到打包器,并使用 Aurora 进行调度。确保监控系统,以确保在表示之间平稳过渡,并验证新的表示是否按预期用于推荐。
监控和评估新的表示:在部署新的表示后,继续监控其性能和对推荐的影响。注意任何改进或问题,并准备根据需要对新的表示进行迭代。始终确保结果和性能指标与系统的目标一致。
-> 问题:在我的群集中,我会得到多大的提升?
回答:在 SimClusters 表示中,无法确定您的内容在群集内部获得的确切提升量,除非具体数据关于您的内容及其参与度指标。然而,收藏分数、关注分数以及其他参与度信号和 SimCluster 计算的组合会影响内容的提升。
-> 问题:Heavy ranker 是如何工作的?它的主要输入是什么?
回答:Heavy Ranker 是一个机器学习模型,在推荐算法中起着关键作用,用于对候选内容进行排名和评分。它的主要目的是预测用户与推文的互动或与平台上其他用户的连接的可能性。
Heavy Ranker 的主要输入包括:
静态特征:这些特征可以直接从推文中计算得出,例如是否具有 URL、是否具有卡片、是否具有引用等。这些特征由索引摄取器在生成推文并存储在索引中时生成。
实时特征:这些是每条推文的特征,在推文被索引后可能会发生变化。它们主要包括社交参与,如转发数、收藏数、回复数以及一些稍后活动中计算的垃圾邮件信号。Signal Ingester 是 Heron 拓扑的一部分,它处理多个事件流以收集和计算这些实时特征。
用户表特征:这些是从用户服务写入的流中获取的每个用户的特征。此输入用于存储稀疏的实时用户信息,稍后通过查找推文的作者来将其传播到进行评分的推文中。
搜索上下文特征:这些特征表示当前搜索者的上下文,如其 UI 语言、内容消费情况和当前时间(暗示)。它们与推文数据结合起来计算一些用于评分的特征。
这些输入然后由 Heavy Ranker 处理,根据其相关性和用户的互动可能性对候选内容进行评分和排名。
-> 问题:如何影响 Heavy ranker?
回答:要影响 Heavy Ranker 的输出或内容的排名,可以考虑以下操作:
提高内容质量:创建与您的领域或行业相关的高质量、引人入胜的内容。高质量的内容更有可能获得用户的积极参与,而 Heavy Ranker 在排名内容时会考虑这一点。
增加用户参与度:鼓励用户通过点赞、转发、回复和评论与内容互动。更高的参与度水平可以导致在 Heavy Ranker 的输出中获得更好的排名。
优化用户个人资料:用户的声誉,基于其关注者数量和关注者与关注者之比等因素,可能会影响其内容的排名。通过关注相关用户、保持合理的关注者与关注者之比并与关注者互动,保持良好的声誉。
提高内容的可发现性:在推文中使用相关的关键词、标签和提及,使用户更容易找到并与您的内容互动。这种增加的可发现性可能有助于通过 Heavy Ranker 改善您的内容的排名。
利用多媒体内容:尝试不同的内容格式,如视频、图片和 GIF,这些可能会吸引用户的注意力并增加互动,从而在 Heavy Ranker 的排名中获得更好的结果。
用户反馈:监控并回应对您的内容的反馈。积极的反馈可能会改善您的排名,而负面的反馈则提供了学习和改进的机会。
请注意,Heavy Ranker 使用机器学习模型和各种特征来对内容进行排名。虽然上述操作可能有助于影响排名,但由于排名过程由复杂的算法确定且随时间演变,不能保证结果。