LlamaIndex 基础 01 - 认识 llamaindex

本文从 Llamaindex 的代码结构,理解 Llamaindex 构建 rag 应用的步骤

不考虑其他细节, Llamaindex 快速构建 rag 应用的步骤如下:

graph LR
    A(加载文件夹数据documents=SimpleDirectoryReader) --> B(构建索引index=VectorStoreIndex.from_documents);
    B --> C(生成查询引擎query_engine=index.as_query_engine);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding

# 第一步: documents=SimpleDirectoryReader
documents = SimpleDirectoryReader("../../data/三国演义白话文/",recursive=True).load_data(show_progress=True)
base_url='http://localhost:11434'
Settings.embed_model = OllamaEmbedding(model_name="quentinz/bge-large-zh-v1.5:latest",base_url=base_url)
Settings.llm = Ollama(model="qwen2.5:latest", request_timeout=360.0,base_url=base_url)

# 第二步: VectorStoreIndex.from_documents
index = VectorStoreIndex.from_documents(documents,show_progress=True)

# 第三步:query_engine=index.as_query_engine
query_engine = index.as_query_engine()
response = query_engine.query("关羽在哪里被擒的?")
print(response)

Loading files: 100%|██████████| 41/41 [00:00<00:00, 355.91 file/s]
Parsing nodes: 100%|██████████| 41/41 [00:00<00:00, 425.54 it/s]
Generating embeddings: 100%|██████████| 127/127 [00:07<00:00, 17.04 it/s]
根据提供的信息,关羽并没有被捕或被擒。相反,他一路上经历了许多战斗和挑战,并最终到达了汝南与刘备重逢。因此,文中没有提到关羽被捕的情节。

1
2
response = query_engine.query("刘备如何将诸葛亮收入麾下?")
print(response)

为了将诸葛亮收至麾下,刘备做了充分的准备。第二年春天,他精心挑选了一个好日子,沐浴更衣后再次前往隆中拜访。关羽劝阻他不要去,但张飞提议用绳子直接把诸葛亮捆来。刘备对此非常生气,并训斥了张飞一番,最终决定坚持自己的想法。
到达隆中的草堂后,刘备轻手轻脚地敲门并请童子通报自己。待孔明午睡醒来后,刘备在台阶下耐心等候。见到孔明后,他表现出极大的诚意和真挚的情感,恳请诸葛亮出山相助共谋大业。最终,被刘备的真诚所打动,诸葛亮决定答应邀请,加入刘备阵营,并被任命为军师,负责指挥军队。


在 LlamaIndex 库中,通过上述代码片段可以看出其模块化和分层的设计思路:

  1. Prompt 层:这个层级主要包含了构建查询或处理数据时所需的各种提示模板。通过使用 prompts 模块中的相关类和方法,用户可以定制化查询的表达方式。
  2. Reader 层:这一层负责从不同的数据源(如文件、数据库等)中读取内容。readers 模块提供了多种具体的实现,用于处理不同格式的数据输入。
  3. Index 层:这里的组件专注于创建和维护索引结构。通过 indices 模块中的类,可以构建针对特定查询优化的索引数据结构。
  4. Retriever 层:此层负责从构建好的索引中检索相关信息。通过使用 retrievers 模块提供的工具,可以根据具体的查询需求高效地进行信息提取。
  5. Query Engine 层:这一层级提供了执行复杂查询的功能。通过 query_engine 模块,可以定义和运行复杂的查询逻辑,并得到相应的结果。
  6. Agent 层:该层实现了对话代理或智能助手的功能。它能够理解用户输入并生成合适的响应,结合了前面几层的功能来提供交互式的服务。
  7. Workflow 层:最后,这一层级提供了处理更复杂工作流的方法和工具,可以将上述各层组件组合起来以实现更为复杂的任务自动化流程。

每一层都通过模块化的方式进行组织,并且这些模块之间有清晰的接口定义,使得用户或开发者可以根据具体需求灵活选择使用哪些功能。

1
2
3
from llama_index.core import prompts 
indexs=list(filter(lambda att:att.find('Prompt')>=0,dir(prompts)))
print(indexs)

[‘BasePromptTemplate’, ‘ChatPromptTemplate’, ‘LangchainPromptTemplate’, ‘Prompt’, ‘PromptTemplate’, ‘PromptType’, ‘SelectorPromptTemplate’]

1
2
3
from llama_index.core import readers
atts=list(filter(lambda att:att.find('Reader')>=0,dir(readers)))
print(atts)

[‘FileSystemReaderMixin’, ‘ReaderConfig’, ‘SimpleDirectoryReader’, ‘StringIterableReader’]

1
2
3
from llama_index.core import indices
indexs=list(filter(lambda att:att.find('Index')>=0,dir(indices)))
print(indexs)

[‘DocumentSummaryIndex’, ‘EmptyIndex’, ‘GPTDocumentSummaryIndex’, ‘GPTEmptyIndex’, ‘GPTKeywordTableIndex’, ‘GPTListIndex’, ‘GPTPandasIndex’, ‘GPTRAKEKeywordTableIndex’, ‘GPTSQLStructStoreIndex’, ‘GPTSimpleKeywordTableIndex’, ‘GPTTreeIndex’, ‘GPTVectorStoreIndex’, ‘KeywordTableIndex’, ‘KnowledgeGraphIndex’, ‘ListIndex’, ‘MultiModalVectorStoreIndex’, ‘PandasIndex’, ‘PropertyGraphIndex’, ‘RAKEKeywordTableIndex’, ‘SQLStructStoreIndex’, ‘SimpleKeywordTableIndex’, ‘SummaryIndex’, ‘TreeIndex’, ‘VectorStoreIndex’]

1
2
3
from llama_index.core import retrievers
indexs=list(filter(lambda att:att.find('Retriever')>=0,dir(retrievers)))
print(indexs)

[‘AutoMergingRetriever’, ‘BaseImageRetriever’, ‘BasePGRetriever’, ‘BaseRetriever’, ‘CustomPGRetriever’, ‘CypherTemplateRetriever’, ‘EmptyIndexRetriever’, ‘KGTableRetriever’, ‘KeywordTableSimpleRetriever’, ‘KnowledgeGraphRAGRetriever’, ‘LLMSynonymRetriever’, ‘ListIndexEmbeddingRetriever’, ‘ListIndexRetriever’, ‘NLSQLRetriever’, ‘PGRetriever’, ‘QueryFusionRetriever’, ‘RecursiveRetriever’, ‘RouterRetriever’, ‘SQLRetriever’, ‘SummaryIndexEmbeddingRetriever’, ‘SummaryIndexLLMRetriever’, ‘SummaryIndexRetriever’, ‘TextToCypherRetriever’, ‘TransformRetriever’, ‘TreeAllLeafRetriever’, ‘TreeRootRetriever’, ‘TreeSelectLeafEmbeddingRetriever’, ‘TreeSelectLeafRetriever’, ‘VectorContextRetriever’, ‘VectorIndexAutoRetriever’, ‘VectorIndexRetriever’]

1
2
3
from llama_index.core import query_engine
indexs=list(filter(lambda att:att.find('Engine')>=0,dir(query_engine)))
print(indexs)

[‘BaseQueryEngine’, ‘CitationQueryEngine’, ‘CogniswitchQueryEngine’, ‘ComposableGraphQueryEngine’, ‘CustomQueryEngine’, ‘FLAREInstructQueryEngine’, ‘JSONalyzeQueryEngine’, ‘KnowledgeGraphQueryEngine’, ‘MultiStepQueryEngine’, ‘NLSQLTableQueryEngine’, ‘PGVectorSQLQueryEngine’, ‘PandasQueryEngine’, ‘RetrieverQueryEngine’, ‘RetrieverRouterQueryEngine’, ‘RetryGuidelineQueryEngine’, ‘RetryQueryEngine’, ‘RetrySourceQueryEngine’, ‘RouterQueryEngine’, ‘SQLAutoVectorQueryEngine’, ‘SQLJoinQueryEngine’, ‘SQLTableRetrieverQueryEngine’, ‘SimpleMultiModalQueryEngine’, ‘SubQuestionQueryEngine’, ‘ToolRetrieverRouterQueryEngine’, ‘TransformQueryEngine’]

1
2
3
from llama_index.core import agent
indexs=list(filter(lambda att:att.find('Agent')>=0,dir(agent)))
print(indexs)

[‘AgentChatResponse’, ‘AgentRunner’, ‘CustomSimpleAgentWorker’, ‘FnAgentWorker’, ‘FunctionCallingAgent’, ‘FunctionCallingAgentWorker’, ‘MultimodalReActAgentWorker’, ‘ParallelAgentRunner’, ‘QueryPipelineAgentWorker’, ‘ReActAgent’, ‘ReActAgentWorker’, ‘StructuredPlannerAgent’]

1
2
3
from llama_index.core import workflow
indexs=list(filter(lambda att:att.find('Workflow')>=0,dir(workflow)))
print(indexs)

[‘Workflow’, ‘WorkflowCheckpointer’, ‘WorkflowRuntimeError’, ‘WorkflowTimeoutError’, ‘WorkflowValidationError’]