46.llama_index-提示词模板(富提示词模板、jinja2静态和动态模板)

内容参考于:图灵AI大模型全栈

LLamaIndex提供了三个提示词模板

PromptTemplate:普通提示词模板,出现的最早,纯字符串,可以用来做文本补齐,但真正的场景都是要跟聊天一样,这种纯字符串的不会用,现代最基本的AI就要支持聊天,这个只需要做了解就可以

ChatPromptTemplate:聊天提示词模板

RichPromptTemplate:富有提示词模板,这个是LLamaIndex在2025年最新推出的提示词模板,用的最多

RichPromptTemplate富有提示词模板,用的最多所以放在最前面写

首先要知道jinja2模板,jinja2的固定语法,如下图红框,它以{%%} 开头,{%%}中两个百分号之间可以写一写限制词,然后以{%%}结尾,它里面写endchat,chat表示聊天,role表示角色

然后我们的提示词写在下图红框位置,也就是{%%}和{%%}之间

如下图它的使用,format

如下图它的使用,format_messages

调用大模型,它和ChatPromptTemplate是一样的,它们的却别ChatPromptTemplate使用的是ChatMessage对象,RichPromptTemplate使用的是jinja2语法,llamaIndex底层会把jinja2转成ChatMessage对象,为什么要用jinja2?

上方实例的代码

python 复制代码
from llama_index.core.prompts import RichPromptTemplate
from llama_index.llms.dashscope import DashScope
from dotenv import load_dotenv
import os
load_dotenv()

llm = DashScope(
    model="qwen3.7-plus",
    api_key=os.getenv("DASHSCOPE_API_KEY")
)


qa_template_str = """
    {% chat role="system" %}
        你是一个严格、准确且有帮助的AI助手。
    {% endchat %}
    
        
    {% chat role="user" %}
        以下是检索到的上下文信息:
        
        {{ xxx }}
        
        用户问题:{{ aaa }}
    
        请用中文简洁、清晰地回答:
    {% endchat %}
"""

context_str = """
    DeepSeek,全称杭州深度求索人工智能基础技术研究有限公司 [40]。DeepSeek是一家创新型科技公司 [3],成立于2023年7月17日 [40],使用数据蒸馏技术 [41],得到更为精练、有用的数据 [41]。
    由知名私募巨头幻方量化孕育而生 [3],专注于开发先进的大语言模型(LLM)和相关技术 [40]。注册地址 [6]:浙江省杭州市拱墅区环城北路169号汇金国际大厦西1幢1201室 [6]。法定代表人为裴湉 [6],
    经营范围包括技术服务、技术开发、软件开发等 [6]。
"""
# 创建模板对象
qa_template = RichPromptTemplate(qa_template_str)
# 准备变量
query = 'deepseek成立于哪一年?'
prompt_text = qa_template.format(aaa=query,xxx=context_str)
print('==================format=========================')
print(prompt_text)
res = llm.complete(prompt_text)
print('回答:')
print(res)


prompt_text = qa_template.format_messages(aaa=query,xxx=context_str)
print('\n\n==================format_messages=========================')
print(prompt_text)
res = llm.chat(prompt_text)
print('回答:')
print(res)

jinja2的优势,jinja2可以条件判断和循环,如下,现在有这样的模板

复制代码
"""
    {% chat role="system" %}
        你是一个智能助手。
    {% endchat %}
    
    {% chat role="user" %}
        {% if aaa %}
            上下文信息:
            {{ aaa }}
        {% endif %}
    
        问题:{{ xxx }}
    
        {% if need_code == "true" %}
            请同时给出完整的可运行代码示例。
        {% endif %}
    
        请用中文回答。
    {% endchat %}
"""

如下图现在有两种调用,一种是aaa的值不是空的,一种是aaa的值是空的(None表示空、不存在)

现在把模板改成,下方没有判断的

复制代码
"""
    {% chat role="system" %}
        你是一个智能助手。
    {% endchat %}
    
    {% chat role="user" %}
            上下文信息:
            {{ aaa }}
    
        问题:{{ xxx }}
    
        {% if need_code == "true" %}
            请同时给出完整的可运行代码示例。
        {% endif %}
    
        请用中文回答。
    {% endchat %}
"""

它的结果如下图红框,它把None放进提示词里了,这样的提示词ai肯定没办法理解,这就有问题

如下图在普通提示词模板中

上图一个是传了aaa但是aaa的值是None,一个是不传aaa,生成的提示词都没办法让ai使用,jinja2可以在提示词模板中写判断逻辑,这样就可以避免一些事情,这也是jinja2的优势

jinha2中的循环,如下循环examples数据,example是examples里的数据

复制代码
{% for example in examples %}

{% endfor %}

如下提示词模板

复制代码
"""
    {% chat role="system" %}
        你是一个严谨的技术助手。请参考以下示例的回答风格和结构。
    {% endchat %}
    
    {% for example in examples %}
    
        {% chat role="user" %}
            问题:{{ example.question }}
        {% endchat %}
        
        {% chat role="assistant" %}
            {{ example.answer }}
        {% endchat %}
        
    {% endfor %}
    
    {% chat role="user" %}
        问题:{{ query_str }}
    {% endchat %}
"""

如下效果图:这是一个记忆功能的模板user是问题,assistant是大模型回答的内容

这样我可以不把聊天记录存成,下方样子的列表,如果不使用RichPromptTemplate(富有提示词模板),上方的循环需要我们自己 写Python代码,就很麻烦,这样我们写一次jinja2的模板,写Python代码的时候只需要传递参数就可以了

复制代码
examples = [
    {"question": "Qwen-Plus 适合什么场景?", "answer": "Qwen-Plus 适合日常任务、长上下文处理,性价比高。"},
    {"question": "什么是 RAG?", "answer": "RAG(Retrieval-Augmented Generation)是检索增强生成技术,能让大模型使用外部知识回答问题。"}
]

它也是有format_messages和format

代码

python 复制代码
# 从 LlamaIndex 核心提示词模块导入富提示词模板类
# 类全称:RichPromptTemplate
# 核心能力:基于 Jinja2 模板引擎,支持循环、条件判断、对象属性访问、过滤器等高级逻辑
#           内置 {% chat %} 专属标签,可直接生成结构化聊天消息
# 与普通 PromptTemplate 的核心区别:
#   - 普通 PromptTemplate 仅支持简单 {变量} 占位符替换,无逻辑处理能力
#   - RichPromptTemplate 支持完整模板语法,可动态生成复杂、可变长度的提示词
# 典型适用场景:少样本提示(Few-Shot)、动态多轮对话、带条件分支的复杂提示词、批量示例渲染
from llama_index.core.prompts import RichPromptTemplate

# ====================== 定义少样本提示词模板字符串 ======================
# 模板语法规范:
#   1. 采用 Jinja2 标准模板语法
#   2. 模板内部注释使用 {# 注释内容 #},渲染时会被自动忽略,不会出现在最终提示词中
#   3. {% chat role="角色名" %} ... {% endchat %} 是 LlamaIndex 扩展标签,用于定义结构化聊天消息
#   4. {{ 变量名 }} 是变量插值语法,用于输出变量的值
#   5. {% for ... in ... %} ... {% endfor %} 是循环语法,用于遍历列表批量生成内容
# 整体结构:系统角色设定 → 循环渲染示范问答对 → 最终用户提问
# 少样本(Few-Shot)作用:通过给模型提供标准问答示例,无需微调即可统一回答的风格、结构、严谨度
few_shot_template_str = """
    {# 系统角色消息:设定全局人设、回答规则与输出要求,优先级最高,全程生效 #}
    {% chat role="system" %}
        你是一个严谨的技术助手。请参考以下示例的回答风格和结构。
    {% endchat %}

    {# 循环块:遍历外部传入的 examples 示例列表,为每条示例生成一组「用户提问+助手回答」的对话对 #}
    {# 临时变量 example:代表当前遍历到的单条示例字典,循环体内可通过 .属性名 访问字典键值 #}
    {% for example in examples %}

        {# 用户角色消息:输出当前示例的问题文本 #}
        {% chat role="user" %}
            问题:{{ example.question }}
        {% endchat %}
        
        {# 助手角色消息:输出当前示例的标准答案文本 #}
        {% chat role="assistant" %}
            {{ example.answer }}
        {% endchat %}
        
    {% endfor %}

    {# 最终用户提问:模型实际需要回答的目标问题,由外部动态传入 #}
    {% chat role="user" %}
        问题:{{ query_str }}
    {% endchat %}
"""

# ====================== 实例化富提示词模板对象 ======================
# 构造函数入参:
#   第一个位置参数:模板字符串,必须符合 Jinja2 + chat 标签语法规范
# 实例化后核心方法:
#   1. format(**kwargs):渲染模板,返回纯字符串,适配 llm.complete() 补全接口
#   2. format_messages(**kwargs):渲染模板,返回 List[ChatMessage] 结构化消息列表,适配 llm.chat() 聊天接口
few_shot_template = RichPromptTemplate(few_shot_template_str)

# ====================== 构造少样本示例数据 ======================
# 变量名:examples,类型:List[dict]
# 作用:作为示范案例传入模板,通过循环渲染到提示词中,引导模型对齐回答格式与风格
# 数据结构:每条示例为字典,必须包含 question(问题)和 answer(标准答案)两个键
# 数量建议:通常 2~5 个示例即可,过多会占用上下文窗口,过少模型无法学习到规律
examples = [
    {"question": "Qwen-Plus 适合什么场景?", "answer": "Qwen-Plus 适合日常任务、长上下文处理,性价比高。"},
    {"question": "什么是 RAG?",
     "answer": "RAG(Retrieval-Augmented Generation)是检索增强生成技术,能让大模型使用外部知识回答问题。"}
]

# ====================== 用法一:format 方法(纯字符串输出) ======================
# 方法名:format
# 入参:**kwargs,关键字参数,参数名必须与模板内的变量名完全一致(大小写敏感)
# 返回值:str 类型,渲染完成的完整纯文本提示词
# 适用场景:传给 llm.complete() 补全接口,适合纯文本续写、老式模型兼容场景
prompt_text = few_shot_template.format(
    examples=examples,
    query_str="Qwen-Max 的优势是什么?"
)

# 打印渲染结果,用于调试验证最终传给模型的纯文本内容
print('=====================format==============================')
print(prompt_text)

# ====================== 用法二:format_messages 方法(结构化消息输出)【推荐】 ======================
# 方法名:format_messages
# 入参:**kwargs,关键字参数,与 format 完全一致
# 返回值:List[ChatMessage] 类型,即结构化的聊天消息对象列表
# 核心优势:角色边界清晰,大模型对系统指令遵循度更高,上下文理解效果更好
# 适用场景:传给 llm.chat() 聊天接口,是对话、多轮问答、RAG、Agent 场景的标准用法
prompt_text = few_shot_template.format_messages(
    examples=examples,
    query_str="Qwen-Max 的优势是什么?"
)

# 打印渲染结果,用于调试验证结构化消息的角色与内容
print('=====================format_messages==============================')
print(prompt_text)

上方的写法都是jinja2的静态写法,它还有个动态的方式,就是它自己去调用Python方法获取模板中的内容

如下图效果图:

下图红框的代码表示examples的值通过get_few_shot_examples方法来获取,nnnnn的值通过ccc方法来获取

上方的代码

python 复制代码
# 从 LlamaIndex 核心提示词模块导入富提示词模板类
# 类全称:RichPromptTemplate
# 核心基础能力:基于 Jinja2 模板引擎,支持循环、条件判断、对象属性访问、过滤器等高级语法
# 进阶核心能力:支持 function_mappings 函数映射机制,可将模板变量绑定到 Python 函数
#               渲染时自动调用函数动态生成变量值,无需外部手动预处理后再传入模板
# 典型适用场景:动态少样本检索、实时数据注入、条件化内容生成等复杂提示词场景
from llama_index.core.prompts import RichPromptTemplate


# 自定义函数:动态生成少样本示例列表
# 函数定位:作为模板变量 examples 的动态数据源,渲染模板时自动被调用,返回示例数据
# 入参规则:必须使用 **kwargs 接收参数
#           渲染时模板引擎会将所有传入的上下文参数(format/format_messages 的全部入参)打包成字典传入
#           因此函数内可以通过 kwargs 获取任意上下文变量,如 query_str、aa 等
# 扩展说明:这是动态少样本(Dynamic Few-Shot)的核心实现入口
#           生产环境中此处可接入向量检索,根据用户查询从示例库中召回最相关的样例
#           相比固定示例,动态匹配的示例能显著提升回答的精准度和格式一致性
def get_few_shot_examples(**kwargs):
    # 调试标记:打印分隔线,确认函数被触发调用
    print('=====================get_few_shot_examples==============================')
    """根据用户查询动态返回最相关的示例(可结合向量检索)"""
    # 从上下文参数字典中提取用户查询字符串,默认值为空字符串
    query = kwargs.get("query_str", "")
    # 调试打印:查看提取到的用户查询内容
    print('get_few_shot_examples方法中query的值:',query)
    print(query)
    # 调试打印:查看完整的上下文参数字典,包含所有传入的变量
    print('get_few_shot_examples方法中kwargs的值:',kwargs)
    print(kwargs)
    # 此处为模拟逻辑,实际可替换为向量检索、相似度筛选等动态示例生成逻辑
    return [
        {"question": "Qwen-Plus 和 Qwen-Max 哪个更快?",
         "answer": "Qwen-Plus 通常响应更快,Qwen-Max 能力更强但速度稍慢。"},
        {"question": "如何调用 Ollama?", "answer": "使用 Ollama(model='qwen2.5:7b') 初始化模型。"}
    ]


# 自定义函数:演示普通文本变量的动态注入
# 函数定位:绑定到模板的 nnnnn 变量,渲染时自动调用,返回值作为变量的渲染内容
# 入参规范:即使不需要使用上下文参数,也建议保留 **kwargs,保证与模板引擎的参数协议兼容
def ccc(**kwargs):
    return "我是ccc"


# ====================== 实例化带函数映射的富提示词模板 ======================
# 构造参数1(位置参数):模板字符串,遵循 Jinja2 语法 + LlamaIndex 扩展的 chat 角色标签
# 构造参数2:function_mappings(核心进阶参数,函数映射字典)
#   类型:Dict[str, Callable]
#   键名:必须与模板中的变量名完全一致
#   键值:对应的 Python 可调用对象(函数、方法等)
#   工作机制:
#       渲染模板时,遇到字典中声明的变量名,不会直接读取传入的参数值
#       而是自动调用绑定的函数,将全部渲染上下文作为 kwargs 传入函数
#       最终用函数的返回值作为该变量的渲染内容
#   核心价值:将数据获取逻辑与模板定义解耦,支持动态、按需生成提示词内容,代码更易维护
dynamic_template = RichPromptTemplate(
"""
    {# 系统角色消息:设定全局人设与回答规则,优先级最高 #}
    {% chat role="system" %}
        你是一个专业助手,请参考下面的示例回答。
    {% endchat %}

    {# 用户角色消息:包含示例列表与最终待回答的问题 #}
    {% chat role="user" %}
        {# 循环遍历动态生成的示例列表,逐条输出问题与标准答案 #}
        {% for ex in examples %}
            问题:{{ ex.question }}
            答案:{{ ex.answer }}
        {% endfor %}

        现在回答:{{ query_str }}
        {# 动态注入的普通文本变量,由 ccc 函数生成内容 #}
        {{nnnnn}}
    {% endchat %}
""",
    # 函数映射配置:模板变量名 → Python 函数的绑定关系
    function_mappings={"examples": get_few_shot_examples, "nnnnn" : ccc}  # 关键:动态注入
)


# ====================== 用法一:format 方法渲染纯字符串 ======================
# 方法名:format
# 入参:**kwargs,关键字参数形式传入所有上下文变量
# 执行流程:
#   1. 收集所有传入的参数(如 query_str、aa),形成上下文参数字典
#   2. 遍历 function_mappings 配置,依次调用绑定的函数,传入完整上下文参数
#   3. 将函数返回值作为对应变量的值,和普通变量一起代入模板渲染
#   4. 返回渲染完成的纯字符串文本
# 注意事项:无需手动传入 examples 和 nnnnn,它们由绑定的函数自动生成
# 适用场景:传给 llm.complete() 补全接口,或需要纯文本提示词的场景
messages = dynamic_template.format(query_str="Qwen-Plus 和 Qwen-Max 的价格区别?",aa="11231")
print('=====================format==============================')
print(messages)


# ====================== 用法二:format_messages 方法渲染结构化消息 ======================
# 方法名:format_messages
# 入参:**kwargs,关键字参数,与 format 入参规则完全一致
# 执行流程:变量渲染、函数调用逻辑与 format 完全一致
# 返回值:List[ChatMessage] 类型,结构化的聊天消息对象列表
# 核心优势:角色边界清晰,大模型对系统指令遵循度更高,上下文理解效果更好
# 适用场景:直接传给 llm.chat() 聊天接口,是对话、多轮问答、RAG 场景的推荐用法
messages = dynamic_template.format_messages(query_str="Qwen-Plus 和 Qwen-Max 的价格区别?",aa="55555")
print('=====================format_messages==============================')
print(messages)

PromptTemplate普通提示词模板:

如下图效果图:使用PromptTemplate在提示中写{xxx}用来站位,然后使用format替换{xxx}

拿着上方的提示词去问大模型,如下效果图:

代码

python 复制代码
# 从 LlamaIndex 核心模块导入提示词模板类 PromptTemplate
# 作用:专门用来管理带占位符的提示词模板,支持变量填充、部分格式化等功能
# 相比 Python 原生的 f-string/format,它和 LlamaIndex 的整个生态(查询链、引擎、Agent)无缝对接
# 核心价值:把固定的规则、角色、输出格式沉淀成模板,只替换动态内容
#          保证每次调用大模型都遵循统一约束,输出质量稳定,也方便集中维护提示词
from llama_index.core import PromptTemplate
# 导入 Ollama 本地大模型适配类,用来调用本地运行的大模型生成回答
from llama_index.llms.ollama import Ollama

# ========== 第一步:定义提示词模板 ==========
# 创建一个提示词模板对象
# 语法规则:模板里用 {变量名} 的形式写占位符,后续通过 format 方法替换成实际内容
# 设计逻辑:
#   固定部分(角色设定、回答要求、输出格式)直接写死在模板里,永远不变
#   动态部分(用户问题、检索到的上下文)做成占位符,每次调用时动态填充
simple_template = PromptTemplate(
    """你是一个严谨的技术专家,请用专业且易懂的语言回答以下问题:

问题:{xxx}{aaa}

请用中文回答,并分点说明:
"""
)

# 两个动态输入变量,分别对应模板里的两个占位符
# 这里是演示多变量填充的用法,实际场景一般是完整的用户问题,不会拆成两段
user_input = "请用介绍一"
user_input2 = "2下python"

# ========== 第二步:填充模板,生成完整提示词 ==========
# 调用模板的 format 方法,把占位符替换成实际文本,生成最终传给大模型的完整提示词字符串
# 注意:参数名必须和模板里的占位符名(xxx、aaa)一一对应,否则会报错
formatted_prompt = simple_template.format( xxx = user_input, aaa = user_input2)

# 打印最终提示词,用于调试,方便确认传给大模型的内容是否符合预期
print("======================提示词===========================")
print(formatted_prompt)
print("\n======================回答===========================")

# ========== 第三步:调用大模型生成回答 ==========
# 初始化 Ollama 本地大模型实例
llm = Ollama(
    model='qwen2.5:7b',   # 指定调用的本地模型名称,需提前拉取到本地
    request_timeout=60    # 请求超时时间,单位秒;本地模型生成慢,调大避免中途超时报错
)

# 调用大模型的补全接口,传入格式化好的完整提示词,获取模型回复
# complete 是单轮补全接口:输入一段完整提示词,模型直接返回生成的回答内容
response = llm.complete(formatted_prompt)
# 打印回答的纯文本内容
print(response.text)

ChatPromptTemplate聊天提示词

它的调用比较复杂,如下图它有两种用法

ChatMessage(聊天)数据里有角色和内容的信息,如下图红框,角色信息

它们提问大模型的方式format_messages的提示词需要使用chat来访问大模型,chat支持传入一个数组,format的需要使用complete来访问大模型,complete只支持传入字符串

代码

python 复制代码
# ====================== 导入模块说明 ======================
# 导入 LlamaIndex 核心的聊天提示词模板类
# 类全称:ChatPromptTemplate
# 核心作用:构建多角色结构化的对话提示词模板,支持占位符变量动态填充,输出标准聊天消息列表
# 核心优势:角色边界清晰,大模型对系统指令遵循度更高,是对话、RAG、Agent场景的标准模板类型
# 必填入参:message_templates(List[ChatMessage] 类型,消息模板列表)
# 核心实例方法:
#   1. format_messages(**kwargs):填充占位符,返回结构化 ChatMessage 列表,适配 chat 聊天接口
#   2. format(**kwargs):填充占位符,返回拼接后的纯字符串,适配 complete 补全接口
#   3. partial_format(**kwargs):部分填充占位符,返回新的模板对象,支持分步填充
from llama_index.core import ChatPromptTemplate

# 从 LlamaIndex 核心LLM模块导入两个基础类
# 1. ChatMessage:单条聊天消息的封装类,是大模型聊天接口的标准数据单元
#    必填入参:role(消息角色)、content(消息内容)
#    可选入参:additional_kwargs(字典,存工具调用、元数据等扩展信息)、name(函数调用场景的函数名)
#    核心属性:.role、.content、.additional_kwargs
# 2. MessageRole:消息角色的枚举常量类,继承自 str 和 Enum
#    设计目的:统一所有角色的标准命名,避免手写字符串拼写错误,保证跨模型、跨组件的兼容性
#    所有枚举值详见下方模板定义处的详细说明
from llama_index.core.llms import ChatMessage, MessageRole

# 导入通义千问官方原生大模型适配类
# 类全称:DashScope
# 核心作用:LlamaIndex 官方对接阿里云通义千问的原生SDK,兼容性优于通用 OpenAILike,支持通义专属特性
# 必填入参:model(模型名称)、api_key(API密钥)
# 常用可选入参:
#   api_base:自定义接口地址,默认使用通义官方地址
#   temperature:生成随机性,取值0~2,越小回答越严谨
#   max_tokens:单次生成最大token长度
#   timeout:请求超时时间
# 核心实例方法:chat()、complete()、stream_chat()、stream_complete()
from llama_index.llms.dashscope import DashScope

# 导入 dotenv 库的环境变量加载函数
# 函数作用:读取项目根目录下的 .env 文件,将其中的键值对写入系统环境变量
# 可选入参:dotenv_path(指定 .env 文件的路径,默认读取当前工作目录下的 .env)
# 返回值:bool 类型,是否加载成功
from dotenv import load_dotenv

# 导入操作系统标准模块
# 此处作用:调用 os.getenv() 读取系统环境变量中的 API 密钥
import os

# 执行加载 .env 配置文件
# 执行效果:.env 文件中定义的 DASHSCOPE_API_KEY、DASHSCOPE_BASE_URL 等配置会被写入系统环境变量
# 后续 os.getenv() 才能读取到对应的值,敏感信息不用写死在代码里,更安全
load_dotenv()

# ====================== 定义聊天提示词模板 ======================
# 实例化 ChatPromptTemplate 对象,传入消息模板列表
# 注意:列表的顺序就是对话的先后顺序,大模型会按顺序读取所有消息
chat_prompt_template = ChatPromptTemplate(
    # message_templates:必选参数,类型为 List[ChatMessage]
    # 列表内按对话顺序放置带占位符的消息模板,占位符语法为 {自定义变量名}
    message_templates=[
        # ====================== MessageRole 所有枚举值完整说明 ======================
        # MessageRole 是 str + Enum 的枚举类,所有可选值及对应作用如下:
        # 1. SYSTEM = "system"       系统角色,优先级最高,用于设定全局人设、规则、格式、边界约束
        # 2. DEVELOPER = "developer" 开发者角色,新版大模型的开发者指令角色,优先级高于system,用于底层规则设定
        # 3. USER = "user"           用户角色,代表终端用户的提问、输入内容
        # 4. ASSISTANT = "assistant" 助手角色,代表AI模型的回复内容,用于维护对话历史
        # 5. FUNCTION = "function"   函数角色,旧版函数调用协议,用于返回函数执行结果
        # 6. TOOL = "tool"           工具角色,新版工具调用协议,支持多工具并行调用,需配合tool_call_id使用
        # 7. CHATBOT = "chatbot"     聊天机器人角色,部分旧框架的兼容角色,等价于assistant,用于兼容老版本
        # 8. MODEL = "model"         模型角色,部分框架的别名,等价于assistant,用于兼容不同厂商命名
        # ==========================================================================

        # 第一条消息:系统角色消息
        # 类:ChatMessage
        # 入参 role:消息角色,此处使用系统角色,设定全局规则
        # 入参 content:消息正文,字符串类型,系统角色用来写人设、回答规则、输出格式要求
        # 规则:system 消息必须放在消息列表的最开头,全程一般只写1条
        ChatMessage(
            role=MessageRole.SYSTEM, 
            content="你是一个严谨、专业且友好的中文AI技术助手。请只基于用户提供的信息回答问题,不要编造内容。"
        ),

        # 第二条消息:用户角色消息
        # 入参 role:用户角色,代表用户的输入
        # 入参 content:用户消息正文,支持占位符变量
        # 占位符说明:{xxx} 和 {aaa} 是自定义占位符,格式化时通过关键字参数传入对应的值
        # 注意:占位符名可以自定义,只要和 format 时的参数名一一对应即可,支持任意数量占位符
        ChatMessage(
            role=MessageRole.USER, 
            content="用户问题:{xxx}{aaa}\n\n请用中文回答:"
        ),
    ]
)

# ====================== 初始化通义千问大模型实例 ======================
# 实例化 DashScope 大模型对象,后续所有模型调用都通过这个对象执行
llm = DashScope(
    # model:必选参数,字符串类型,指定要调用的模型名称
    # 必须和通义千问官方支持的模型名完全一致,比如 qwen3.7-plus、qwen-turbo、qwen-max 等
    model="qwen3.7-plus",
    # api_key:必选参数,字符串类型,通义千问的API密钥
    # 从系统环境变量中读取,对应 .env 文件里的 DASHSCOPE_API_KEY 配置项
    api_key=os.getenv("DASHSCOPE_API_KEY")
)

# ====================== 用法一:format_messages + chat 聊天接口(推荐主流用法) ======================
# 调用模板的 format_messages 方法,填充占位符,生成结构化的聊天消息列表
# 方法名:format_messages
# 入参:**kwargs,关键字参数,参数名必须和模板内的占位符名(xxx、aaa)一一对应
# 返回值:List[ChatMessage] 类型,即 ChatMessage 对象组成的列表
# 适用场景:传给 llm.chat() 聊天接口,角色清晰,指令遵循度高,是对话场景的标准写法
最终的提示词 = chat_prompt_template.format_messages(xxx="请用介绍",aaa="3下python")

print("=======================ChatMessage(聊天)数据========================")
# 打印完整的结构化消息列表,可看到每条消息的 role、content 等属性,用于调试
print(最终的提示词)

# 调用大模型的 chat 聊天接口,传入结构化消息列表,获取模型回复
# 方法名:chat
# 必填入参:messages,类型 List[ChatMessage],对话消息列表
# 可选入参:temperature、max_tokens 等生成参数,会覆盖模型初始化时的全局配置
# 返回值:ChatResponse 类型的响应对象
# 返回值核心属性:
#   .message:ChatMessage 类型,模型回复的完整消息对象
#   .message.role:str 类型,回复的角色,固定为 "assistant"
#   .message.content:str 类型,模型回复的纯文本内容
#   .raw:dict 类型,通义千问接口返回的原始完整数据
#   .additional_kwargs:dict 类型,附加参数,包含工具调用等扩展信息
res = llm.chat(最终的提示词)
print("回答:")
# 直接打印响应对象,LlamaIndex 做了字符串优化,默认会输出回复的纯文本内容
print(res)


# ====================== 用法二:format + complete 补全接口(兼容老式模型) ======================
# 调用模板的 format 方法,填充占位符,将所有消息拼接成一段纯字符串
# 方法名:format
# 入参:**kwargs,关键字参数,和模板内占位符一一对应
# 返回值:str 类型,拼接后的完整纯文本提示词
# 适用场景:传给 llm.complete() 补全接口,兼容老式补全模型,对话效果弱于 chat 方式
最终的提示词 = chat_prompt_template.format(xxx="请用介绍",aaa="3下python")

print("\n\n=======================纯字符串========================")
# 打印拼接后的纯文本提示词,用于调试查看最终传给模型的文本内容
print(最终的提示词)

# 调用大模型的 complete 文本补全接口,传入纯文本提示词,获取模型续写结果
# 方法名:complete
# 必填入参:prompt,str 类型,输入的完整提示词文本
# 可选入参:temperature、max_tokens 等生成参数
# 返回值:CompletionResponse 类型的响应对象
# 返回值核心属性:
#   .text:str 类型,模型生成的纯文本内容
#   .raw:dict 类型,接口返回的原始完整数据
#   .additional_kwargs:dict 类型,附加扩展参数
res = llm.complete(最终的提示词)
print("回答:")
# 直接打印响应对象,默认输出模型生成的纯文本回答
print(res)

相关推荐
leonshi2 小时前
Embedchain 是什么?用最简单的话讲清楚一个"AI 知识问答工具框架"
ai·rag
weigangwin4 小时前
LlamaIndex 第一次试用:别先写 RAG Demo,先验上下文合同
python·ai·agent·rag·检索·llamaindex·观测性
阿拉斯攀登4 小时前
Embedding 模型选择与领域适配
人工智能·chatgpt·embedding·agent·ai编程·loop·rag
zhoupenghui1681 天前
【AI大模型应用开发】【项目实战】13.RAG智慧问答项目-(一)项目介绍&项目架构&项目环境配置
人工智能·docker·ai·milvus·rag·attu·rag智慧问答项目
Devin~Y1 天前
抖音级短视频推荐与直播带货平台面试实战:从 Java 微服务到 RAG 智能客服全链路解析
java·spring boot·redis·spring cloud·kafka·agent·rag
阿拉斯攀登1 天前
企业级RAG架构:权限控制、安全防护与多租户
检索增强·知识库·向量数据库·rag·企业级应用
捧 花1 天前
YoudaoNoteLM 分层混合 RAG 系统:从多源接入到智能问答的全链路技术架构
架构·llm·agent·rag
meilindehuzi_a1 天前
从零开始:用原生 Node.js 徒手拆解 RAG 与向量检索底层原理
node.js·rag
阿拉斯攀登1 天前
Agent 框架对比:LangChain / AutoGPT / CrewAI
人工智能·langchain·agent·rag·function