主题
v0.10.0 引入了新的高层 Settings 对象,用来取代旧的 ServiceContext 配置。
新的 Settings 对象是一份全局设置,其参数采用惰性实例化。像 LLM 或嵌入模型这样的属性,只有在底层模块真正需要时才会被加载。
而此前的 service context,许多模块常常并不使用它,同时它还会强制在运行时把每个组件都载入内存(哪怕根本用不到)。
配置全局 settings 意味着你在改动 LlamaIndex 中每一个模块的默认值。也就是说,如果你不用 OpenAI,一个示例配置可以这样写:
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings
Settings.llm = Ollama(model="llama2", request_timeout=120.0)
Settings.embed_model = HuggingFaceEmbedding(
model_name="BAAI/bge-small-en-v1.5"
)有了这份设置,你就能确保框架里永远不会用到 OpenAI。
Settings 对象支持旧 ServiceConext 几乎全部相同的属性。完整清单见文档页。
完整迁移
下面是从 ServiceContext 完整迁移到 Settings 的例子:
迁移前
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.node_parser import SentenceSplitter
from llama_index.llms.openai import OpenAI
from llama_index.core import ServiceContext, set_global_service_context
service_context = ServiceContext.from_defaults(
llm=OpenAI(model="gpt-3.5-turbo"),
embed_model=OpenAIEmbedding(model="text-embedding-3-small"),
node_parser=SentenceSplitter(chunk_size=512, chunk_overlap=20),
num_output=512,
context_window=3900,
)
set_global_service_context(service_context)迁移后
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.node_parser import SentenceSplitter
from llama_index.llms.openai import OpenAI
from llama_index.core import Settings
Settings.llm = OpenAI(model="gpt-3.5-turbo")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=20)
Settings.num_output = 512
Settings.context_window = 3900局部配置
上面讲的是全局配置。要按模块配置设置,所有模块接口都应更新为接受其所用对象的 kwargs。
如果你在用 IDE,kwargs 会通过智能提示自动补全;下面也给出几个例子:
# a vector store index only needs an embed model
index = VectorStoreIndex.from_documents(
documents, embed_model=embed_model, transformations=transformations
)
# ... until you create a query engine
query_engine = index.as_query_engine(llm=llm)# a document summary index needs both an llm and embed model
# for the constructor
index = DocumentSummaryIndex.from_documents(
documents, embed_model=embed_model, llm=llm
)