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-openai2.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" |
添加制表符 | 表格格式输出 |
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调用费用
- 一次性模型下载后即可无限使用
离线使用:
- 不依赖网络连接
- 适合在受限网络环境中使用
自定义能力:
- 可以微调模型以适应特定任务
- 支持多种开源模型选择