LlamaIndex(十)Chat技术 基于 LlamaIndex 与千问模型构建定制化对话提示词模板
本文介绍了基于LlamaIndex框架和阿里云千问大模型的提示词工程实践,重点讲解了如何使用ChatPromptTemplate构建结构化对话模板。通过系统角色定义和用户问答模板,结合变量占位符实现动态内容填充,可精准控制模型响应行为。文章详细展示了环境配置、模板设计、调用方法等核心环节,并提供了知识库问答、多角色客服等扩展场景建议,为开发者提供了高效构建定制化对话系统的技术方案。
在大语言模型(LLM)应用开发中,提示词工程(Prompt Engineering)是提升模型响应精准度和贴合度的核心环节。本文将以 LlamaIndex 框架为基础,结合阿里云千问(DashScope)大模型,详细讲解如何通过ChatPromptTemplate构建结构化的对话提示词模板,实现定制化的上下文问答交互,让模型严格遵循预设规则生成符合预期的回答。
一、技术基础与环境准备
1. 核心依赖安装
本次实践基于 LlamaIndex 的 OpenAI-Like 适配层对接千问模型,需先安装核心依赖:
# 核心LLM适配库
pip install llama-index-llms-openai-like
# 环境变量管理
pip install python-dotenv
- llama-index-llms-openai-like:为 LlamaIndex 提供兼容 OpenAI 接口规范的 LLM 适配能力,可无缝对接千问等兼容该规范的大模型;
- python-dotenv:用于安全加载环境变量,避免硬编码 API 密钥等敏感信息。
2. 千问模型接入配置
千问模型通过阿里云 DashScope 平台提供服务,需先在.env文件中配置 API 密钥(DASHSCOPE_API_KEY=你的密钥),再通过OpenAILike类完成模型初始化:
import os
from dotenv import load_dotenv
from llama_index.llms.openai_like import OpenAILike
# 加载环境变量
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY")
# 初始化千问大模型
llm = OpenAILike(
model="qwen-plus", # 千问增强版模型,兼顾效果与响应速度
api_base="https://dashscope.aliyuncs.com/compatible-mode/v1", # 兼容OpenAI接口的网关地址
api_key=api_key,
is_chat_model=True # 标记为对话型模型,适配ChatMessage交互模式
)
二、对话提示词模板构建核心逻辑
LlamaIndex 的ChatPromptTemplate基于角色(Role)和内容(Content)的结构化设计,可精准定义系统指令、用户输入等对话环节,核心优势是支持变量占位符,能动态填充上下文、问题、定制化名称等内容。
1. 模板结构设计
我们构建一个包含「系统角色定义」和「用户上下文问答」的双阶段模板:
from llama_index.core import ChatPromptTemplate
from llama_index.core.base.llms.types import ChatMessage, MessageRole
# 定义对话消息列表,按交互顺序排列
chat_text_qa_msgs = [
# 系统角色:定义模型的身份和核心规则
ChatMessage(
role=MessageRole.SYSTEM,
content="你叫{name},你必须根据用户提供的上下文回答问题。",
),
# 用户角色:提供上下文和具体问题
ChatMessage(
role=MessageRole.USER,
content=(
"已知上下文:\n"
"{context}\n\n"
"问题:{question}"
)
),
]
# 将消息列表封装为ChatPromptTemplate
text_qa_template = ChatPromptTemplate(chat_text_qa_msgs)
- MessageRole.SYSTEM:系统指令角色,用于约束模型的行为准则、身份设定,优先级最高,模型会严格遵循该角色的要求;
- MessageRole.USER:用户角色,传递具体的交互内容,包含上下文和待解答的问题;
- 变量占位符:
{name}、{context}、{question}为动态变量,可在调用时灵活填充,提升模板复用性。
2. 模板调用与结果输出
通过format方法填充模板变量,再调用模型的complete方法生成回答:
# 填充模板变量并调用模型
response = llm.complete(text_qa_template.format(
name="瓜瓜", # 定制模型名称
context="这是一个测试", # 限定回答的上下文范围
question="你是谁,我们在干什么" # 用户具体问题
))
# 输出模型生成的回答
print(response.text)
预期输出示例:
我是瓜瓜,根据你提供的上下文“这是一个测试”,我们现在正在进行一个测试相关的对话哦。
从输出结果可以看到,模型严格遵循了系统指令:
- 自报身份为「瓜瓜」;
- 回答范围限定在「这是一个测试」的上下文内;
- 精准回应了「你是谁,我们在干什么」的问题。
三、核心优势与扩展场景
1. 核心优势
- 结构化约束:通过
ChatMessage的角色划分,明确模型的行为边界,避免回答偏离预设规则; - 动态复用:变量占位符支持不同场景下的参数替换,无需重复编写模板;
- 适配性强:基于 OpenAI-Like 适配层,可无缝切换至其他兼容 OpenAI 接口的大模型(如 GPT-3.5/4、通义千问、文心一言等);
- 轻量化集成:无需复杂的对话管理逻辑,LlamaIndex 已封装好核心交互流程,降低开发成本。
2. 典型扩展场景
- 知识库问答:将
{context}替换为从文档检索到的相关内容,实现检索增强生成(RAG); - 多角色客服:通过动态修改
{name}和系统指令,实现不同身份的客服机器人(如售后、售前、技术支持); - 场景化对话:在系统指令中添加行业规则(如医疗、金融),约束模型在特定领域内回答问题;
- 多轮对话:扩展
ChatMessage列表,加入MessageRole.ASSISTANT(助手)角色的历史回答,实现多轮上下文交互。
四、关键优化建议
- 指令精准性:系统指令需简洁明确,避免模糊表述(如将 “尽量根据上下文回答” 改为 “必须仅基于提供的上下文回答,禁止使用外部知识”);
- 变量校验:在填充变量前增加校验逻辑,确保
{context}和{question}非空,避免模型生成无意义回答; - 模板拆分:将通用系统指令抽离为独立模板,不同场景仅修改用户侧内容,提升维护效率;
- 响应格式约束:在系统指令中添加格式要求(如 “回答需分点列出”“回答控制在 50 字以内”),统一输出规范。
总结
- LlamaIndex 的
ChatPromptTemplate通过角色化的ChatMessage设计,可精准定义模型的交互规则,结合变量占位符实现模板的动态复用; - 千问模型通过
OpenAILike适配层可无缝接入 LlamaIndex,无需修改核心代码即可替换为其他兼容 OpenAI 接口的大模型; - 结构化提示词模板是约束模型行为、提升回答精准度的核心手段,可快速适配知识库问答、客服机器人等多类场景。
实例完整代码
import os
from llama_index.core import PromptTemplate, ChatPromptTemplate
from llama_index.core.base.llms.types import ChatMessage, MessageRole
from llama_index.llms.openai_like import OpenAILike
#pip install llama-index-llms-openai-like
# 所调用的模型
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY")
llm = OpenAILike(
model="qwen-plus",
api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key=api_key,
is_chat_model=True
)
chat_text_qa_msgs = [
ChatMessage(
role=MessageRole.SYSTEM,
content="你叫{name},你必须根据用户提供的上下文回答问题。",
),
ChatMessage(
role=MessageRole.USER,
content=(
"已知上下文:\n"
"{context}\n\n"
"问题:{question}"
)
),
]
text_qa_template = ChatPromptTemplate(chat_text_qa_msgs)
response = llm.complete(text_qa_template.format(
name="瓜瓜",
context="这是一个测试",
question="你是谁,我们在干什么"
))
print(response.text)
例子2
import os
from llama_index.core import PromptTemplate
from llama_index.llms.openai_like import OpenAILike
#pip install llama-index-llms-openai-like
# 所调用的模型
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY")
llm = OpenAILike(
model="qwen-plus",
api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key=api_key,
is_chat_model=True
)
prompt = PromptTemplate("写一个关于{topic}的笑话")
response = llm.complete(prompt.format(topic="小明"))
print(response.text)
例子3
import os
from llama_index.llms.openai_like import OpenAILike
#pip install llama-index-llms-openai-like
# 所调用的模型
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY")
llm = OpenAILike(
model="qwen-plus",
api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key=api_key,
is_chat_model=True
)
response = llm.complete("帮我推荐一下江浙沪5天的旅游攻略。")
print(response)
'''import os
from llama_index.llms.dashscope import DashScope
llm = DashScope(model_name="qwen-plus", api_key=os.getenv("DASHSCOPE_API_KEY"))
response = llm.complete("帮我推荐一下江浙沪5天的旅游攻略。")
print(response)'''
更多推荐



所有评论(0)