在大语言模型(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. 自报身份为「瓜瓜」;
  2. 回答范围限定在「这是一个测试」的上下文内;
  3. 精准回应了「你是谁,我们在干什么」的问题。

三、核心优势与扩展场景

1. 核心优势

  • 结构化约束:通过ChatMessage的角色划分,明确模型的行为边界,避免回答偏离预设规则;
  • 动态复用:变量占位符支持不同场景下的参数替换,无需重复编写模板;
  • 适配性强:基于 OpenAI-Like 适配层,可无缝切换至其他兼容 OpenAI 接口的大模型(如 GPT-3.5/4、通义千问、文心一言等);
  • 轻量化集成:无需复杂的对话管理逻辑,LlamaIndex 已封装好核心交互流程,降低开发成本。

2. 典型扩展场景

  • 知识库问答:将{context}替换为从文档检索到的相关内容,实现检索增强生成(RAG);
  • 多角色客服:通过动态修改{name}和系统指令,实现不同身份的客服机器人(如售后、售前、技术支持);
  • 场景化对话:在系统指令中添加行业规则(如医疗、金融),约束模型在特定领域内回答问题;
  • 多轮对话:扩展ChatMessage列表,加入MessageRole.ASSISTANT(助手)角色的历史回答,实现多轮上下文交互。

四、关键优化建议

  1. 指令精准性:系统指令需简洁明确,避免模糊表述(如将 “尽量根据上下文回答” 改为 “必须仅基于提供的上下文回答,禁止使用外部知识”);
  2. 变量校验:在填充变量前增加校验逻辑,确保{context}{question}非空,避免模型生成无意义回答;
  3. 模板拆分:将通用系统指令抽离为独立模板,不同场景仅修改用户侧内容,提升维护效率;
  4. 响应格式约束:在系统指令中添加格式要求(如 “回答需分点列出”“回答控制在 50 字以内”),统一输出规范。

总结

  1. LlamaIndex 的ChatPromptTemplate通过角色化的ChatMessage设计,可精准定义模型的交互规则,结合变量占位符实现模板的动态复用;
  2. 千问模型通过OpenAILike适配层可无缝接入 LlamaIndex,无需修改核心代码即可替换为其他兼容 OpenAI 接口的大模型;
  3. 结构化提示词模板是约束模型行为、提升回答精准度的核心手段,可快速适配知识库问答、客服机器人等多类场景。

实例完整代码

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)'''

 

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐