教程https://www.bilibili.com/video/BV1yjz5BLEoY代码https://github.com/shangxiang0907/HeiMa-AI-LLM-RAG-Agent-Dev云开发平台https://hzh.sealos.run文章目录RAG开发-13、模板类的format和invoke方法继承关系format()方法和invoke()方法的区别→提示词根据上面两张图片帮我生成代码18←AI回复18_LangChain_PromptTemplate_Format_vs_Invoke.py运行代码RAG开发-13、模板类的format和invoke方法继承关系format()方法和invoke()方法的区别→提示词根据上面两张图片帮我生成代码18←AI回复18_LangChain_PromptTemplate_Format_vs_Invoke.py FewShot 提示词模板FewShotPromptTemplate用法示例 本示例演示如何使用 LangChain 的 FewShotPromptTemplate 来构建少样本学习Few-Shot Learning提示词。 FewShotPromptTemplate 的核心参数 - examples: 示例数据list内套字典每个字典代表一个示例 - example_prompt: 示例数据的提示词模板PromptTemplate用于格式化每个示例 - prefix: 组装提示词示例数据前的内容 - suffix: 组装提示词示例数据后的内容通常包含用户输入变量 - input_variables: 列表注入的变量列表在 suffix 中使用的变量 工作流程 1. 使用 example_prompt 格式化 examples 中的每个示例 2. 将 prefix 格式化后的示例 suffix 组合成最终提示词 3. 将 input_variables 中的变量注入到 suffix 中 本示例包含两个演示 1. 反义词示例根据给定的示例让模型推断新词的反义词 2. 情感分析示例根据给定的示例让模型分析文本的情感倾向 importosfromtypingimportDict,Listfromdotenvimportload_dotenvfromlangchain_core.promptsimportFewShotPromptTemplate,PromptTemplatefromlangchain_community.llms.tongyiimportTongyidefinit_llm()-Tongyi: 初始化 Tongyi LLM 模型实例。 优先从以下环境变量中读取密钥依次回退 - DASHSCOPE_API_KEY阿里云官方推荐 - API_KEY与本项目其他示例保持兼容 load_dotenv()api_keyos.getenv(DASHSCOPE_API_KEY)oros.getenv(API_KEY)ifnotapi_key:raiseValueError(未找到 DASHSCOPE_API_KEY 或 API_KEY 环境变量请先在 .env 或系统环境中配置后再运行。)# LangChain 的 Tongyi 封装会自动从环境变量中读取 key# 这里设置一份到 DASHSCOPE_API_KEY确保兼容性。os.environ[DASHSCOPE_API_KEY]api_key# 与课件及其他示例保持一致使用 qwen-max 模型llmTongyi(modelqwen-max)returnllmdefdemo_antonym_fewshot(llm:Tongyi)-None: 演示 FewShotPromptTemplate 在反义词推断任务中的应用。 通过提供几个「词-反义词」的示例让模型学习模式并推断新词的反义词。 print(*80)print(【示例1】反义词推断FewShot 提示词模板)print(-*80)# Step 1: 定义示例数据的模板# 这个模板用于格式化每个示例将示例数据中的 word 和 antonym 填入example_templatePromptTemplate.from_template(单词:{word},反义词:{antonym})# Step 2: 准备示例数据list内套字典# 每个字典包含一个示例的 word 和 antonymexample_data[{word:大,antonym:小},{word:上,antonym:下},]# Step 3: 创建 FewShotPromptTemplate# - example_prompt: 用于格式化每个示例的模板# - examples: 示例数据列表# - prefix: 示例数据前的内容说明任务和提供示例# - suffix: 示例数据后的内容包含用户输入变量# - input_variables: 在 suffix 中使用的变量列表few_shot_promptFewShotPromptTemplate(example_promptexample_template,examplesexample_data,prefix给出给定词的反义词,有如下示例:,suffix基于示例告诉我:{input_word1}和{input_word2}的反义词是?,input_variables[input_word1,input_word2],)# Step 4: 使用 FewShotPromptTemplate 生成最终提示词# 方法1使用 invoke 方法推荐返回 PromptValue 对象prompt_valuefew_shot_prompt.invoke(input{input_word1:高大,input_word2:娴熟})prompt_textprompt_value.to_string()print(生成的 FewShot 提示词\n)print(prompt_text)print(\n模型回复\n)# Step 5: 将生成的提示词发送给模型resllm.invoke(prompt_text)print(res)print()# 也可以直接使用 chain 的方式print(-*80)print(使用 Chain 方式FewShotPromptTemplate | LLM\n)chainfew_shot_prompt|llm res2chain.invoke(input{input_word1:高大,input_word2:娴熟})print(f输入词高大和娴熟)print(f模型回复{res2})print()defdemo_sentiment_analysis_fewshot(llm:Tongyi)-None: 演示 FewShotPromptTemplate 在情感分析任务中的应用。 通过提供几个「文本-情感」的示例让模型学习模式并分析新文本的情感倾向。 print(*80)print(【示例2】情感分析FewShot 提示词模板)print(-*80)# Step 1: 定义示例数据的模板example_templatePromptTemplate.from_template(文本{text}\n情感{sentiment})# Step 2: 准备示例数据example_data[{text:今天天气真好心情特别愉快,sentiment:积极},{text:这个产品质量太差了完全不值这个价格。,sentiment:消极},{text:这部电影还可以但剧情有点拖沓。,sentiment:中性},]# Step 3: 创建 FewShotPromptTemplatefew_shot_promptFewShotPromptTemplate(example_promptexample_template,examplesexample_data,prefix请根据以下示例分析文本的情感倾向。\n示例,suffix\n请分析以下文本的情感倾向\n文本{input_text}\n情感,input_variables[input_text],)# Step 4: 生成提示词并调用模型test_text虽然遇到了困难但我相信只要努力就能克服。print(f待分析文本{test_text}\n)prompt_valuefew_shot_prompt.invoke(input{input_text:test_text})prompt_textprompt_value.to_string()print(生成的 FewShot 提示词\n)print(prompt_text)print(\n模型回复\n)resllm.invoke(prompt_text)print(res)print()defdemo_fewshot_parameters_explanation()-None: 解释 FewShotPromptTemplate 各个参数的作用。 print(*80)print(【FewShotPromptTemplate 参数说明】)print(*80)print()print(FewShotPromptTemplate 的主要参数)print()print(1. examples (list[dict]):)print( - 示例数据是一个列表每个元素是一个字典)print( - 字典的键对应 example_prompt 模板中的变量名)print( - 例如[{\word\: \大\, \antonym\: \小\}, ...])print()print(2. example_prompt (PromptTemplate):)print( - 用于格式化每个示例的提示词模板)print( - 模板中的变量名必须与 examples 中字典的键匹配)print( - 例如PromptTemplate.from_template(\单词:{word},反义词:{antonym}\))print()print(3. prefix (str):)print( - 组装提示词时放在示例数据前面的内容)print( - 通常用于说明任务要求和提供上下文)print( - 例如\给出给定词的反义词,有如下示例:\)print()print(4. suffix (str):)print( - 组装提示词时放在示例数据后面的内容)print( - 通常包含用户输入变量在 input_variables 中定义)print( - 例如\基于示例告诉我:{input_word}的反义词是?\)print()print(5. input_variables (list[str]):)print( - 在 suffix 中使用的变量列表)print( - 调用 invoke() 时需要提供这些变量的值)print( - 例如[\input_word\])print()print(最终提示词的组装顺序)print( prefix (example_prompt 格式化后的示例1) (example_prompt 格式化后的示例2) ... suffix)print()print(*80)print()defmain()-None: 主函数演示 LangChain 中 FewShotPromptTemplate 的用法。 print(*80)print(LangChain FewShot 提示词模板FewShotPromptTemplate用法示例)print(*80)print()# 参数说明demo_fewshot_parameters_explanation()# 初始化模型llminit_llm()# 示例1反义词推断demo_antonym_fewshot(llm)# 示例2情感分析demo_sentiment_analysis_fewshot(llm)print(*80)print(演示结束)print(*80)if__name____main__:main()运行代码python3 AI_LLM_RAG_Agent_Dev/18_LangChain_PromptTemplate_Format_vs_Invoke.py LangChain PromptTemplate / FewShotPromptTemplateformat vs invoke 示例 【部分一】PromptTemplate 中 format 与 invoke 的对比 [1] 使用 format(...) 生成提示词返回 str 生成的提示词文本 我的邻居姓张刚生了女儿你帮我起个名字简单回答。 模型回复format 方式 张婉晴 -------------------------------------------------------------------------------- [2] 使用 invoke({...}) 生成提示词返回 PromptValue PromptTemplate.invoke(...) 返回的 PromptValue.to_string() 我的邻居姓李刚生了儿子你帮我起个名字简单回答。 模型回复invoke 方式 李明泽 【部分二】FewShotPromptTemplate 中 invoke 的用法 FewShotPromptTemplate.invoke(...).to_string() 生成的提示词 给出给定词的反义词,有如下示例: 单词:大,反义词:小 单词:上,反义词:下 基于示例告诉我:左的反义词是? 模型回复 基于您给出的示例左的反义词是右。 【部分三】format 与 invoke 的对比总结 维度 | format | invoke -------------------------------------------------------------------------------------- 功能 | 纯字符串替换解析 {} 占位符生成提示词 | Runnable 标准方法解析占位符生成 PromptValue 返回值 | str普通字符串 | PromptValue可进一步转换为 str 或消息结构 传参方式 | .format(kv, kv, ...) | .invoke(input{k: v, k: v, ...}) 占位符类型 | 支持 {} 占位符 | 支持 {} 占位符也支持 MessagesPlaceholder 等结构... 提示 1在只需要一个纯文本提示词时用 format 更直观 2在要与 Runnable 生态链、流水线等配合时推荐使用 invoke。 演示结束 ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ