微信扫码
添加专属顾问
我要投稿
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(最初名为GPTIndex)是一个灵活的框架,用于辅助构建LLM上层应用
。提供了各种工具,包括数据连接器
、数据结构化
(索引,图形)以及高级的检索/查询接口
,可以输入任何输入提示,并召回上下文和增强知识的输出。还允许与外部应用程序框架(如LangChain、Flask、 Docker、ChatGPT等)轻松集成。
与Streamlit一起,LlamaIndex使您能够快速创建由数据丰富而启用的LLM应用程序。LlamaIndex通过检索增强生成(RAG)
用自定义数据源
丰富您的模型。
摄取
数据并将其转换
为文档来准备知识库。它将这些文档(文本、关系等)中的元数据解析为节点,并从这些块中创建可查询的索引到知识库。检索
相关上下文,以帮助模型响应查询
。查询阶段确保模型可以访问原始训练数据中不包含的数据。LlamaIndex适用于任何级别的开发者,无论是初学者还是高级用户,LlamaIndex都提供了解锁工具:
对于更复杂的应用程序,详见:Llama Lab。无论你的LLM数据栈是什么样子的,LlamaIndex和LlamaHub可能已经有一个集成,并且每天都会添加新的集成。与LLM提供商、向量存储、数据加载器、评估提供商和代理工具的集成已经构建。
LlamaIndex主要由三部分组成:数据连接器
、索引结构
和查询接口
。
读取
外部数据,可以是本地文件、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"
)
结构化
成可查询的索引,支持多种索引方式,如向量索引、列表索引、树形索引等。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 存储。
检索
索引和组合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是一个灵活的框架,用于构建基于LLM的应用程序,提供数据连接器、数据结构化工具和高级检索/查询接口。它允许轻松集成外部应用程序框架。LlamaIndex的核心包括两个阶段:索引阶段和查询阶段。此外,它适用于所有级别的开发者,提供高级和低级API。LlamaIndex和LlamaHub支持多种集成,包括LLM提供商、向量存储、数据加载器等。
对于企业应用,LlamaIndex存在一些问题,如缺少与某些主要工作空间应用程序的连接,繁琐的配置过程,以及需要为每个任务创建独特实现。尽管如此,LlamaIndex仍然是一个值得学习和使用的库,特别是对于希望深入研究大型语言模型的人。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-02-01
2025-01-01
2024-08-13
2025-02-04
2024-04-25
2024-07-25
2024-06-13
2024-09-23
2024-04-26
2024-08-21
2025-03-09
2025-03-08
2025-03-08
2025-03-08
2025-03-07
2025-03-07
2025-03-07
2025-03-05