#handsDirty
https://colab.research.google.com/drive/1SmjpWrz8NzU7UyEDvbv9qEqGm_2keWEq#scrollTo=h3tA6La8Bhxl
## 版本
| | | |
| ----------- | ---------- | ------------------------- |
| 版本号 | 发布时间 | 关键更新简述 |
| v0.1.0 | 2022/11/9 | 初次开源,提供基础索引和 LLM 接入功能 |
| v0.10.0 | 2024/2/12 | 架构大改:核心包分离、集成模块独立、弃用旧接口 |
| v0.11.0 | 2024年9月 | 引入 Workflows、增强可观测性、优化图索引 |
| v0.12.0 | 2024/11/17 | 去除 Python 3.8 支持,依赖兼容性更新 |
| v0.12.30 🏆 | 2025/4/10 | 最新稳定版本,常规功能增强与 bug 修复 |
| | | |
过期特性
https://docs.llamaindex.ai/en/stable/changes/deprecated_terms/#servicecontext
## 核心逻辑
1. 准备索引 document 进来,通过 embedding 建立[索引Index](索引Index.md),然后 save_to_disk
2. 用户发起 query
3. 从 load_from_disk 到的索引中
4. LLM 根据从 index 中拿到的 chunks 来回答问题,生成 Response
| **概念** | **通俗解释** | **在 LlamaIndex 中的作用** |
| ------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| **Document** ✅ | raw 资料 | LlamaIndex 构建索引的基本单位;每个 Document 会被切分成更小的段落或 chunks,存入索引以便检索时快速定位。|
| **[[索引Index]]** ✅ | 存放文本内容和它们对应 embedding(向量表示)或层次结构的「数据库」。<br/>就像给一本书做的「目录索引」,方便快速查找章节位置。| 用于在查询时进行相似度匹配或分层检索,提升查询效率;常见有向量索引(GPTSimpleVectorIndex)和树索引(GPTTreeIndex)等。|
| **Chunk / Node** | Document 切分后得到的较小文本块。<br/>好比一本书中的一节内容,这样做是为了更好地将上下文拆分,利于向量检索和后续的 Prompt 拼接。| 作为检索与检索后上下文拼接(Prompt)的基础单元;向量索引会基于这些 chunks 的嵌入向量来查找最匹配的文本。|
| **insert / update** | 向现有索引中增量添加或更新文档的操作。<br/>就像在图书馆的索引卡里增加新书籍条目,而无需重新建一整套索引。| 使索引内容保持最新,不用重新构建全部索引;尤其对经常新增内容的场景很重要,可以节省计算资源和时间。|
| **概念** | **通俗解释** | **在 LlamaIndex 中的作用** |
| ------------ | ---------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| **LLMs** | 封装了 LLM(如 OpenAI GPT-3.5、GPT-4)调用的对象。<br/>包括模型名称、请求参数(温度等),以及如何向模型发送 prompt。| 在索引构建或查询回答时,需要用 LLM 来做总结、回答生成等;LLMs 就是把这些调用逻辑集中起来。|
| **Settings** | 为 LlamaIndex 提供「统一配置」的上下文,比如模型类型(LLMPredictor)、嵌入模型(Embedding)、超参数等。| 允许我们一次性地把 LLM、Embedding、提示模板等打包成一个上下文,避免在多处重复写配置;构建索引或查询时可共享此配置。|
## Settings 能配置啥
| 配置项 | 描述 | 示例代码 |
| --------------- | ------------------------------ | ---------------------------------------------------------------------------------------------- |
| LLM ✅ | 用于响应提示和查询,负责生成自然语言回答 | `Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1)` |
| Embed Model ✅ | 用于将文本转换为数值表示,用于计算相似度和 top-k 检索 | `Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small", embed_batch_size=100)` |
| Text Splitter | 用于将文档解析成更小的块,称为节点 | `Settings.text_splitter = SentenceSplitter(chunk_size=1024)` |
| Chunk Size | 文本分块的大小 | `Settings.chunk_size = 512` |
| Chunk Overlap | 文本分块的重叠部分 | `Settings.chunk_overlap = 20` |
| Transformations | 在摄取过程中应用于文档的转换 | `Settings.transformations =[SentenceSplitter(chunk_size=1024)]` |
| Tokenizer | 用于计算令牌数量,应与使用的 LLM 匹配 | `Settings.tokenizer = tiktoken.encoding_for_model("gpt-3.5-turbo").encode` |
| Callbacks | 设置全局回调管理器,用于观察和消费整个代码生成的事件 | `Settings.callback_manager = CallbackManager([token_counter])` |
| Context Window | LLM 的最大输入大小 | `Settings.context_window = 4096` |
| Num Output | 为文本生成保留的令牌数量 | `Settings.num_output = 256` |
这些配置可以全局设置,也可以在特定接口中通过参数进行局部覆盖。
#cheatsheet
以下是 LlamaIndex v0.12.30 中常用 API 的速查表,涵盖了从数据加载、索引构建到查询的核心操作
---
## 📄 文档加载与构建
````python
from llama_index.core import SimpleDirectoryReader, Document
# 从目录加载文档
documents = SimpleDirectoryReader("data").load_data()
# 手动创建文档对象
doc = Document(text="示例文本", id_="doc_1", metadata={"author": "张三"})
```
## 🧠 索引构建与管理
```python
from llama_index.core import VectorStoreIndex
# 从文档构建向量索引
index = VectorStoreIndex.from_documents(documents)
# 插入新文档
index.insert(Document(text="新文档内容", id_="doc_new"))
# 删除文档
index.delete_ref_doc("doc_1", delete_from_docstore=True)
# 更新文档
doc.text = "更新后的内容"
index.update_ref_doc(doc)
# 刷新索引
index.refresh_ref_docs([doc])
```
## 🔍 查询与问
```python
# 创建查询引擎
query_engine = index.as_query_engine()
# 提出查询
response = query_engine.query("什么是 LlamaIndex?")
# 使用聊天引擎
chat_engine = index.as_chat_engine()
response = chat_engine.chat("请介绍一下 LlamaIndex 的功能。")
``
## 🧩 节点解析与元数据理
```python
from llama_index.node_parser import SimpleNodeParser
# 使用节点解析器
parser = SimpleNodeParser()
nodes = parser.get_nodes_from_documents(documents)
# 设置文档 ID
doc = Document(text="内容", id_="custom_id")
# 自动设置文件名为 ID
reader = SimpleDirectoryReader("data", filename_as_id=True)
``
## 🧪 高级功能扩展
```python
from llama_index.embeddings import MixedbreadAIEmbedding
from llama_index.core import Settings
from llama_index.llms import OpenAI
from llama_index.agent import FunctionCallingAgent
# 使用自定义嵌入模型
Settings.embed_model = MixedbreadAIEmbedding(api_key="your_api_key", model_name="model_name")
# 使用自定义 LLM
Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1)
# 使用代理(Agent)
agent = FunctionCallingAgent.from_tools([query_engine])
response = agent.chat("请查询相关信息。")
```