Llamaindex实战-在本地使用多种LLM
有关我们支持的大语言模型列表及其功能比较,请查看我们的大语言模型模块指南。
使用LLM的基本范式
构建基于 LLM 的应用程序时的第一步是决定使用哪个 LLM;也可以使用多个。
LLM 可用于管道的多个不同阶段:
- 在索引期间,您可以使用 LLM 来确定数据的相关性(是否对其进行索引),或者您可以使用 LLM 来汇总原始数据并为摘要建立索引。
- 在查询期间,LLM 可以通过两种方式使用:
- 在检索(从索引中获取数据)期间,大语言模型可以获得一系列选项(例如多个不同的索引),并决定在哪里最好地找到您要查找的信息。代理LLM在这个阶段还可以使用工具来查询不同的数据源。
- 在响应合成(将检索到的数据转换为答案)期间,LLM 可以将多个子查询的答案组合成一个连贯的答案,或者可以转换数据,例如从非结构化文本转换为 JSON 或其他编程输出格式。
LlamaIndex 为大量不同的 LLM 提供统一接口,允许您将您选择的任何 LLM 传递到管道的任何阶段。它可以像这样简单:
from llama_index.llms.openai import OpenAIresponse = OpenAI().complete("Paul Graham is ")
print(response)
通常,您将实例化 LLM 并将其传递到 Settings,然后将其传递到管道的其他阶段,如下例所示:
from llama_index.llms.openai import OpenAI
from llama_index.core import Settings
from llama_index.core import VectorStoreIndex, SimpleDirectoryReaderSettings.llm = OpenAI(temperature=0.2, model="gpt-4")# 加载可读文本
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents,
)
在本例中,您已实例化 OpenAI 并将其自定义为使用 gpt-4 模型而不是默认的 gpt-3.5-turbo,并且还修改了温度。 VectorStoreIndex 现在将使用 gpt-4 来回答查询时的问题。
设置(Settings)是一组配置数据,您可以将其传递到 LlamaIndex 的不同部分。您可以了解有关设置以及如何自定义它的更多信息。
使用本地大语言模型
- 使用ollama托管的模型
LlamaIndex 不仅支持托管的 LLM API;您还可以在本地运行本地模型,例如 Llama2。
例如,如果您安装并运行 Ollama:
from llama_index.llms.ollama import Ollama
from llama_index.core import SettingsSettings.llm = Ollama(model="llama3", request_timeout=60.0)
有关更多详细信息,请参阅自定义大语言模型的操作方法。
注意:这里的model="llama3"参数,可以通过ollama list
来查看,换成自己本地ollama拉(pull)下来的模型。
- 使用HuggingFace的大模型
当然也可以使用huggeface中的模型:
Settings.llm = HuggingFaceLLM(model_name="HuggingFaceH4/zephyr-7b-beta",tokenizer_name="HuggingFaceH4/zephyr-7b-beta",context_window=3900,max_new_tokens=256,generate_kwargs={"temperature": 0.7, "top_k": 50, "top_p": 0.95},messages_to_prompt=messages_to_prompt,completion_to_prompt=completion_to_prompt,device_map="auto",
)
这里的model_name给出的模型可以是下载下来并保存在本地的模型,只需要给出本地模型的路径即可。
一个例子
from llama_index.core.llms import ChatMessage
from llama_index.llms.ollama import Ollama# ollama
llm = Ollama(model="llama3", request_timeout=360.0)# questions
messages = [ChatMessage(role="user", content="What is your name"),
]resp = llm.chat(messages)print(resp)
我在16C32G的机器上运行以上代码,运行了大约几分钟时间,得到以下输出:
assistant: I don't have a personal name. I'm an AI designed to assist and communicate with humans, so I don't have a personal identity or self-awareness. My purpose is to provide information, answer questions, and help users like you with their queries. I exist solely as a digital entity, and my "name" is simply "Assistant" or "AI" - no specific name assigned to me!
从以上反馈来看,该模型的输出还是相对比较好的。
另外,要注意,messages这个参数可以输入多个角色和问题,类似于这样:
messages = [ChatMessage(role="user", content="who are you?"),ChatMessage(role="user", content="What is your name?"),
]
提示(Prompts)
默认情况下,LlamaIndex 附带了一组经过实战检验的内置提示,可处理让特定 LLM 正确处理和格式化数据的棘手工作。这是使用 LlamaIndex 的最大好处之一。如果需要,您可以自定义提示
参考
- Using LLMs