使用LangChain、Activeloop和DeepInfra逆向工程Twitter算法的简明英文指南
Concise English Guide to Reverse-Engineering Twitter Algorithms using LangChain, Activeloop, and DeepInfra
想象一下,写一段能够理解、辅助甚至生成代码的软件,就像一位经验丰富的开发者一样。
好吧,这是可能的,有了LangChain。利用先进的模型,如VectorStores、Conversational RetrieverChain和LLMs,LangChain将我们带入了一个新的代码理解和生成水平。
在本指南中,我们将逆向工程Twitter的推荐算法,以更好地理解代码库,并提供见解以制作更好的内容。我们将使用OpenAI的嵌入技术和一个名为Activeloop的工具,使代码易于理解,并使用在DeepInfra上托管的名为Dolly的LLM与代码进行交流。
完成后,我们将能够通过向AI提问我们最迫切的问题来避免理解算法所需的艰苦工作,而不是花费数周的时间来筛查。让我们开始吧。
使用LangChain进行代码理解的概念大纲
LangChain是一个非常有用的工具,可以分析GitHub上的代码库。它集合了三个重要部分:VectorStores、Conversational RetrieverChain和LLM(语言模型),以帮助您理解代码、回答与上下文相关的问题,甚至在GitHub代码库中生成新代码。
Conversational RetrieverChain系统通过从VectorStore中查找和检索有用信息来帮助您。它使用智能技术,如上下文感知的过滤和排序,确定哪些代码片段和信息与您的具体问题或查询最相关。它的独特之处在于它考虑了对话的历史和提问的上下文。这意味着它可以为您提供高质量和相关的结果,专门解决您的需求。简单来说,它就像拥有一个智能助手,它理解您问题的上下文,并根据该上下文为您提供最佳答案。
现在,让我们看一下LangChain的工作流程,并了解它在高层次上是如何工作的:
索引代码库
第一步是克隆您要分析的目标代码库。加载代码库中的所有文件,将它们分解为较小的块,并启动索引过程。如果您已经拥有索引数据集,则可以跳过此步骤。
嵌入和代码存储
为了使代码片段更容易理解,LangChain采用了一个代码感知的嵌入模型。这个模型有助于捕捉代码的本质,并将嵌入的代码片段存储在VectorStore中,使它们可以在将来的查询中轻松访问。
简单来说,LangChain使用一种特殊的技术,称为代码感知的嵌入,使代码片段更容易理解。它有一个可以分析代码并捕捉其重要特征的模型。然后,它将这些分析过的代码片段存储在VectorStore中,类似于一个存储位置,方便快速检索。这样,代码片段被组织起来,以便在将来有查询或问题时可以快速检索。
查询理解
这是您的LLM发挥作用的地方。您可以使用像databricks/dolly-v2-12b这样的模型来处理您的查询。该模型通过考虑上下文并提取重要信息来分析您的查询并理解其含义。通过这样做,模型帮助LangChain准确解释您的查询并为您提供精确而相关的结果。
构建检索器
一旦您的问题或查询清晰明确,Conversational RetrieverChain开始工作。它通过VectorStore,也就是代码片段存储的地方,并找到与您的查询最相关的代码片段。这个搜索过程非常灵活,可以根据您的要求进行自定义。您可以调整设置并应用特定于您需求的过滤器,确保您获取到最准确和有用的查询结果。
构建对话链
一旦您设置好检索器,就可以开始构建对话链。这一步涉及调整检索器的设置,以更好地适应您的需求,并应用可能需要的任何其他过滤器。通过这样做,您可以缩小搜索范围,确保您获得最精确、准确和相关的查询结果。基本上,它允许您微调检索过程,获得对您最有用的信息。
提问:现在是令人兴奋的部分!
您可以使用ConversationalRetrievalChain来询问有关代码库的问题。它将为您生成全面且上下文感知的答案。您的LLM作为对话链的一部分,考虑到检索到的代码片段和对话历史,为您提供详细准确的答案。
按照这个工作流程,您可以有效地使用LangChain来更深入地理解代码,获得与上下文相关的问题答案,甚至在GitHub存储库中生成代码片段。现在,让我们一步一步地看它如何运作。
逐步指南
让我们深入实际的实现。
获取API密钥
首先,您必须在相应的网站上注册并获取Activeloop、DeepInfra和OpenAI的API密钥。
设置Indexer.py文件
创建一个Python文件,例如indexer.py,用于索引数据。导入必要的模块并将API密钥设置为环境变量:
嵌入式表示是文本的表示,捕捉不同文本字符串的含义和相关性。它们是数值向量或数字列表,用于衡量不同文本输入之间的相似度或距离。
嵌入式表示通常用于各种任务,例如搜索、聚类、推荐、异常检测、多样性测量和分类。在搜索中,嵌入式表示有助于对查询的搜索结果进行相关性排序。在聚类中,嵌入式表示将相似的文本字符串分组在一起。
推荐利用嵌入式表示来建议具有相关文本字符串的项。异常检测使用嵌入式表示来识别相关性较低的异常值。多样性测量涉及分析文本字符串之间相似性的分布。分类利用嵌入式表示将文本字符串分配到它们最相似的标签。
两个嵌入式向量之间的距离表示相应的文本字符串的相关性或相似性。较小的距离表示较高的相关性,而较大的距离表示较低的相关性。
克隆和索引目标存储库
接下来,我们将克隆Twitter算法存储库,加载、分割和索引文档。您可以从此链接克隆该算法。
此代码通过目录及其子目录(os.walk(root_dir))进行遍历。对于它遇到的每个文件(filenames),它尝试执行以下步骤:
- 它创建一个TextLoader对象,指定当前正在处理的文件的路径
(os.path.join(dirpath, file))
并将编码设置为UTF-8。 - 然后调用TextLoader对象的
load_and_split()
方法,该方法可能读取文件的内容,执行一些处理或分割操作,并返回结果文本数据。 - 然后,使用
extend()
方法将获得的文本数据添加到名为docs的现有列表中。 - 如果在此过程中发生任何异常,它将被try-except块捕获并简单地忽略(`pass`)。
此代码片段递归地遍历目录,从文件中加载和分割文本数据,并将结果数据添加到名为docs的列表中。
嵌入代码片段
接下来,我们使用OpenAI的嵌入来嵌入代码片段。然后,将这些嵌入存储在VectorStore中,以便我们可以进行高效的相似性搜索:
此代码导入CharacterTextSplitter类并使用1000个字符的块大小和无重叠初始化一个实例。然后,使用split_documents方法将提供的docs拆分为较小的文本块,并将它们存储在texts变量中。
接下来,设置用户名(您用于在Activeloop上注册的用户名!)。创建一个名为db的DeepLake实例,其数据集路径指向在指定用户名下的”app.activeloop.ai”上托管的公共可用数据集。embedding_function处理所需的嵌入。
最后,使用add_documents方法将texts添加到db中,可能是为了存储或进一步处理的目的。
运行文件,然后等待几分钟(可能会看起来卡住一段时间…通常不超过5分钟)。然后,进行下一步。
利用dolly-v2-12b处理和理解用户查询
现在我们设置另一个Python文件,question.py,使用DeepInfra平台上可用的语言模型dolly-v2-12b来处理和理解用户查询。
构建检索器
我们使用之前创建的VectorStore构建一个检索器。
下面是代码正在执行的步骤:
该代码初始化了一个名为db的DeepLake对象。它从指定为“hub://mikelabs/twitter-algorithm”的路径读取数据集。 值得注意的是,您需要将“mikelabs”替换为您自己的用户名!
然后,将db对象转换为检索器,使用as_retriever()方法。这一步允许我们对存储在VectorStore中的数据执行搜索操作。
通过修改`retriever.search_kwargs`字典,可以自定义几个搜索选项:
将`distance_metric`设置为“cos”,表示将使用余弦相似度来衡量文本输入之间的相似性。想象一下,你有两个代表不同文本片段(如句子或文档)的向量。余弦相似度是一种衡量这两个文本片段相似性或相关性的方法。
我们查看两个向量之间的夹角来计算余弦相似度。如果向量指向同一个方向或非常接近,余弦相似度将接近1。这意味着文本片段非常相似。
另一方面,如果向量指向相反方向或远离彼此,余弦相似度将接近-1。这表明文本片段非常不同或不相似。
余弦相似度为0意味着向量彼此垂直或成90度角。在这种情况下,文本片段之间没有相似性。
在上面的代码中,余弦相似度被用作比较文本输入之间相似性的度量。它有助于确定两个文本片段之间的关系有多密切。使用余弦相似度,代码可以对与给定查询最相似的前几个匹配进行排名和检索。
将`fetch_k`参数设置为100,表示检索器将基于余弦相似度检索前100个最接近的匹配项。
将`maximal_marginal_relevance`设置为`True`,表示检索器将优先考虑多样性的结果,而不是返回高度相似的匹配项。
将`k`参数设置为10,表示检索器将为每个查询返回十个结果。
构建对话链
我们使用ConversationalRetrievalChain将检索器和语言模型连接起来。这使得我们的系统能够处理用户查询并生成上下文感知的响应:
ConversationalRetrievalChain作为检索器和语言模型之间的连接。这种连接使系统能够处理用户查询并生成能够意识到上下文的响应。
提问
现在,我们可以对Twitter算法代码库提问。ConversationalRetrievalChain提供的答案是具有上下文感知能力的,并直接基于代码库。
下面是一些从LangChain文档中获取的示例问题:
这是我得到的一个示例答案:
资源
下面是一些您可能会发现有用的附加资源:
- Activeloop文档
- AIModels.fyi LangChain指南
- OpenAI嵌入文档
结论
在本指南中,我们使用LangChain对Twitter的推荐算法进行了逆向工程。通过利用AI能力,我们节省了宝贵的时间和精力,用自动化的查询响应取代了手动代码检查。
LangChain是一种革命性的强大工具,可以改变代码的理解和生成。使用高级模型如VectorStores、Conversational RetrieverChain以及托管在DeepInfra等服务上的LLM,LangChain赋予开发人员高效分析代码库、提供上下文感知答案和生成新代码的能力。
LangChain的工作流程涉及对代码库进行索引、嵌入代码片段、使用语言模型处理用户查询以及利用Conversational RetrieverChain检索相关代码片段。通过定制检索器和构建对话链,开发人员可以对检索过程进行精确结果的微调。
按照逐步指南,您可以利用LangChain来提升代码理解能力,获取上下文感知的答案,甚至在GitHub存储库中生成代码片段。LangChain为提高生产力和理解能力开辟了新的可能性。您将用它构建什么呢?感谢您的阅读!