使用LangChain、DeepInfra逆向工程Twitter算法

2023年 8月 10日 44.1k 0

作者 | Mike Young

译者 | 李睿

审校 | 重楼

在这个指南中,将对Twitter的推荐算法进行逆向工程,以更好地理解代码库,并提供见解,以制作更好的内容。

想象一下,如果非编程人员能够借助工具编写一个能够理解、协助甚至生成代码的软件该有多好,就像经验丰富的开发人员所做的那样。

这对LangChain来说是可能实现的。利用VectorStores、Conversational RetrieverChain和LLM等高级模型,LangChain可以让非编程人员在代码理解和生成方面达到更高的水平。

在这一指南中,将对Twitter的推荐算法进行逆向工程,以更好地理解代码库,并提供见解,以制作更好的内容。在这里将使用OpenAI公司的嵌入技术和一个名为Activeloop的工具来使代码易于理解,并在DeepInfra上托管一个名为Dolly的LLM来与代码进行对话。

在完成之后,能够通过让人工智能回答最紧迫的问题来减少理解算法所需的困难工作,而不是花几周时间进行筛选。

1、采用LangChain理解代码的概念

LangChain是一个非常有用的工具,可以分析GitHub上的代码库。它汇集了三个重要部分:VectorStores、Conversationa RetrieverChain和LLM,以帮助人们理解代码,在场景中回答有关代码的问题,甚至在GitHub存储库中生成新代码。

Conversational RetrieverChain系统有助于从VectorStore中查找和检索有用的信息。它使用智能技术,例如场景感知过滤和排名,来确定哪些代码片段和信息与用户的特定问题或查询最相关。其与众不同之处在于,它考虑了对话的历史和提问的背景。这意味着它可以为用户提供高质量和相关的结果,专门满足用户的需求。简单地说,这就像有一个智能助手,它能理解问题的场景,并根据场景给出最好的答案。

现在,了解一下LangChain的工作流,看看它是如何在高层次上工作的:

(1)为代码库编制索引

第一步是克隆要分析的目标存储库。加载存储库中的所有文件,将它们分成更小的块,并启动索引过程。如果已经有了索引数据集,可以跳过这一步骤。

(2)嵌入和代码存储

为了使代码片段更容易理解,LangChain采用了代码感知嵌入模型。该模型有助于捕获代码的本质,并将嵌入的代码片段存储在VectorStore中,以便在将来查询时可以随时访问它们。

简而言之,LangChain使用一种称为代码感知嵌入的特殊技术,使代码片段更容易理解。它有一个可以分析代码并捕获其重要特征的模型。然后,它将这些分析过的代码片段存储在VectorStore中,这就像一个易于访问的存储场所。这样,代码片段就被组织起来,可以在将来有查询或问题时进行快速检索。

(3)理解查询

这是LLM发挥作用的地方。可以使用像databricks/dolly-v2-12b这样的模型来处理查询。该模型分析用户的查询,并通过考虑场景和提取重要信息来理解它们的含义。通过这样做,该模型可以帮助LangChain准确地解释其查询,并为用户提供精确且相关的结果。

(4)构建检索器

一旦提出的问题或查询是明确的,Conversational RetrieverChain开始发挥作用。它通过VectorStore这一存储代码片段的地方,找到与用户的查询最相关的代码片段。这个搜索过程非常灵活,可以根据用户的需求进行定制。用户可以调整设置并应用特定于其需要的过滤器,以确保获得最准确和最有用的查询结果。

一旦设置好了检索器,就是建立对话链的时候了。这一步包括调整检索器的设置以更好地满足用户的需求,并应用可能需要的任何其他过滤器。通过这样做,用户可以缩小搜索范围,并确保收到最精确、准确和相关的查询结果。从本质上来说,它允许用户微调检索过程,以获得对其最有用的信息。

(5)提问

用户可以使用Conversational RetrieverChain询问有关代码库的问题。它将为用户生成全面的和场景相关的答案。用户的LLM作为会话链的一部分,考虑到检索的代码片段和会话历史,为用户提供详细和准确的答案。

遵循这一工作流程,用户可以有效地使用LangChain来更深入地了解代码,为其问题获得场景感知的答案,甚至在GitHub存储库中生成代码片段。现在逐步地了解其实际效果。

2、分步指南

以下深入了解实际的实现。

(1)获取密钥

在开始时,必须在各自的网站注册,并获得Activeloop、DeepInfra和OpenAI的API密钥。

(2)设置Indexer.py文件

创建一个Python文件(例如indexer.py)来索引数据。导入必要的模块,并将API密钥设置为环境变量:

Python

import os
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import DeepLake

os.environ['OPENAI_API_KEY'] = 'YOUR KEY HERE'
os.environ['ACTIVELOOP_TOKEN'] = 'YOUR KEY HERE'
embeddings = OpenAIEmbeddings(disallowed_special=())

简单地说,嵌入是文本的表示,它捕获不同文本字符串的含义和相关性。它们是数字向量或数字列表,用于度量不同文本输入之间的相似性或距离。

嵌入通常用于各种任务,例如搜索、聚类、推荐、异常检测、多样性测量和分类。在搜索中,嵌入有助于对搜索结果与查询的相关性进行排序。在聚类中,嵌入将相似的文本字符串分组在一起。

推荐利用嵌入来推荐具有相关文本字符串的项目。异常检测使用嵌入来识别关联度小的异常值。多样性测量包括分析文本字符串之间的相似性分布。分类利用嵌入将文本字符串分配给最相似的标签。

两个嵌入向量之间的距离表示相应文本字符串的相关或相似程度。较小的距离表明亲缘关系高,而较大的距离表明亲缘关系低。

(3)克隆和索引目标存储库

接下来,将克隆Twitter算法存储库,加载、拆分和索引文档。可以从此链接(https://github.com/twitter/the-algorithm)克隆这一算法。

这段代码遍历一个目录及其子目录(os.walk(root_dir))。对于遇到的每个文件(文件名),它尝试执行以下步骤:

Python 
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

  • 它创建一个TextLoader对象,指定当前正在处理的文件的路径(os.path.join(dirpath, file)),并将编码设置为UTF-8。
  • 然后调用TextLoader对象的load_and_split()方法,该方法可能读取文件的内容,执行一些处理或拆分操作并返回结果文本数据。
  • 然后使用extend()方法将获得的文本数据添加到一个名为docs的现有列表中。
  • 如果在这个过程中发生任何异常,则由try-except块捕获并简单地忽略(' pass ')。

这个代码片段递归地遍历一个目录,从文件中加载和分割文本数据,并将结果数据添加到一个名为docs的列表中。

(4)嵌入代码片段

接下来,使用OpenAI嵌入来嵌入代码片段。然后将这些嵌入存储在VectorStore中,这将允许执行有效的相似性搜索:

Python 

from langchain.text_splitter import CharacterTextSplitter

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(docs)
username = "mikelabs" # replace with your username from app.activeloop.ai
db = DeepLake(dataset_path=f"hub://{username}/twitter-algorithm", embedding_functinotallow=embeddings, public=True) #dataset would be publicly available
db.add_documents(texts)print(“done”)

这段代码导入CharacterTextSplitter类,并初始化它的一个实例,其块大小为1000个字符且没有重叠。然后,它使用split_documents方法将提供的文档分成更小的文本块,并将它们存储在文本变量中。

接下来,它设置用户名(用于注册Activeloop!)。它创建了一个名为db的DeepLake实例,该实例的数据集路径指向以指定用户名托管在“app.activeloop.ai”上的公共数据集。embedding_function处理所需的嵌入。

最后,它使用add_documents方法将文本添加到数据库中,可能是为了存储或进一步处理。

运行该文件,然后等待几分钟(它可能会挂起一段时间,通常不超过5分钟)。然后,进入下一步。

(5)使用dolly-v2-12b来处理和理解用户查询

现在设置另一个Python文件question.py,以使用DeepInfra平台中可用的语言模型dolly-v2-12b来处理和理解用户查询。

(6)构建检索器

使用前面创建的VectorStore构建一个检索器。

Python 

db = DeepLake(dataset_path="hub://mikelabs/twitter-algorithm", read_notallow=True, embedding_functinotallow=embeddings) #use your username
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

以下是代码正在执行的操作:

该代码初始化一个名为db的DeepLake对象。它从指定为“hub://mikelabs/twitter-algorithm”的路径读取数据集。值得注意的是,需要将“mikelabs”替换为自己的用户名!

然后使用as_retriver()方法将db对象转换为检索器。这一步骤允许对存储在VectorStore中的数据执行搜索操作。

一些搜索选项可以通过修改检索器自定义多个retriever.search_kwargs字典:

distance _ metric被设置为“cos”,表示余弦相似度将用于测量文本输入之间的相似度。假设有两个向量来表示不同的文本片段,例如句子或文档。余弦相似性是衡量这两段文本的相似程度或相关性的一种方法。

通过观察两个向量之间的夹角来计算余弦相似度。如果向量指向相同的方向或者彼此非常接近,余弦相似度将接近于1。这意味着文本片段彼此非常相似。

另一方面,如果向量指向相反的方向或相距很远,余弦相似度将接近于-1。这表明文本片段非常不同或不相似。余弦相似度为0意味着两个向量彼此垂直或成90度角。在这种情况下,文本片段之间没有相似性。

在上面的代码中,余弦相似度被用作比较文本输入之间相似度的度量。它有助于确定两个文本片段的关联程度。使用余弦相似度,代码可以与给定查询最相似的顶级匹配进行排序和检索。

fetch_k参数设置为100,这意味着检索器将根据余弦相似度检索前100个最接近的匹配项。

maximal_marginal_relevance设置为True,这表明检索器将优先考虑不同的结果,而不是返回高度相似的匹配。

参数k设置为10,表示检索器将为每个查询返回10个结果。

(7)构建会话链

使用Conversational RetrievalChain来连接检索器和语言模型。这使系统能够处理用户查询并生成场景感知的响应:

Python 

model = DeepInfra(model_id="databricks/dolly-v2-12b")
qa = ConversationalRetrievalChain.from_llm(model,retriever=retriever)

Conversational RetrievalChain充当检索器和语言模型之间的连接。该连接允许系统处理用户查询并生成场景感知的响应。

(8)提问

现在可以问关于Twitter算法代码库的问题。Conversational RetrievalChain提供的答案是场景感知的,并且直接基于代码库。

以下是得到的一个样本答案:

Python 

questions = ["What does favCountParams do?", ...]
chat_history = []

for question in questions:  
    result = qa({"question": question, "chat_history": chat_history})
    chat_history.append((question, result['answer']))
    print(f"-> **Question**: {question} \n")
    print(f"**Answer**: {result['answer']} \n")

以下是一些摘自LangChain文档的示例问题:

Python 1 questions = [
2 "What does favCountParams do?",
3 "is it Likes + Bookmarks, or not clear from the code?",
4 "What are the major negative modifiers that lower your linear ranking parameters?",
5 "How do you get assigned to SimClusters?",
6 "What is needed to migrate from one SimClusters to another SimClusters?",
7 "How much do I get boosted within my cluster?",
8 "How does Heavy ranker work. what are it’s main inputs?",
9 "How can one influence Heavy ranker?",
10 "why threads and long tweets do so well on the platform?",
11 "Are thread and long tweet creators building a following that reacts to only threads?",
12 "Do you need to follow different strategies to get most followers vs to get most likes and bookmarks per tweet?",
13 "Content meta data and how it impacts virality (e.g. ALT in images).",
14 "What are some unexpected fingerprints for spam factors?",
15 "Is there any difference between company verified checkmarks and blue verified individual checkmarks?",
16 ]

以下是得到的一个样本答案:

Python

**Question**: What does favCountParams do? 
**Answer**: FavCountParams helps count your favorite videos in a way that is friendlier to the video hosting ser

3、有用的资源

这里有一些额外的资源,可能会有用:

  • Activeloop documentation

(https://docs.activeloop.ai/)

  • AIModels.fyi

(http://aimodels.fyi/) 

  • LangChain guides

(https://notes.aimodels.fyi/tag/langchain/)

  • OpenAI embeddings documentation

(https://platform.openai.com/docs/guides/embeddings)

4、结论

在这一指南中,探索了使用LangChain对Twitter的推荐算法进行逆向工程。通过利用人工智能功能,节省了宝贵的时间和精力,用自动查询响应取代了人工代码检查。

LangChain是一个强大的工具,它彻底改变了代码的理解和生成。使用VectorStores、Conversational Retriverchain等高级模型,以及托管在DeepInfra等服务上的LLM, LangChain使开发人员能够有效地分析代码库,提供场景感知的答案,并生成新代码。

LangChain的工作流程包括索引代码库、嵌入代码片段、使用语言模型处理用户查询,以及利用Conversational RetrieverChain检索相关代码片段。通过自定义检索器并构建会话链,开发人员可以微调检索过程以获得精确的结果。

按照分步指南,可以利用LangChain来增强代码理解能力,获得场景感知的答案,甚至在GitHub存储库中生成代码片段。LangChain为生产力和理解开辟了新的可能性。那么人们会采用它建造什么?

原文链接:https://dzone.com/articles/a-plain-english-guide-to-reverse-engineering-the-t

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论