LlamaIndex快速上手
先说一个基础设定:要跑通整个流程,我们需要两类模型。一类是LLM,也就是负责生成内容的大语言模型;另一类是embedding model,也就是能把文本语义映射成向量表示的嵌入模型。这两个角色缺一不可,一个负责理解并输出最终答案,另一个负责把文档内容做成可检索的“索引地图”。
搞定 OpenAI 的 API Key
LlamaIndex 在默认配置下,直接牵的是 OpenAI 的 LLM 和嵌入模型。所以,第一步很直白:先准备好一个 OpenAI 的 API key。
import os
os.environ["OPENAI_API_BASE"] = "https://example.com/v1"
os.environ["OPENAI_API_KEY"] = "sk-example-key"
代码里把环境变量设好,整个框架就知道该去哪调用模型了。
加载数据,建立索引,一气呵成
密钥搞定,下一步就是加载文档并建立索引。这一步其实很简洁:
from llama_index.core import (
VectorStoreIndex,
SimpleDirectoryReader,
)
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(documents)
这里用了一个便捷工具 SimpleDirectoryReader,它会把指定目录下所有文档一股脑全扫描进来。我们的目录结构很简单,就是在 ./data 文件夹里放了一份《中国航天发展简史》。

对着索引提问
索引建好之后,就可以生成一个查询引擎,然后直接提问了。整个过程走一遍,你会发现在这个例子中,所有问题都会严格从《中国航天发展简史》那本书里找答案。
我们拿原文中的一段话来验证一下:

看,答案确实是对的。LLM 根据我们问的问题和检索到的那段信息,做了点简单的推理,然后生成了一个合情合理的回答。反过来,如果不加这些检索来的上下文,直接扔给 OpenAI 的 ChatGPT 3.5,它给出的回复就完全是另一回事了。

想看幕后发生了什么?打开日志
如果你好奇查询引擎在后台是怎么工作的,可以在代码文件开头加上这几行:
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
把日志级别设成 logging.INFO,打印出来的信息就会少一点,更清晰。
索引别丢了,存到磁盘上
索引本质上是一系列表示文本语义的嵌入向量。默认情况下这些东西全在内存里,程序一关就没了。所以,我们可以把它持久化到磁盘:
index.storage_context.persist(persist_dir="./storage")
执行之后,就会生成一个 storage 目录,里面存着索引数据。
这时候,代码的逻辑就可以优化一下:
- 如果磁盘上还没有索引,就重新加载文档、建立索引,然后存一下。
- 如果磁盘上有现成的索引,那就直接加载,省去重复生成索引的时间,也省掉调用 OpenAI 嵌入模型的 token 费用。

不用 OpenAI,换成本地模型
考虑到费用、网络环境、数据隐私这些现实问题,我们很可能需要换一套本地开源的方案。这里把默认的嵌入模型换成 BGE 的中文版,LLM 换成 Meta 开源的 Llama2-chat-13B 的中文版:
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.llama_cpp import LlamaCPP
from llama_index.core import Settings
embed_model = HuggingFaceEmbedding(
model_name="../models/BAAI/bge-large-zh-v1.5",
query_instruction="为这个句子生成表示以用于检索相关文章:"
)
Settings.embed_model = embed_model
llm = LlamaCPP(
model_path="../models/Llama/chinese-alpaca-2-13b-q8_0.gguf"
)
Settings.llm = llm
通过 Settings 设置好全局的嵌入模型和 LLM,然后重新建立索引,再问同一个问题。结果怎样呢?

虽然回复质量不够亮眼,但至少答案是准确的。注意,要在本地跑起 Llama2 13B 模型,内存至少 32GB 起步。至于 GPU,有它反赌,没它就慢一点,倒也不是非用不可。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名