您当前的位置:首页 > 电脑百科 > 人工智能

LangChain实战:大语言模型理解代码库

时间:2023-09-20 12:39:27  来源:51CTO  作者:

作者 | 崔皓

审校 | 重楼

摘要

随着LLM(大语言模型)的发展,最近流行起利用大语言模型对源代码进行分析的潮流。网络博主纷纷针对Github Co-Pilot、Code Interpreter、Codium和Codeium上的代码进行分析。我们也来凑个热闹,利用AI target=_blank class=infotextkey>OpenAI 的GPT-3.5-Turbo和LangChain对LangChain的源代码进行分析。

开篇

众所周知,作为程序员经常会和源代码打交道,很多情况下,当程序员遇到新代码库,或者是遗留项目的代码库,都有些手足无措。特别是要在已有的代码库中进行修改,那更是举步维艰,生怕走错一步成千古恨。例如:不清楚类,方法之间的关系,不清楚函数之间的业务逻辑。不过现在不用担心了,有了大语言模型的加持,已让阅读代码不是难事,对代码库的整体分析也是小菜一碟。

总结来说,可以通过大语言模型进行如下操作:

1. 通过对代码库进行问答,以了解其工作原理。

2. 利用LLM提供重构或改进建议。

3. 使用LLM对代码进行文档化。

今天我们就从代码库问答开始,带大家手把手编写代码库问答的程序。

整体介绍

首先,我们来整理一些思路,如图1 所示。我们会先下载LangChain的源代码,将source code的目录以及目录下面的所有源代码文件保存到磁盘上。然后再对其进行加载和转换,也就是图中红色的部分。将这些代码文件切割成小的文件块,用来Embedding操作。也就是将其嵌入到向量数据库中,即图中橙色的部分。接着,图中最右边用户会请求大模型,这里的模型我们使用GPT-3.5-Turbo,请求模型提问与LangChain源代码相关的问题,例如:“在LangChain中如何初始化ReAct agent “。此时,GPT-3.5-Turbo的大语言模型会从向量数据库中获取相关信息,并且返回给用户。

图1 源代码库提问思路整理图1 源代码库提问思路整理

具体来说,可以采用一种分割策略,其机制由如下几个步骤组成:

1. 将代码中的每个顶级函数和类加载到单独的文档中。

2. 将剩余部分加载到另一个独立的文档中。

3. 保留关于每个分割来自何处的元数据信息。

不过,这些步骤都是由LangChain内部机制实现的, 我们只需要调用简单的代码就可以完成。

整个代码的构建和处理过程如上面图1 所示,接下来我们就可以编写代码,大概会分如下几个步骤:

  1. 下载LangChain代码
  2. 在VS Code导入代码
  3. 安装相关依赖
  4. 装载LangChain的源代码文件
  5. 切割文件
  6. 嵌入到向量数据库
  7. 利用大模型进行查询
  8. 返回查询结果

下面,我们就按照步骤来逐一介绍。

下载LangChain代码

首先,有请我们的主角LangChain源代码登场。 如图2 所示,可以通过访问地址:https://github.com/langchain-ai/langchain,来查看源代码库。

图2 LangChain源代码库图2 LangChain源代码库

当然可以通过Clone方法下载代码,或者使用如图3所示的方式,直接下载zip包然后解压。

图3 下载LangChain源代码图3 下载LangChain源代码

下载之后进行解压,请记住解压的目录后面会用到。

在VS Code导入代码

在解压LangChain的源代码库之后,将其导入到VS Code中。 如图3 所示,在VS Code中加载,在LANGCHAIN-MASTER目录下面的 /libs/langchain/langchain下面就是我们的目标目录了。里面存放着LangChain的源代码,接下来就需要对这个目录进行扫描读取器中的文件。

图3LangChain代码库所在位置图3LangChain代码库所在位置

安装相关依赖

在对代码库进行加载之前,我们先创建对应的Jupyter Notebook文件。如图4 所示,为了方便我们在源代码的根目录下面创建chat_with_code.ipynb文件。

图4 源代码文件结构图4 源代码文件结构

在文件中加入一些依赖包如下,分别加载了OpenAI的包,它是用来应用GPT-3.5-Turbo模型的。TikToken 是用来处理NLP(自然语言处理)任务的,例如:分词,嵌入,计算文本长度。ChromDB 是向量数据库的包,源代码文件会保存在这里,以便后续查询。另外,LangChain的包是进行一些操作的脚手架,少了它程序玩不转。

#引入依赖包
#openai gpt 模型
#tiktoken NLP 处理
#chromadb 向量数据库
#langchain llm 脚手架
pip install openai tiktoken chromadb langchain

安装完了依赖包之后,需要获取环境变量配置。因为要使用OpenAI的API去调用大模型,所以需要加入如下代码:

#通过环境配置的方式获取openai 访问api的key
import dotenv
dotenv.load_dotenv()

需要说明的是,我们在源代码根目录下面创建了一个”.env”文件,文件中写入如下代码:

OPENAI_API_KEY= openaikey

用来存放OpenAI的 key。

装载LangChain的源代码文件

引入依赖包之后就可以加载LangChain的源代码文件了。 如下代码,我们先引入几个LangChain的Class帮助我们加载代码。

#基于编程语言的字符切割
from langchain.text_splitter import Language
#大文件的装载
from langchain.document_loaders.generic import GenericLoader
#解析编程语言的语法
from langchain.document_loaders.parsers import LanguageParser
  • langchain.text_splitter 中的Language可以帮助我们基于编程语言进行文件的切割。
  • langchain.document_loaders.generi中的GenericLoader可以进行大文件的加载,因为可能会遇到类文件比较大的情况。
  • langchain.document_loaders.parsers中的LanguageParser是用来对类和方法进行解析的。

接着定义源代码所在的路径。

#定义源代码所在的目录
repo_path ="/Users/cuihao/doc/39 - GPT/langchain-master"

然后就可以开始加载Python/ target=_blank class=infotextkey>Python文件了。

#加载文件(s)多个文件
loader = GenericLoader.from_filesystem(
    repo_path+"/libs/langchain/langchain",
    #加载所有目录下的所有文件
    glob="**/*",
    #针对.py的文件进行加载
    suffixes=[".py"],
    #激活解析所需的最小行数
    parser=LanguageParser(language=Language.PYTHON, parser_threshold=500)
)
documents = loader.load()
len(documents)

从上面的代码可以看出通过GenericLoader的from_filesystem方法进行多目录下文件的加载。首先,传入源代码所在的根目录。接着,通过glob 参数定义所有目录下的所有文件是我们的目标文件。再就是定义处理文件的后缀是”.py”。最后,使用了LanguageParser方法针对Python进行解析,并且指定每次激活解析的代码行数是 500。

切割文件

有了加载以后的文件,我们将其给到Documents变量中,接着就是对Documents进行切割。一般而言大模型都有输入限制的要求,如下面代码所示:

#对加载好的py 文件进行切割
#ChatGPT 最大的输入是2048
from langchain.text_splitter import RecursiveCharacterTextSplitter
python_splitter = RecursiveCharacterTextSplitter.from_language(
language=Language.PYTHON,
#每个切割之后的文件的大小 
chunk_size=2000,
#文件与文件之间的重合部分是200
chunk_overlap=200)
#将所有源代码文件切割成小的文件块,以便llm 能够进行嵌入
texts = python_splitter.split_documents(documents)
len(texts)

这里利用LangChain.text_splitter包中的RecursiveCharacterTextSplitter函数对源代码进行切割。文件块的大小是2000字节,文件之间重合的部分是200字节。将切割好的文件块赋给texts变量,这里的texts实际上是一个文件块的数组,后面将会将这个数组嵌入到向量数据库chroma中。

这里需要对文件块切割的chunk_size和chunk_overlap两个参数做一下说明。如图5 所示,如果我们对文件按照长度进行切割,切割的文字很有可能丢失上下文。例如:“我们去公园玩好不好,如果天气好的”,这样一句话一定是不完整的,大模型在进行学习或者推理的时候会丢失一部分信息。在自然语言中是这样,在代码解析中也是如此。

图5 自然语言的文本切割图5 自然语言的文本切割

因此,我们在切割的时候会保存一部分文字块的上下文信息。图中“话我们就去”就是这部分信息,我们称之为“overlap”也就是相互覆盖的部分。这样每个文字块都可以保留它相邻文字块的部分信息,最大限度地保证了上下文信息的完整性,在代码解析中我们也会沿用这种做法。

嵌入到向量数据库

文件分块完成以后,接下来将把这些代码形成的文件块嵌入到向量数据库中了。只有嵌入进去以后,才能方便后续用户的查询。如下代码所示,利用OpenAI中的OpenAIEmbeddings函数将texts,也就是切割好的代码文件保存到chroma的向量数据库中。

from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings
#将切割好的文件块嵌入到向量数据库中, chroma db
db = Chroma.from_documents(texts, OpenAIEmbeddings(disallowed_special=()))
#定义如何查询代码
retriever = db.as_retriever(
#Maximal Marginal Relevance (最大边际相关性)= 相关性 + 多样性
search_type="mmr",# Also test "similarity"
#控制在检索中返回的文档数量
search_kwargs={"k":8},
)

不仅如此,还针对向量数据库创建了Retriever 作为索引器,帮助后续查找。其中有两个参数,第一个search_type定义的是mmr,这个是Maximal Marginal Relevance (最大边际相关性)的缩写。它是一种相关性查询的方式,同时考虑了查询目标的相关性和多样性。还有一个参数search_kwargs 定义了k 为8,这个是匹配相关文档的数量。

利用大模型进行查询

经过上面的步骤离我们的目标已经不远了。创建GPT-3.5-Turbo模型的查询是当务之急。如下代码所示,引入ChatOpenAI函数创建GPT-3.5-Turbo的模型实体。接着使用ConversationSummaryMemory创建有记忆的对话,最重要的是使用ConversationalRetrievalChain,从名字上可以看出来是基于对话的索引器,它以Chain的方式存在。Chain是LangChain的核心组件,用来将其他组件,例如:Model I/O,DataConnection,Agent等组合使用。这里它将大模型(LLM),索引器(Retriever)以及记忆组件(Memory)整合在一起进行问答响应。

#调用llm gpt-3.5-turbo 进行查询
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationSummaryMemory
from langchain.chains import ConversationalRetrievalChain
llm = ChatOpenAI(model_name="gpt-3.5-turbo")
memory = ConversationSummaryMemory(llm=llm,memory_key="chat_history",return_messages=True)
#定义大语言模型 , 查询方式, 记忆方式
qa = ConversationalRetrievalChain.from_llm(llm,retriever=retriever,memory=memory)

返回查询结果

万事俱备只欠东风,我们通过如下代码开始提问。

question ="我如何处初始化 ReAct agent?"
result = qa(question)
result['answer']

GPT-3.5-Turbo的回复如下:

要初始化 ReAct agent,您可以使用以下代码:
from langchain.agents.react_agent import ReActDocstoreAgent
from langchain.tools import LookupTool, SearchTool
# 创建 LookupTool 和 SearchTool
lookup_tool = LookupTool()
search_tool = SearchTool()
# 创建 ReAct agent
react_agent =ReActDocstoreAgent(tools=[lookup_tool, search_tool])
在上述代码中,我们首先导入 ReActDocstoreAgent 类和所需的工具类 LookupTool 和 SearchTool。
然后,我们创建了这些工具的实例,并将它们作为参数传递给 ReActDocstoreAgent 的构造函数,从而初始化了 ReAct agent。

回复中告诉我们要引入哪些类,以及ReAct Agent初始化需要依赖的类以及函数,把类和函数之间的依赖关系说清楚了。

总结

本文介绍了如何利用LangChain和GPT-3.5-Turbo来理解大型代码库。首先,我们下载了LangChain代码库并在VS Code中导入。然后,通过安装必要的依赖包,如OpenAI、Tiktoken、ChromaDB和LangChain,为后续操作做准备。接着,我们加载LangChain的源代码文件,包括使用LanguageParser进行解析。随后,我们将代码文件切割成小块,以满足大模型的输入要求。这些切割后的代码块被嵌入到Chroma向量数据库中,并创建了一个用于查询的Retriever,它使用Maximal Marginal Relevance进行相关性查询,并限制返回的文档数量。最后,我们使用GPT-3.5-Turbo来进行代码库的查询,实现了代码的问答和解释,使代码库的理解变得更加容易。

作者介绍

崔皓,51CTO社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。



Tags:LangChain   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一文解析如何基于 LangChain 构建 LLM 应用程序
Hello folks,我是 Luga,今天我们继续来聊一下人工智能(AI)生态领域相关的技术 - LangChain ,本文将继续聚焦在针对 LangChain 的技术进行剖析,使得大家能够了解 LangChain 实现...【详细内容】
2024-03-07  Search: LangChain  点击:(31)  评论:(0)  加入收藏
LangChain与Redis合作搞事情!创建提高财务文档分析准确性的工具
作者 | Tannista编译 | 星璇出品 | 51CTO技术栈(微信号:blog51cto)让ChatGPT准确回答来自证券交易委员会文件的复杂问题,可谓是到处都是坑。先进人工智能模型的出现彻底改变了自...【详细内容】
2023-12-27  Search: LangChain  点击:(111)  评论:(0)  加入收藏
如何使用LangChain和OpenAI API分析文档?
译者 | 布加迪审校 | 重楼从文档和数据中提取洞察力对于您做出明智的决策至关重要。然而在处理敏感信息时,会出现隐私问题。结合使用LangChain与OpenAI API,您就可以分析本地...【详细内容】
2023-11-23  Search: LangChain  点击:(201)  评论:(0)  加入收藏
如何使用LangChain、RStudio和足够的Python生成人工智能
译者 | 李睿审校 | 重楼LangChain是当今最热门的开发平台之一,用于创建使用生成式人工智能的应用程序,但它只适用于Python和JavaScript。对于想要使用LangChain的R程序员,该怎...【详细内容】
2023-11-21  Search: LangChain  点击:(229)  评论:(0)  加入收藏
LLMs应用框架:LangChain端到端语言模型
在当今数字化时代,语言处理技术的重要性日益凸显。大语言模型(LLMs)作为其中的重要分支,已经在多个领域取得了显著的进展。然而,如何将这些模型应用到实际场景中,实现端到端的自动...【详细内容】
2023-11-16  Search: LangChain  点击:(167)  评论:(0)  加入收藏
LangChain大模型应用开发指南-AI大模型衍生的新能力
今天我将为大家介绍LangChain基于AI大模型衍生的新能力,Model I/O、Retrieval、和Memory。组件总览 大家看完今天的文章后,可以回头再来看下LangChain的组件与架构图,就能从全...【详细内容】
2023-10-07  Search: LangChain  点击:(24)  评论:(0)  加入收藏
LangChain实战:大语言模型理解代码库
作者 | 崔皓审校 | 重楼摘要随着LLM(大语言模型)的发展,最近流行起利用大语言模型对源代码进行分析的潮流。网络博主纷纷针对GitHub Co-Pilot、Code Interpreter、Codium和Code...【详细内容】
2023-09-20  Search: LangChain  点击:(360)  评论:(0)  加入收藏
使用LangChain和DeepInfra构建客户支持聊天机器人的操作指南
译者 | 布加迪审校 | 重楼您可能在日常的网上互动中遇到过聊天机器人,但有没有考虑过底层为这些数字助手提供支持的技术?聊天机器人(尤其在客户支持领域)已经成为现代企业的一个...【详细内容】
2023-09-18  Search: LangChain  点击:(204)  评论:(0)  加入收藏
非程序员小白版本地部署ChatGLM2-6B +LangChain 个人知识库模型
ChatGLM2-6B 部署我这次采用的是本地部署,机器是 Macbook pro M1 64G进入你的系统“终端”# 键盘:command + 空格键 # 搜索“终端”,点击“打开”,进入“终端”界面 下载源码#...【详细内容】
2023-07-31  Search: LangChain  点击:(837)  评论:(0)  加入收藏
把c跑起来的三个方法
使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来...【详细内容】
2023-07-04  Search: LangChain  点击:(150)  评论:(0)  加入收藏
▌简易百科推荐
藏在AI背后的“吃电狂魔”
人工智能时代的能耗黑洞据估算,到2027年,人工智能行业每年将消耗85~134太瓦时的电力,相当于瑞典或荷兰一年的总用电量。马斯克判断,电力缺口最早可能会在2025年发生,“明年你会看...【详细内容】
2024-04-09    雪豹财经社  Tags:AI   点击:(1)  评论:(0)  加入收藏
OpenAI和谷歌再起纷争:AI的尽头是内容
日前,纽约时报的一篇报道称,人工智能公司 OpenAI为收集高质量训练数据而开发了一个语音转录模型Whisper。该模型主要用于转录 OpenAI 获取的超过 100 万小时的 YouTube 视频,也...【详细内容】
2024-04-09  小编也疯狂  新浪网  Tags:AI   点击:(1)  评论:(0)  加入收藏
AI产业的灰色暗面:OpenAI、谷歌、META如何搞训练语料
财联社4月7日讯(编辑 史正丞)种种迹象显示,目前站在全世界AI领域潮头浪尖的这些公司,早在几年前就已经陷入对训练语料的“绝望”追逐中——为此他们不惜修改政策条款...【详细内容】
2024-04-09    财联社  Tags:AI产业   点击:(1)  评论:(0)  加入收藏
和“数字人”交朋友,当心隐私被出卖......
在虚拟社交中如何在保护用户隐私和数据安全的同时提供高质量的社交体验?如何避免过度依赖虚拟社交找到虚拟与真实之间的平衡点?《中国消费者报》记者就此展开了调查APP里有个...【详细内容】
2024-04-09    中国消费者报  Tags:数字人   点击:(2)  评论:(0)  加入收藏
AI“复活”成产业链:成本可降至数百元
大模型应用落地,带火数字人(11.560, 0.29, 2.57%)赛道。文|《中国企业家》记者李艳艳 实习生 孙欣编辑|姚赟头图来源|《流浪地球2》电影画面截图清明节前,预估会有需求的庞立...【详细内容】
2024-04-09    中国企业家  Tags:AI“复活”   点击:(2)  评论:(0)  加入收藏
多方热议人工智能产业新机遇
编者按  从前沿科技展会到高层对话平台,从上海、重庆到博鳌,从线上到线下……一场场高规格、大规模的盛会中,人工智能正在成为各界热议的高频词。赋能千...【详细内容】
2024-04-08    中国家电网  Tags:人工智能   点击:(4)  评论:(0)  加入收藏
​人形机器人时代来了吗
日前,由中国人形机器人(11.080, -0.05, -0.45%)百人会主办的人形机器人大赛在北京经济技术开发区开赛。工作人员向参观者展示一款人形机器人。参观者与一款陪护型人形机器人...【详细内容】
2024-04-08    中国青年报  Tags:​人形机器人   点击:(5)  评论:(0)  加入收藏
AI重塑社交:腾讯与字节跳动的新赛场
文|新火种 一号编辑|美美最近,腾讯和字节跳动这两大互联网巨头几乎同步推出了各自的AI社交产品,尽管腾讯和字节跳动在前段时间刚刚“破冰”,但这一举措不仅意味着这两大巨头之...【详细内容】
2024-04-07    蓝鲸财经  Tags:AI   点击:(8)  评论:(0)  加入收藏
第一批用 Kimi 做内容的网红已经杀疯了
作者:王东东 文章来自:斗战圣佛小组技术信仰派 VS 市场信仰派 朱啸虎和月之暗面老板杨植麟在前几天有一场不算 battle 的 battle。battle 的争论点是:大模型有没有戏。技术派...【详细内容】
2024-04-04    斗战圣佛小组  Tags:Kimi   点击:(4)  评论:(0)  加入收藏
昆仑万维发布面向人工智能时代的六条人才宣言
过去的一年多,是人工智能取得非凡进步的一年。在这充满突破性技术飞跃和备受争议的一年里,我们见证了人工智能的快速发展和广泛的影响,人工智能已经迅速地融入了我们的生活,深刻...【详细内容】
2024-04-03    砍柴网  Tags:昆仑万维   点击:(7)  评论:(0)  加入收藏
站内最新
站内热门
站内头条