LLMs 是 LlamaIndex 的核心组件。它们可以作为独立模块使用,也可以插入到其他核心 LlamaIndex 模块(索引、检索器、查询引擎)中。它们始终在响应合成步骤中使用(例如,在检索之后)。根据所使用的索引类型,LLMs 也可能在索引构建、插入和查询遍历过程中使用。
构建基于 LLM 的应用程序的第一步之一是选择要使用的 LLM;它们具有不同的优势和价格点,您可能希望使用多个。一般情况下我们也肯定会根据不同的任务,调用不同的模型。
例如:
- Claude 3.7 sonnet 擅长编程
- Gemini 2.5 Flash 或 Deepseek V3 擅长写作
- ChatGPT o3 或 Gemini 2.5 Pro 擅长思考,这在Agent判断当下情况很有用
所以,我们希望能用最简便的方法,调用多个我们想要的模型。
幸运的是,现在大部分模型厂家的都是使用OpenAI兼容格式的API调用规范,所以我们只需要使用LlamaIndex提供的OpenAI兼容LLM接口,然后就可以调用大部分市面上支持的大模型API了。
包含以下LLM:
- OpenAI官方提供的模型
- Deepseek
- OpenRouter(最大的中转API网站)
- 云雾API(国内最大的中转API网站,好处是支持国内支付方式,并且不用翻墙)
这边以同时调用OpenAI、OpenRouter、云雾API这三个API服务为例,如果使用其他API服务,也只需要更换对应的API base url即可。
首先安装依赖
pip install llama-index
pip install openai
pip install --upgrade wrapt
因为我们想要自定义自用的API接口,这就要求我们得自定义传入的参数。如:
- base api url
- api key
- model
所以我们是希望创建3个新的类。这个类应该继承LlamaIndex的OpenAI类,但是要传入我们的自定义参数。所以直接能写出以下代码:
import os
from llama_index.llms.openai import OpenAI
from llama_index.core.base.llms.types import ChatMessage, LLMMetadata, MessageRole
from llama_index.llms.openai.utils import is_function_calling_model
# 直接继承OpenAI类,不需要中间基类
class OpenAIModel(OpenAI):
def __init__(self, **kwargs):
kwargs.setdefault('model', 'gpt-4o')
kwargs.setdefault('api_base', '<https://api.openai.com/v1>')
if 'api_key' not in kwargs:
kwargs['api_key'] = os.getenv('OPENAI_API_KEY')
super().__init__(**kwargs)
class OpenRouterModel(OpenAI):
def __init__(self, **kwargs):
kwargs.setdefault('model', 'qwen/qwen-plus')
kwargs.setdefault('api_base', '<https://openrouter.ai/api/v1>')
if 'api_key' not in kwargs:
kwargs['api_key'] = os.getenv('OPENROUTER_API_KEY')
super().__init__(**kwargs)
@property
def metadata(self) -> LLMMetadata:
"""重写元数据以避免未知模型错误"""
return LLMMetadata(
context_window=8192,
num_output=self.max_tokens or -1,
model_name=self.model,
is_chat_model=True,
is_function_calling_model=is_function_calling_model(self.model),
)
class YunWuModel(OpenAI):
def __init__(self, **kwargs):
kwargs.setdefault('model', 'gpt-4o-2024-08-06')
kwargs.setdefault('api_base', '<https://yunwu.ai/v1>')
if 'api_key' not in kwargs:
kwargs['api_key'] = os.getenv('YUNWU_API_KEY')
super().__init__(**kwargs)
如代码所示,我们创建了三个类:
- OpenAIModel
- OpenRouterModel
- YunWuModel
他们分别对应调用的OpenAI、OpenRouter、云雾API,这三个API服务。需要书亦的是,我们需要在.env文件中配置好对应API服务的API_KEY
OPENAI_API_KEY=sk-proj-EDd5xxxxx
YUNWU_API_KEY=sk-y0VwfHVxxxxx
OPENROUTER_API_KEY=sk-or-v1-e0xxxxx
# 替换为你自己的API Key
通过上面这样,我们就能接入任何我们想要的模型服务。而且,当我们需要调用模型的之后,直接创建这个类的实例即可。因为这些类都是继承自LlamaIndex的OpenAI类,所以OpenAI类里所有的方法我们也是可以直接调用的。
下面给出使用这三个类的示范
# 主程序示例调用
if __name__ == "__main__":
messages = [
ChatMessage(role="system", content="你是一个智能助手。"),
ChatMessage(role="user", content="你好,请自我介绍。")
]
# 将模型类给实例化:
openai_model = OpenAIModel()
openrouter_model = OpenRouterModel()
yunwu_model = YunWuModel()
# llama_index的OpenAI类用chat接口,传入ChatMessage列表
print("OpenAIModel:", openai_model.chat(messages).message.content)
print("OpenRouterModel:", openrouter_model.chat(messages).message.content)
print("YunWuModel:", yunwu_model.chat(messages).message.content)
运行后的输出:
OpenAIModel: 你好!我是一个智能助手,旨在帮助回答问题、提供信息和协助解决各种任务。我可以处理多种主题,包括科技、科学、历史、文化等。如果你有任何问题或需要帮助,请随时告诉我!
OpenRouterModel: 你好!我是Qwen,是阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我可以帮助你回答问题、创作文字,比如写故事、写公文、写邮件、写剧本、逻辑推理、编程等等,还能表达观点,玩游戏等。如果你有任何问题或需要帮助,欢迎随时告诉我!
YunWuModel: 你好!我是一个智能助手,旨在帮助回答问题、提供信息和协助解决各种任务。我可以处理多种主题,包括科技、历史、文化、日常生活等。如果你有任何问题或需要帮助,请随时告诉我!
可以看见,我们已经成功调用了这三个API服务提供的大模型了。
我建议在Agent搭建实践中,最好的方式是将所有的LLM服务封装到一个Python文件里,然后在其他Python程序中调用这个文件里的类即可。
具体做法:将上面所有的代码保存为llamaindex_models.py
然后创建新的Python文件,在开头调用 llamaindex_models.py 里面我们刚刚定义好的模型服务类:
from llamaindex_models import OpenAIModel , OpenRouterModel , YunWuModel
然后其他用法和先前的一样。
[!本章总结] 学会了如何在LlamaIndex中调用LLM,为以后构建LLM Agent打下基础
尊贵的会员,您的套餐已经到期,续费请点击页面的下单连接或联系微信客服claudeplus
Comments NOTHING