AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


值得一看的Llama-Index|私有数据源与大语言模型(LLMs)之间的桥梁
发布日期:2024-04-17 12:22:18 浏览次数: 2876


今日AI资讯
1.xAI: 发布具备视觉能力 Grok-1.5 Vision Preview
2.360: 开源智脑 7B,支持 50 万字长文本输入
3.首个公共安全领域大模型算法“天擎”通过备案,支持案情推理等
4.阿里妈妈: 上线一键AI生成短视频功能
5.OpenAI: GPT-4 Turbo可供付费用户使用
6.OpenAI: 发布日语GPT-4模型,进军日本市场
7.清华大学: 芯片领域重要突破,大规模干涉-衍射异构集成芯片太极(Taichi)
8.京东: 刘强东AI数字人“采销东哥”将进行直播首秀
9.中国第三代自主超导量子计算机:“本源悟空”全球访问量突破500
10.TikTok: 开发AI虚拟网红取代真人

您想使用基于自定义数据源的LLM构建一个靠谱的问答机器人吗?

ChatGPT系列大模型在回答公共数据源的一般问题方面表现出色,但也存在不完美。当您需要访问领域专业知识、近期数据或私有数据源时,准确性会急剧下降。对于自定义数据源增强,LLM可能会倍感吃力、力不从心,特别是当数据分布在多个应用程序、多种数据格式或跨数据存储时候。

那么今天的主角:LlamaIndex 就有了它的用武之地

点关注不迷路

认识LlamaIndex

LlamaIndex(最初名为GPTIndex)是一个灵活的框架,用于辅助构建LLM上层应用。提供了各种工具,包括数据连接器数据结构化(索引,图形)以及高级的检索/查询接口,可以输入任何输入提示,并召回上下文和增强知识的输出。还允许与外部应用程序框架(如LangChain、Flask、 Docker、ChatGPT等)轻松集成。

与Streamlit一起,LlamaIndex使您能够快速创建由数据丰富而启用的LLM应用程序。LlamaIndex通过检索增强生成(RAG)自定义数据源丰富您的模型。

  • 1.索引阶段
    • LlamaIndex通过摄取数据并将其转换为文档来准备知识库。它将这些文档(文本、关系等)中的元数据解析为节点,并从这些块中创建可查询的索引到知识库。
  • 2.查询阶段
    • 从知识库中检索相关上下文,以帮助模型响应查询。查询阶段确保模型可以访问原始训练数据中不包含的数据。

LlamaIndex适用于任何级别的开发者,无论是初学者还是高级用户,LlamaIndex都提供了解锁工具:

  • 高级API:允许初学者用户在三行代码中使用 LlamaIndex 读取、查询数据。
  • 低级API:允许用户自定义和扩展任何模块(数据连接器、索引、检索器、查询引擎、重排),以满足需求。

对于更复杂的应用程序,详见:Llama Lab。无论你的LLM数据栈是什么样子的,LlamaIndex和LlamaHub可能已经有一个集成,并且每天都会添加新的集成。与LLM提供商、向量存储、数据加载器、评估提供商和代理工具的集成已经构建。

主要组成及核心类详解

LlamaIndex主要由三部分组成:数据连接器索引结构查询接口

  • 1.数据连接器(Data Connectors): 负责读取外部数据,可以是本地文件、Notion、Slack、网页等。
LlamaIndex提供各种数据连接器:
- SimpleDirectoryReader: 支持本地文件目录中的多种文件类型(pdf、jpg、png、docx等)
- NotionPageReader: 从Notion获取数据
- lackReader: 从Slack导入数据
- ApifyActor: 能够抓取网页,抓取,文本提取和文件下载
- 其他更多:https://llamahub.ai/?tab=readers
llama_index.node_parser
自动地将文档documents转换为节点nodes,遵循一个特定的结构,可以在索引构造和查询中进一步利用。
SimpleNodeParser 默认配置:chunk_size=1024, chunk_overlap=20

SimpleNodeParser.from_defaults()用默认设置初始化一个解析器
get_nodes_from_documents(documents)用于将加载的文档解析为节点。

参数选项:
text_splitter(默认:TokenTextSplitter)
include_metadata(默认值:True)
include_prev_next_rel(默认值:True)
metadata_extractor(默认值:无)

在定义好节点后,会根据需要将节点的文本通过文本分割器拆分成token。

文本分割器:llama_index.text_splitter中的SentenceSplitter、TokenTextSplitter、CodeSplitter

SentenceSplitter:( 
  separator=" ", chunk_size=1024, chunk_overlap=20, 
  paragraph_separator="\n\n\n", secondary_chunking_regex="[^,.;。]+[,.;。]?"
  tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode 


TokenTextSplitter:( 
  separator=" ", chunk_size=1024, chunk_overlap=20, 
  backup_separators=["\n"], 
  tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode 


CodeSplitter:( 
  language="python", chunk_lines=40, chunk_lines_overlap=15, max_chars=1500, 


对于特定的范围嵌入,需要使用SentenceWindowNodeParser将文档拆分为单独的句子,同时捕获周围的句子窗口。
SentenceWindowNodeParser.from_defaults( 
  window_size=3, window_metadata_key="window", original_text_metadata_key="original_sentence" 
)
  • 2.索引结构(Index Structures): 将读取的数据(文档/节点)结构化成可查询的索引,支持多种索引方式,如向量索引、列表索引、树形索引等。
llama_index.schema:TextNode(节点)、NodeRelationship(节点属性)、RelatedNodeInfo(关系)

LlamaIndex中不同类型的索引以不同的方式处理数据:
- Document Summary Index: 将节点存储为一个顺序链,在查询期间,如果没有指定其他查询参数,则将所有节点加载到Response Synthesis模块中。
- Vector Store Index: 将每个节点和相应的嵌入存储在Vector Store中,查询涉及获取top-k最相似的节点。
- Tree Index: 从一组节点构建层次树,查询涉及从根节点向下遍历到叶节点。
- Keyword Table Index: 从每个Node中提取关键字构建映射,查询提取相关关键字获取对应的Node。
Index持久化核心方法
默认情况下,数据存储在内存中。
- persist()方法,可以将索引中的数据持久化到磁盘上的指定目录。
- 通过重新构建存储上下文,并使用load_index_from_storage()函数,可以从磁盘上的存储目录重新加载索引数据。

LlamaIndex提供了可定制的存储组件,允许用户指定存储各种数据元素的位置。包括:
- Simple Document Stores: 用于存储表示为Node对象的摄取文档的存储库。
- Simple Index Stores: 保存索引元数据的地方。
- Simple Vector Stores: 用于存放嵌入向量的存储器。

LlamaIndex支持通用的存储,已支持:本地文件系统、AWS S3、Cloudflare R2等。

通过使用 fsspec库 可以进行访问各种存储。
通过 StorageContext 对象抽象 Index Store 存储。
  • 3.查询接口(Query Inference): 提供与大模型对话的接口,通过检索索引和组合Prompt,使大模型能够理解和回应基于外部数据的查询。
1、高级查询API
query_engine = index.as_query_engine() # 从索引创建(默认)查询引擎
response = query_engine.query("your_query"# 执行查询
官方提供查询引擎很多,详见:https://docs.llamaindex.ai/en/stable/module_guides/deploying/query_engine/modules/

如果我们使用子问题查询引擎(SubQuestionQueryEngine)来解决多个数据源回答复杂查询的问题。它首先将复杂的查询分解为每个相关数据源的子问题,然后收集所有中间响应并合成最终响应。

2、低级组合API
对于更细粒度的控制或高级查询场景,可以使用低级组合API,它可以在查询过程的各个阶段进行定制。
Retrievers模块规定了针对查询从知识库获取相关上下文的技术。
官方实现方法:
外部:https://docs.llamaindex.ai/en/stable/examples/retrievers/bm25_retriever/

在查询输出后,可以通过后处理程序转换、过滤或重新排序来细化节点集。

LlamaIndex后置处理器包括:
- SimilarityPostprocessor:使用similarity_cutoff设置阈值。移除低于某个相似度分数的节点。
- KeywordNodePostprocessor:使用required_keywords和exclude_keywords。根据关键字包含或排除过滤节点。
- MetadataReplacementPostProcessor:用其元数据中的数据替换节点内容。
- LongContextReorder:重新排序节点,这有利于需要大量顶级结果的情况,可以解决模型在扩展上下文中的困难
- SentenceEmbeddingOptimizer:选择percentile_cutoff或threshold_cutoff作为相关性。基于嵌入删除不相关的句子。
- CohereRerank:使用coherence ReRank对节点重新排序,返回前N个结果。
- SentenceTransformerRerank:使用SentenceTransformer交叉编码器对节点重新排序,产生前N个节点
- LLMRerank:使用LLM对节点重新排序,为每个节点提供相关性评分。
- FixedRecencyPostprocessor:返回按日期排序的节点。
- EmbeddingRecencyPostprocessor:按日期对节点进行排序,但也会根据嵌入相似度删除较旧的相似节点。
- TimeWeightedPostprocessor:对节点重新排序,偏向于最近未返回的信息。
- PIINodePostprocessor(β):可以利用本地LLM或NER模型删除个人身份信息。
- PrevNextNodePostprocessor(β):根据节点关系,按顺序检索在节点之前、之后或两者同时出现的节点。

以上是一些常用的后处理程序,官网还有很多其他的模块。

合成相应器引导LLM生成响应,将用户查询与检索到的文本块混合在一起生成回复或答案的工具。

响应合成器类型:
- Refine: 这种方法遍历每一段文本,一点一点地精炼答案。
- Compact: 是Refine的精简版。它将文本集中在一起,因此需要处理的步骤更少。
- Tree Summarize: 想象一下,把许多小的答案结合起来,再总结,直到你得到一个主要的答案。
- Simple Summarize: 只是把文本片段剪短,然后给出一个快速的总结。
- No Text: 这个问题不会给你答案,但会告诉你它会使用哪些文本。
- Accumulate: 为每一篇文章找一堆小答案,然后把它们粘在一起。
- Compact Accumulate: 是“Compact”和“Accumulate”的合成词。

也可以建立自定义合成器。任何合成器的主要工作都是接受一个问题和一些文本片段,并返回一串文本作为答案。

解析响应

对于我们的查询,会返回一个Response对象,其中包含响应文本和响应来源。可以根据自定义的需求自行解析使用。

结构化输出

LlamaIndex利用大型语言模型(llm)的功能来交付结构化结果。
结构化结果不仅仅是一种花哨的数据呈现方式;它们对于依赖于解析值的精度和固定结构的应用程序至关重要。

llm可以通过两种方式提供结构化的输出:
1、Pydantic Programs
使用函数调用api,可以获得自然结构化的结果,然后使用Pydantic Programs将其塑造成所需的格式。
2、输出解析器
LlamaIndex的输出解析器可以在LLM执行任务之前和之后指导它,确保最终结果与所需的结构保持一致。
from llama_index.output_parsers import LangchainOutputParser
from llama_index.llm_predictor import StructuredLLMPredictor
from langchain.output_parsers import StructuredOutputParser, ResponseSchema

其他方面

LlamaIndex优劣势分析

  • 优势

    • 扩展性:使大型语言模型能够接入和利用更广泛的数据源,极大地扩展了其应用范围
    • 灵活性:支持多种索引结构和查询方式,用户可以根据需要自定义索引和查询逻辑
    • 实时性:通过实时检索外部数据,LlamaIndex能够使大模型提供最新的信息和回答
  • 劣势

    • 复杂性:构建和管理索引需要一定的技术背景,对于初学者来说可能有一定的学习成本
    • 资源消耗:索引构建和查询可能会消耗较多的计算资源,尤其是在处理大量数据时

LlamaIndex适用场景

  • 知识检索:构建专业知识库,使大模型能够提供专业领域的准确回答。
  • 企业内部数据分析:连接企业内部数据,辅助决策分析和报告生成。
  • 个性化推荐:根据用户的历史数据和偏好,提供个性化的内容和建议。

总结

LlamaIndex是一个灵活的框架,用于构建基于LLM的应用程序,提供数据连接器、数据结构化工具和高级检索/查询接口。它允许轻松集成外部应用程序框架。LlamaIndex的核心包括两个阶段:索引阶段和查询阶段。此外,它适用于所有级别的开发者,提供高级和低级API。LlamaIndex和LlamaHub支持多种集成,包括LLM提供商、向量存储、数据加载器等。

对于企业应用,LlamaIndex存在一些问题,如缺少与某些主要工作空间应用程序的连接,繁琐的配置过程,以及需要为每个任务创建独特实现。尽管如此,LlamaIndex仍然是一个值得学习和使用的库,特别是对于希望深入研究大型语言模型的人。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询