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


#引入依赖包#openai gpt 模型#tiktoken NLP 处理#chromadb 向量数据库#langchain llm 脚手架pip install openai tiktoken chromadb langchain安装完了依赖包之后,需要获取环境变量配置 。因为要使用OpenAI的API去调用大模型,所以需要加入如下代码:
#通过环境配置的方式获取openai 访问api的keyimport dotenvdotenv.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 最大的输入是2048from langchain.text_splitter import RecursiveCharacterTextSplitterpython_splitter = RecursiveCharacterTextSplitter.from_language(language=Language.PYTHON,#每个切割之后的文件的大小 chunk_size=2000,#文件与文件之间的重合部分是200chunk_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 所示 , 如果我们对文件按照长度进行切割 , 切割的文字很有可能丢失上下文 。例如:“我们去公园玩好不好,如果天气好的”,这样一句话一定是不完整的,大模型在进行学习或者推理的时候会丢失一部分信息 。在自然语言中是这样,在代码解析中也是如此 。
LangChain实战:大语言模型理解代码库

文章插图
图5 自然语言的文本切割
因此,我们在切割的时候会保存一部分文字块的上下文信息 。图中“话我们就去”就是这部分信息,我们称之为“overlap”也就是相互覆盖的部分 。这样每个文字块都可以保留它相邻文字块的部分信息,最大限度地保证了上下文信息的完整性,在代码解析中我们也会沿用这种做法 。
嵌入到向量数据库文件分块完成以后,接下来将把这些代码形成的文件块嵌入到向量数据库中了 。只有嵌入进去以后 , 才能方便后续用户的查询 。如下代码所示,利用OpenAI中的OpenAIEmbeddings函数将texts,也就是切割好的代码文件保存到chroma的向量数据库中 。


推荐阅读