LlamaIndex系列教程-二、使用LLM:给Agent添加一个大脑

海心 11 次阅读 发布于 27 天前 预计阅读时间: 7 分钟


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