ai
  • index
  • 1.欢迎来到LlamaIndex
  • 2.高级概念
  • 3.安装与设置
  • 4.入门教程(使用OpenAI)
  • 5.入门教程(使用本地LLMs)
  • 6.构建一个LLM应用
  • 7.使用LLMs
  • pydantic
  • asyncio
  • apikey
  • 8.RAG简介
  • 9.加载数据
  • 10.索引
  • 11.存储
  • 12.查询
  • weaviate
  • Cohere
  • warnings
  • WeaviateStart
  • spacy
  • 使用LlamaIndex构建全栈Web应用指南
  • back2
  • back4
  • front2
  • front4
  • front6
  • front8
  • llamaindex_backend
  • llamaindex_frontend
  • 1. 使用LLMs
  • 2. 快速开始
    • 2.1 包的功能说明
  • 3. 流式响应
  • 4. 聊天界面
  • 5. 指定模型
  • 6. 多模态大型语言模型
  • 7. 工具调用
  • 8. 可用的LLMs
    • 8.1 使用本地LLM
    • 8.2 本地LLM的优势

1. 使用LLMs #

💡 提示: 要查看我们支持的LLM列表及其功能对比,请访问我们的LLM模块指南。

构建基于LLM的应用时,首要步骤之一就是选择使用哪种LLM;它们各有不同的优势和价格区间,您可能希望同时使用多个模型。

LlamaIndex为众多不同的LLM提供了统一接口。使用LLM可以像安装相应集成包一样简单。

2. 快速开始 #

安装相应的LLM集成包:

# 安装LlamaIndex的OpenAI集成包
# llama-index-llms-openai: 提供与OpenAI API的集成
# 这个包允许LlamaIndex使用OpenAI的各种语言模型(如GPT-3.5、GPT-4等)
pip install llama-index-llms-openai

2.1 包的功能说明 #

llama-index-llms-openai:

  • 提供与OpenAI API的集成接口
  • 支持多种OpenAI模型(GPT-3.5、GPT-4、GPT-4o等)
  • 支持同步和异步调用
  • 支持流式输出和聊天功能
  • 支持工具调用和函数调用

然后在一行代码中调用它:

# 导入异步编程所需的模块
import asyncio

# 从llama_index.llms.openai模块导入OpenAI类
from llama_index.llms.openai import OpenAI


# 创建OpenAI语言模型实例
llm = OpenAI(model="gpt-4o-mini")


# 定义同步方法示例
def sync_example():
    """演示同步complete方法的使用"""
    print("🔄 同步方法示例:")
    print("-" * 30)

    # 使用同步complete方法
    response = llm.complete("威廉·莎士比亚是")
    print(f"输入: 威廉·莎士比亚是")
    print(f"输出: {response}")
    print()


# 定义异步方法示例
async def async_example():
    """演示异步acomplete方法的使用"""
    print("⚡ 异步方法示例:")
    print("-" * 30)

    # 使用异步acomplete方法
    response = await llm.acomplete("威廉·莎士比亚是")
    print(f"输入: 威廉·莎士比亚是")
    print(f"输出: {response}")
    print()


# 定义并发异步示例
async def concurrent_example():
    """演示多个异步请求的并发处理"""
    print("🚀 并发异步示例:")
    print("-" * 30)

    # 创建多个异步任务
    tasks = [
        llm.acomplete("威廉·莎士比亚是"),
        llm.acomplete("阿尔伯特·爱因斯坦是"),
        llm.acomplete("法国的首都是"),
    ]

    # 并发执行所有任务
    responses = await asyncio.gather(*tasks)

    prompts = [
        "威廉·莎士比亚是",
        "阿尔伯特·爱因斯坦是",
        "法国的首都是",
    ]

    # 打印所有结果
    for i, (prompt, response) in enumerate(zip(prompts, responses), 1):
        print(f"任务 {i}:")
        print(f"  输入: {prompt}")
        print(f"  输出: {response}")
        print()


# 定义主异步函数
async def main():
    """主函数,演示不同方法的使用"""
    try:
        print("🤖 OpenAI LLM 方法对比演示")
        print("=" * 50)

        # 运行同步示例
        sync_example()

        # 运行异步示例
        await async_example()

        # 运行并发示例
        await concurrent_example()

        print("✅ 演示完成!")

    except Exception as e:
        print(f"❌ 运行出错: {e}")
        print("请检查网络连接和API密钥设置")


# 程序入口点
if __name__ == "__main__":
    asyncio.run(main())

complete 和 acomplete 的区别

同步 vs 异步

  • complete: 同步方法,会阻塞程序执行直到获得响应
  • acomplete: 异步方法,不会阻塞程序,可以与其他异步操作并发执行

使用场景

  • complete: 适合简单的单次调用
  • acomplete: 适合需要并发处理多个请求或与其他异步操作配合

调用方式

  • complete: 直接调用 response = llm.complete(prompt)
  • acomplete: 需要使用 await 调用 response = await llm.acomplete(prompt)
方法 单次请求 多次请求 适用场景
complete 简单快速 依次执行,较慢 简单脚本、单次调用
acomplete 需要异步环境 并发执行,很快 高并发应用、复杂系统

3. 流式响应 #

你也可以通过调用获取流式响应 stream_complete 返回一个生成器,随着token的产生逐步yield它们:

# 导入OpenAI LLM集成
from llama_index.llms.openai import OpenAI
import time
import os

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = (
    "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"
)

# 创建OpenAI LLM实例
llm = OpenAI()


# 定义流式输出函数,展示不同参数组合的效果
def stream_with_params(prompt, end_char="", flush_state=True, description=""):
    """演示不同end和flush参数组合的流式输出效果"""
    print(f"\n📝 {description}")
    print("-" * 40)

    # 使用stream_complete方法获取流式响应
    # 这会返回一个生成器,可以逐步获取生成的token
    handle = llm.stream_complete(prompt)

    # 遍历生成器,逐步打印每个token
    # delta属性包含当前token的文本内容
    for token in handle:
        print(token.delta, end=end_char, flush=flush_state)

    print()  # 最后添加一个换行


# 定义主函数
def main():
    """主函数,演示不同参数组合的效果"""
    try:
        print("🔄 流式输出参数演示")
        print("=" * 50)

        # 演示1:使用end=""和flush=True(推荐用于流式输出)
        stream_with_params(
            "介绍一下鲁迅",
            end_char="",
            flush_state=True,
            description="演示1: end='' + flush=True (推荐用于流式输出)",
        )

        # 演示2:使用默认参数(不推荐用于流式输出)
        stream_with_params(
            "介绍一下李白",
            end_char="\n",  # 默认值
            flush_state=False,  # 默认值
            description="演示2: 默认参数 (end='\\n' + flush=False)",
        )

        # 演示3:使用end=" "和flush=True
        stream_with_params(
            "介绍一下杜甫",
            end_char=" ",
            flush_state=True,
            description="演示3: end=' ' + flush=True",
        )

        # 演示4:不使用flush(可能看不到实时输出)
        print("\n📝 演示4: 不使用flush (可能看不到实时输出)")
        print("-" * 40)
        handle = llm.stream_complete("介绍一下白居易")
        for token in handle:
            print(token.delta, end="", flush=False)  # flush=False
        print()

        print("✅ 演示完成!")

    except Exception as e:
        print(f"❌ 运行出错: {e}")
        print("请检查网络连接和API密钥设置")


# 程序入口点
if __name__ == "__main__":
    main()

end 参数

  • 默认值: end="\n" (换行符)
  • 作用: 控制 print() 函数在打印内容后的结束字符
  • 常见用法:
    • end="" - 不添加任何结束字符
    • end=" " - 添加空格
    • end="\t" - 添加制表符
参数值 效果 适用场景
end="" 不添加任何结束字符 流式输出,内容连续显示
end="\n" 添加换行符(默认) 普通打印,每行独立
end=" " 添加空格 单词间用空格分隔
end="\t" 添加制表符 表格格式输出
  1. flush 参数
  • 默认值: flush=False
  • 作用: 控制是否立即刷新输出缓冲区
  • 重要性: 在流式输出中至关重要
参数值 效果 适用场景
flush=True 立即刷新缓冲区 流式输出,实时显示
flush=False 等待缓冲区满或程序结束 批量输出,可能延迟显示

4. 聊天界面 #

LLM类还实现了一个 chat method,让您能够进行更复杂的交互:

# 导入OpenAI LLM集成
from llama_index.llms.openai import OpenAI

# 导入聊天消息相关的类
# ChatMessage: 用于创建聊天消息
from llama_index.core.llms import ChatMessage

# 创建OpenAI LLM实例
llm = OpenAI()

# 创建聊天消息列表
# 包含系统消息和用户消息
messages = [
    # 系统消息:定义AI助手的角色和行为
    ChatMessage(role="system", content="你是一个帮助用户解决问题的助手。"),
    # 用户消息:用户的具体问题或请求
    ChatMessage(role="user", content="介绍一下鲁迅"),
]

# 使用chat方法进行对话
# 这会根据消息历史生成回复
chat_response = llm.chat(messages)

# 打印AI助手的回复
print(chat_response.message.content)

stream_chat 和 astream_chat 也有提供。

5. 指定模型 #

许多LLM集成提供了不止一个模型。您可以通过传递参数来指定具体的模型。model 传递给LLM构造函数的参数:

# 导入OpenAI LLM集成
from llama_index.llms.openai import OpenAI

# 创建OpenAI LLM实例,指定使用gpt-4o-mini模型
# model参数用于指定具体使用的模型
llm = OpenAI(model="gpt-4o-mini")

# 使用指定的模型生成文本
response = llm.complete("介绍一下鲁迅")

# 打印生成的回答
print(response)

6. 多模态大型语言模型 #

部分LLMs支持多模态聊天消息。这意味着您可以传入文本与其他模态(如图像、音频、视频等)的混合内容,LLM将能够处理这些信息。

目前,LlamaIndex通过content blocks支持在ChatMessages中处理文本、图像和音频内容。

# 导入多模态相关的类
# ChatMessage: 用于创建聊天消息
# TextBlock: 用于创建文本块
# ImageBlock: 用于创建图像块
from llama_index.core.llms import ChatMessage, TextBlock, ImageBlock

# 导入OpenAI LLM集成
from llama_index.llms.openai import OpenAI

# 创建支持多模态的OpenAI LLM实例
# 使用gpt-4o模型,它支持图像理解
llm = OpenAI(model="gpt-4o")

# 创建包含图像和文本的多模态消息
messages = [
    ChatMessage(
        role="user",
        # blocks参数允许混合不同类型的内容
        blocks=[
            # 图像块:指定图像文件路径
            ImageBlock(path="cat.jpg"),
            # 文本块:描述对图像的要求
            TextBlock(text="描述一下这张图片"),
        ],
    )
]

# 使用多模态聊天功能
# LLM会同时处理图像和文本内容
resp = llm.chat(messages)

# 打印LLM对图像和文本的综合回答
print(resp.message.content)

7. 工具调用 #

一些LLM(如OpenAI、Anthropic、Gemini、Ollama等)支持通过API直接调用工具——这意味着无需特定提示词和解析机制即可调用工具和函数。

# 导入FunctionTool类,用于将Python函数包装为可被LLM调用的工具
from llama_index.core.tools import FunctionTool

# 导入OpenAI LLM集成,用于与OpenAI模型交互
from llama_index.llms.openai import OpenAI


# 定义一个生成诗歌的函数,接收诗人和主题作为参数
def generate_poem(poet: str, theme: str):
    """根据提供的诗歌名称和诗人生成诗歌信息。"""
    # 打印函数被调用时的参数,便于调试
    print(f"🔍 函数被调用:poet='{poet}', theme='{theme}'")
    # 返回一个包含主题、诗人和提示信息的字典
    return {
        "theme": f"为{theme}创作诗歌",
        "poet": poet,
        "message": f"作者{poet}为{theme}创作诗歌",
    }


# 使用FunctionTool.from_defaults方法,将generate_poem函数包装为工具
tool = FunctionTool.from_defaults(fn=generate_poem)

# 创建OpenAI LLM实例,指定使用gpt-4o模型,支持工具调用
llm = OpenAI(model="gpt-4o")

# 调用predict_and_call方法,自动根据用户请求选择并调用合适的工具
response = llm.predict_and_call(
    [tool],  # 提供可用工具列表
    "以杜甫的风格写一首关于春天的诗",  # 用户的自然语言请求
)

# 打印LLM调用工具后的结果
print(str(response))

要了解更多关于高级工具调用的详细信息,请查阅使用深入指南OpenAI。同样的方法适用于任何支持工具/功能(如Anthropic、Gemini、Ollama等)的LLM。

您可以了解更多关于工具和代理的信息在工具指南。

8. 可用的LLMs #

我们支持与OpenAI、Anthropic、Mistral、DeepSeek、Hugging Face等数十家平台的集成。查看我们的LLMs模块指南如需完整列表,包括如何运行本地模型。

💡 提示: 关于隐私和LLM使用的一般说明可在隐私页面。

8.1 使用本地LLM #

LlamaIndex不仅支持托管的LLM API,还能让你在本地运行诸如Meta的Llama 3这样的模型。举例来说,如果你拥有Ollama已安装并运行:

# 导入Ollama LLM集成
# Ollama类提供了与本地Ollama服务的接口
from llama_index.llms.ollama import Ollama

# 创建Ollama LLM实例
# model: 指定使用的模型名称(需要先通过ollama pull下载)
# request_timeout: 设置请求超时时间为60秒
# context_window: 手动设置上下文窗口大小以限制内存使用
llm = Ollama(
    model="llama3.3",  # 使用llama3.3模型
    request_timeout=60.0,  # 设置60秒超时
    # 手动设置上下文窗口以限制内存使用
    context_window=8000,  # 设置8000个token的上下文窗口
)

# 使用本地LLM生成文本
response = llm.complete("Hello, how are you?")
print(response)

查看自定义LLM操作指南有关使用和配置LLM模型的更多详情。

8.2 本地LLM的优势 #

隐私保护:

  • 数据完全在本地处理,不会发送到外部服务器
  • 适合处理敏感信息的企业应用

成本控制:

  • 无需支付API调用费用
  • 一次性模型下载后即可无限使用

离线使用:

  • 不依赖网络连接
  • 适合在受限网络环境中使用

自定义能力:

  • 可以微调模型以适应特定任务
  • 支持多种开源模型选择

访问验证

请输入访问令牌

Token不正确,请重新输入