内容参考于:图灵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?
上方实例的代码
pythonfrom 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)


















