LlamaIndex LLM 入门教程
本 Notebook 介绍如何使用 LlamaIndex 的 LLM 接口与大语言模型交互。涵盖基础补全、流式输出、多轮对话、多模态输入和函数调用等功能。
核心组件
| 组件 | 说明 |
|---|---|
OpenAILike |
兼容 OpenAI API 协议的 LLM 客户端,支持通义千问、DeepSeek 等国产大模型 |
ChatMessage |
对话消息对象,支持 system/user/assistant/tool 等角色 |
TextBlock / ImageBlock |
消息内容块,支持文本和图片混合输入 |
FunctionTool |
工具封装,可将 Python 函数转换为 LLM 可调用的工具 |
本教程涵盖
- 基础文本补全(通义千问 / DeepSeek)
- 流式输出(Streaming)
- 多轮对话(Chat)
- 多模态输入(图片 + 文本)
- 函数调用(Function Calling)
1. 导入配置
从 config 模块导入环境变量配置,包含各 LLM 服务的 API 密钥和端点地址。
PYTHON
# 从配置文件导入环境变量(API Key、模型名称、端点地址等)from config import envconfig
2. 基础文本补全 — 通义千问
使用 llm.complete() 进行基础文本补全。这是最简单的 LLM 调用方式,适合单轮问答。
关键参数:
context_window=128000: 上下文窗口大小,决定模型能处理的最大 token 数is_chat_model=True: 使用对话接口is_function_calling_model=False: 本例不需要函数调用能力
返回值: CompletionResponse 对象,可通过 str(response) 获取文本内容
PYTHON
from llama_index.llms.openai_like import OpenAILike
# 初始化通义千问,context_window 设为 128K 以支持长文本
llm = OpenAILike(
model=envconfig.ALIYUN_LLM_MODEL,
api_base=envconfig.DASHSCOPE_BASE_URL,
api_key=envconfig.DASHSCOPE_API_KEY,
context_window=128000,
is_chat_model=True,
is_function_calling_model=False,
)
# 基础补全:单轮问答,返回 CompletionResponse 对象
response = llm.complete("你是谁")
print(str(response))
3. 基础文本补全 — DeepSeek
切换到 DeepSeek 模型,展示如何通过修改配置快速切换不同的 LLM 服务。
DeepSeek 特点:
- 支持超长上下文(最高 1M tokens)
- 内置思维链推理能力
should_use_structured_outputs=True: 启用结构化输出,返回更规范的响应格式
注意: 同一个 OpenAILike 接口,只需更换 model、api_base、api_key 即可接入不同的 LLM 服务。
PYTHON
from llama_index.llms.openai_like import OpenAILike
# 切换到 DeepSeek,同一接口只需更换配置即可接入不同 LLM
llm = OpenAILike(
model=envconfig.DEEPSEEK_LLM_MODEL_FLASH,
api_base=envconfig.DEEPSEEK_BASE_URL,
api_key=envconfig.DEEPSEEK_API_KEY,
context_window=128000,
is_chat_model=True,
is_function_calling_model=False,
should_use_structured_outputs=True # 启用结构化输出
)
response = llm.complete("你是谁")
print(str(response))
4. 流式输出(Streaming)
使用 llm.stream_complete() 实现流式输出。模型会逐 token 返回结果,而不是等待全部生成完毕后一次性返回。
优势:
- 低延迟: 用户可以立即看到部分输出,无需等待完整响应
- 用户体验好: 文本逐字显示,类似打字机效果
- 适合长文本: 无需等待整个回复生成完毕
使用方式:
PYTHON
response = llm.stream_complete("问题")
for chunk in response:
print(chunk.delta, end="", flush=True)
chunk.delta: 当前增量文本flush=True: 实时刷新输出,避免缓冲
PYTHON
from llama_index.llms.openai_like import OpenAILike
llm = OpenAILike(
model=envconfig.DEEPSEEK_LLM_MODEL_FLASH,
api_base=envconfig.DEEPSEEK_BASE_URL,
api_key=envconfig.DEEPSEEK_API_KEY,
context_window=128000,
is_chat_model=True,
is_function_calling_model=False,
should_use_structured_outputs=True
)
# 流式输出:逐 token 返回,适合长文本场景
response = llm.stream_complete("江户川柯南是谁")
for chunk in response:
print(chunk.delta, end="",flush=True) # delta 为当前增量文本
5. 多轮对话(Chat)
使用 llm.chat() 和 llm.stream_chat() 进行多轮对话。与 complete() 不同,chat() 支持消息列表,可以指定每条消息的角色。
消息角色:
| 角色 | 说明 |
|---|---|
system |
系统提示,设定 AI 的行为和人格 |
user |
用户消息 |
assistant |
AI 回复 |
tool |
工具调用结果 |
同步 vs 异步:
llm.chat(messages)— 同步调用,阻塞等待结果llm.achat(messages)— 异步调用,适用于并发场景llm.stream_chat(messages)— 流式对话llm.astream_chat(messages)— 异步流式对话
PYTHON
from llama_index.core.llms import ChatMessage, TextBlock, ImageBlock
llm = OpenAILike(
model=envconfig.ALIYUN_LLM_MODEL,
api_base=envconfig.DASHSCOPE_BASE_URL,
api_key=envconfig.DASHSCOPE_API_KEY,
context_window=128000,
is_chat_model=True,
is_function_calling_model=False,
)
# 构造消息列表:system 设定角色,user 为用户输入
messages = [
ChatMessage(role="system", content="You are a helpful assistant."),
ChatMessage(role="user", content="讲一个幽默笑话"),
]
# 同步对话
response = llm.chat(messages=messages)
# response = llm.achat(messages=messages) # 异步调用
# 流式对话:逐 token 输出
response2 = llm.stream_chat(messages=messages)
# response = llm.astream_chat(messages=messages) # 异步流式
print(response)
print("====================")
for chunk in response2:
print(chunk.delta,end="",flush=True)
6. 多模态输入(图片 + 文本)
使用 ImageBlock 和 TextBlock 实现图文混合输入。模型可以同时理解图片和文本内容。
消息结构:
PYTHON
ChatMessage(
role="user",
blocks=[
ImageBlock(url="图片URL"), # 图片内容
TextBlock(text="文本问题"), # 文本问题
],
)
支持的输入方式:
ImageBlock(url=...): 通过 URL 引用图片TextBlock(text=...): 文本内容- 多个 Block 可以组合在同一消息中
示例: 上传一张菜品图片,让模型识别并给出制作方法
PYTHON
from llama_index.core.llms import ChatMessage, TextBlock, ImageBlock
from llama_index.llms.openai_like import OpenAILike
llm = OpenAILike(
model=envconfig.ALIYUN_LLM_MODEL,
api_base=envconfig.DASHSCOPE_BASE_URL,
api_key=envconfig.DASHSCOPE_API_KEY,
context_window=128000,
is_chat_model=True,
is_function_calling_model=False,
)
# 多模态输入:使用 ImageBlock + TextBlock 组合图文消息
messages = [
ChatMessage(
role="user",
blocks=[
ImageBlock(url="https://howtocook.aiursoft.com/download/recipe-images/4d8684604c4d4890bfe074802bcdb432.jpg"),
TextBlock(text="这道菜是什么,如何制作"),
],
)
]
# 模型同时理解图片和文本,流式返回分析结果
resp = llm.stream_chat(messages)
for chunk in resp:
print(chunk.delta,end="",flush=True)
7. 函数调用(Function Calling)
使用 llm.predict_and_call() 让 LLM 自动决定是否调用工具函数。这是构建 Agent 的基础能力。
工作流程:
- 定义 Python 函数(如
generate_song),函数的 docstring 会作为工具描述传递给 LLM - 使用
FunctionTool.from_defaults(fn=...)将函数封装为工具 - 调用
llm.predict_and_call([tool], user_message) - LLM 根据用户意图自动决定是否调用工具、传什么参数
- 框架自动执行工具函数并返回结果
关键点:
- 函数的 docstring 非常重要,LLM 依赖它来理解工具的用途
- 参数类型注解(type hints)帮助 LLM 正确传递参数
is_function_calling_model=True是使用此功能的前提
示例: LLM 自动调用 generate_song 生成一首随机歌曲
PYTHON
from llama_index.core.tools import FunctionTool
from llama_index.llms.openai_like import OpenAILike
llm = OpenAILike(
model=envconfig.ALIYUN_LLM_MODEL,
api_base=envconfig.DASHSCOPE_BASE_URL,
api_key=envconfig.DASHSCOPE_API_KEY,
context_window=128000,
is_chat_model=True,
is_function_calling_model=True, # 函数调用必须开启
)
# 工具函数:docstring 描述用途,type hints 帮助 LLM 传参
def generate_song(name: str, artist: str):
"""Generates a song with provided name and artist."""
return {"name": name, "artist": artist}
# 将 Python 函数封装为 LLM 可调用的工具
tool = FunctionTool.from_defaults(fn=generate_song)
# LLM 自动决定调用工具并传入参数
response = llm.predict_and_call(
[tool],
"Pick a random song for me",
)
print(str(response))
本文是原创文章,采用 CC BY-NC-SA 4.0 协议,完整转载请注明来自 十七天天开心
评论
隐私政策
0/500
滚动到此处加载评论...
