在本文中,我们将仔细研究 LLAMA Packs,这是 LLM 应用程序开发中最重要的功能之一。
Llama Packs 既是一种快速高效的构建 LLM 应用程序的方法,也是一组预打包的模块和模板,可帮助开发人员更快、更高效地开始构建 LLM 应用程序。
LLAMA Packs 的真正亮点是它的可重用性和可扩展性,使 LLM 应用程序开发变得极其简单、直观和灵活。
与其他LLM框架相比,LlamaIndex是一个高度抽象的框架。 然而,llamaindex 团队更注重抽象和可重用性。 使用 Llama Packs,LlamAindex 的许多原生功能,例如从基本到高级的查询策略,以及与第三方供应商的集成,都是预先打包的,因此开发人员可以轻松调用相应 Llama Pack 的运行时函数来执行逻辑。 这种具有丰富预打包模块和模板的低质量解决方案在 LLM 应用程序开发中是前所未有的。
可重用性伴随着可伸缩性的挑战。 同样,LlamaIndex 团队在这一领域处于领先地位——Llama Packs 在设计时考虑到了可扩展性。 我们可以轻松地将模块预打包并在本地制作副本,根据需要自定义和扩展功能,然后简单地重新导入包并使用它。 我们随时欢迎社区为扩展现有软件包做出贡献!
SentenceWindowNodeParser 是一种用于创建句子表示形式的工具,该表示形式考虑了周围的单词和句子。 在检索过程中,在将检索到的句子传递给 LLM 之前,使用 MetaDataReplacementNodePostProcessor 将单个句子替换为包含周围句子的窗口。 这对于需要全面理解句子含义的任务特别有用,例如机器翻译或摘要。 对于大型文档,这有助于检索更精细的细节。
在 Llama Pack 之前的实现中,使用 SentenceWindowNodeParser 实现多文档 RAG 管道的完整源代码如下:
import nest_asyncionest_asyncio.apply()import os, openai, logging, sysos.environ["openai_api_key"] = "sk-#################################"openai.api_key = os.environ["openai_api_key"]logging.basicconfig(stream=sys.stdout, level=logging.debug)# load documentsfrom llama_index import **directoryreaderdocuments = **directoryreader("data").load_data()print(f"loaded documents with documents")# setup node parser and service contextfrom llama_index import servicecontext, set_global_service_contextfrom llama_index.llms import openaifrom llama_index.embeddings import huggingfaceembeddingfrom llama_index.node_parser import sentencewindownodeparser, *nodeparsernode_parser = sentencewindownodeparser.from_defaults( window_size=3, window_metadata_key="window", original_text_metadata_key="original_text",)llm = openai(model="gpt-3.5-turbo", temperature=0.1)embed_model = huggingfaceembedding( model_name="sentence-transformers/all-mpnet-base-v2", max_length=512)ctx = servicecontext.from_defaults( llm=llm, embed_model=embed_model)from llama_index import vectorstoreindex# extract nodes and build indexdocument_list = **directoryreader("data").load_data()nodes = node_parser.get_nodes_from_documents(document_list)sentence_index = vectorstoreindex(nodes, service_context=ctx)# define query enginefrom llama_index.indices.postprocessor import metadatareplacementpostprocessormetadata_query_engine = sentence_index.as_query_engine( similarity_top_k=2, # the target key defaults to `window` to match the node_parser's default node_postprocessors=[ metadatareplacementpostprocessor(target_metadata_key="window") ]# run queryresponse = metadata_query_engine.query("give me a summary of devops self-service-centric pipeline security and guardrails.")print(str(response))在上面的代码片段中,详细步骤包括:
加载文档。 设置节点解析程序。
定义服务上下文。
提取节点并构建索引。
定义查询引擎。
运行查询。 使用 Llama Pack 后:
import nest_asyncionest_asyncio.apply()import os, openai, logging, sysos.environ["openai_api_key"] = "sk-#################################"openai.api_key = os.environ["openai_api_key"]logging.basicconfig(stream=sys.stdout, level=logging.debug)# load documentsfrom llama_index import **directoryreaderdocuments = **directoryreader("data").load_data()print(f"loaded documents with documents")# download and install llama packs dependenciesfrom llama_index.llama_pack import download_llama_packsentencewindowretrieverpack = download_llama_pack( "sentencewindowretrieverpack", "./sentence_window_retriever_pack")# create the pack sentencewindowretrieverpacksentence_window_retriever_pack = sentencewindowretrieverpack(documents)# run queryresponse = sentence_window_retriever_pack.run("give me a summary of devops self-service-centric pipeline security and guardrails.")print(str(response))正如我们所看到的,Llama Packs 的实现大大简化了 **!加载文档后,只需三个简单的步骤:
* 并安装软件包。
创建包。 运行包。
这是一个视觉比较。
接下来,我们来谈谈**的主要组成部分。
Llama Packs 中的每个包都遵循相同的结构:
__init__.py:p ython 封装指示器。
base.py:包的主要逻辑。
readme.md:关于如何使用包的说明。
requirements.txt:包的依赖项。
向下钻取到主文件base.py,主要有三个功能:
__init__:初始化包。 这是包的主要逻辑。 在我们的示例中,此函数包含设置节点解析器和服务上下文、提取节点和构建索引以及定义查询引擎的步骤。 这个函数就是 Llama 将主要逻辑打包成一个包的方式,这样我们作为开发者就不必一遍又一遍地编写包的详细逻辑了。
get_modules:允许我们检查模块的使用情况。
run:触发管道。 这就是我们所处的位置__init__该函数在调用查询函数的查询引擎中定义。
在某些情况下,现有的 LLAMA 包可能无法满足您的需求,例如您可能需要使用不同的嵌入模型。 这就是我们上面提到的 Llama Pack 的可扩展性方面。 但是,我们如何扩展现有软件包呢?自sentence_window_retriever_pack例如。
首先,复制已经 **sentence_window_retriever_pack并重命名它sentence_window_retriever_pack_copy
其次,在sentence_window_retriever_pack_copy目录base.py要将其嵌入到模型中,请执行以下操作:
self.embed_model = huggingfaceembedding( model_name="sentence-transformers/all-mpnet-base-v2", max_length=512)更改为:
self.embed_model = "local:baai/bge-base-en-v1.5"第三步是相应地修改您的应用程序不再是包(在下面的代码片段中注释掉了),您现在需要从复制的包导入sentencewindowretrieverpack
## download and install llama packs dependencies# from llama_index.llama_pack import download_llama_pack# sentencewindowretrieverpack = download_llama_pack(# "sentencewindowretrieverpack", "./sentence_window_retriever_pack"# )from sentence_window_retriever_pack_copy.base import sentencewindowretrieverpack# create the pack sentencewindowretrieverpacksentence_window_retriever_pack = sentencewindowretrieverpack(documents)就这样!运行新修改的应用程序,并查看最新更改的生效情况。
在本文中,我们介绍了所有 LLM 框架最重要的功能之一——LLAMA Packs。 我们研究了它是什么,为什么需要它,如何实现它,以及我们如何扩展它以满足我们在 LLM 应用程序开发中的需求。
introducing llama packs:
llama packs example:
tweet introducing llama packs:
metadata replacement + node sentence window:
点赞并关注二师兄谈话获取更多信息并阅读我的简短技术文章。