这个代码的核心功能是基于输入词的长度动态选择反义词示例并调用大模型生成反义词体现了“动态少样本提示Dynamic Few-Shot Prompting”与“上下文长度感知的示例选择”的能力。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596fromlangchain.promptsimportFewShotPromptTemplate, PromptTemplatefromlangchain.prompts.example_selectorimportLengthBasedExampleSelectorfromlangchain_core.output_parsersimportStrOutputParserfromlangchain_openaiimportChatOpenAIimportosfromdotenvimportload_dotenv# 定义反义词任务的示例数据集few-shot examples# 每个示例包含一个输入词input和对应的反义词outputexamples[{input:开心,output:伤心},{input:高,output:矮},{input:精力充沛,output:没精打采},{input:粗,output:细},]# 定义单个示例的格式模板# 使用 {input} 和 {output} 作为占位符用于后续填充具体值example_promptPromptTemplate(input_variables[input,output],# 声明模板中使用的变量名templateInput: {input}\nOutput: {output},# 示例的文本格式)# 创建一个基于长度的示例选择器LengthBasedExampleSelector# 作用根据输入提示的总长度动态选择最合适的示例数量避免超出模型上下文限制example_selectorLengthBasedExampleSelector(examplesexamples,# 提供所有候选示例example_promptexample_prompt,# 用于格式化每个示例的模板max_length25,# 设定整个 prompt含前缀、示例、后缀的最大 token 长度此处为字符数近似# 注意LengthBasedExampleSelector 默认使用 len(text) 计算长度非精确 token 数适用于简单场景)# 构建动态少样本提示模板FewShotPromptTemplate# 它会根据输入内容的长度自动从 examples 中选择合适数量的示例插入到 prompt 中dynamic_promptFewShotPromptTemplate(example_selectorexample_selector,# 使用上面定义的动态选择器而非固定示例列表example_promptexample_prompt,# 单个示例的格式prefix给出每个输入的反义词,# 提示的开头部分任务指令suffixInput: {adjective}\nOutput:,# 提示的结尾部分包含待预测的输入占位符input_variables[adjective],# 声明最终用户输入的变量名与 suffix 中的 {adjective} 对应)# 测试 1输入较短应选择多个示例 print(【测试1】输入较短选择多个示例)print(dynamic_prompt.format(adjectivebig))print(------------)# 测试 2输入很长应只选择少量或一个示例以控制总长度 long_stringbig and huge and massive and large and gigantic and tall and much much much much much bigger than everything elseprint(【测试2】输入很长仅选择一个示例)print(dynamic_prompt.format(adjectivelong_string))print(------------)# 测试 3动态添加新示例 # 向示例选择器中新增一个示例胖 - 瘦new_example{input:胖,output:瘦}dynamic_prompt.example_selector.add_example(new_example)print(【测试3】添加新示例后查询热情)print(dynamic_prompt.format(adjective热情))print(------------)# 配置并调用 DeepSeek 大语言模型 llmChatOpenAI(api_keyos.getenv(DEEPSEEK_API_KEY),base_urlos.getenv(DEEP_URL),# Deepseek 的 API 基础地址modeldeepseek-v3:671b,# Deepseek 对话模型可选deepseek-chat-pro 等高级模型temperature0.7,# 温度参数0-1越低越稳定max_tokens1024# 最大生成 tokens)# 创建字符串输出解析器用于将模型返回的 AIMessage 转换为纯文本output_parserStrOutputParser()# 构建处理链Chainprompt → LLM → output parser# 使用 LangChain 的管道操作符 | 连接各组件chaindynamic_prompt | llm | output_parser# 调用链传入输入变量 {adjective: 热情}# 注意chain.invoke() 内部已包含 llm 调用和 output_parser 解析无需再手动调用 output_parsermessagechain.invoke({adjective:热情})# ⚠️ 注意上一行 chain.invoke() 已经返回了字符串因为最后是 StrOutputParser# 所以下面这行是多余的甚至会导致错误因为 message 已是 str不能再次 invoke# result output_parser.invoke(message) # ❌ 错误message 是 str不是 AIMessage# 正确做法直接使用 message 作为结果resultmessageprint(###############)print(【模型输出】)print(result)输出结果123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051【测试1】输入较短选择多个示例给出每个输入的反义词Input: 开心Output: 伤心Input: 高Output: 矮Input: 精力充沛Output: 没精打采Input: 粗Output: 细Input: bigOutput:------------【测试2】输入很长仅选择一个示例给出每个输入的反义词Input: 开心Output: 伤心Input: bigandhugeandmassiveandlargeandgiganticandtallandmuch much much much much bigger than everythingelseOutput:------------【测试3】添加新示例后查询热情给出每个输入的反义词Input: 开心Output: 伤心Input: 高Output: 矮Input: 精力充沛Output: 没精打采Input: 粗Output: 细Input: 胖Output: 瘦Input: 热情Output:------------###############【模型输出】冷淡核心要点总结这段代码是基于 LangChain 框架对接 DeepSeek 大模型实现「动态少样本Few-Shot反义词生成」的完整案例核心解决「固定示例易超出模型上下文长度」的问题通过动态示例选择器适配不同长度输入同时结合 LangChain 链式调用简化模型调用流程先明确整体定位再拆解核心重点一、整体流程概览核心逻辑链代码遵循 LangChain 「示例准备 → 动态提示构建 → 模型调用 → 结果解析」的少样本学习经典流程整体可概括为1. 定义反义词任务的固定示例数据集为模型提供参考案例 2. 配置基于长度的示例选择器根据输入文本长度动态筛选示例数量 3. 构建动态少样本提示模板自动适配输入长度生成合规 Prompt 4. 初始化 DeepSeek 模型客户端配置核心调用参数 5. 构建「提示模板 → 大模型 → 输出解析」的链式调用流程 6. 调用链条完成反义词生成并输出纯文本结果二、核心重点拆解必掌握1. 少样本提示Few-Shot Prompt核心组件这是实现「模型参考示例生成结果」的基础也是 LangChain 提示工程的核心用法- 示例数据集examples以键值对形式存储「输入-输出」示例为模型提供任务参考如开心→伤心- 单示例模板example_prompt定义单个示例的文本格式Input/Output 固定样式统一示例展示形式- 动态少样本模板FewShotPromptTemplate整合示例选择器、单示例模板、前缀/后缀生成最终发给模型的完整 Prompt - prefix任务指令给出每个输入的反义词明确模型要执行的任务 - suffix待填充的用户输入占位符承接动态输入内容。2. 动态示例选择器LengthBasedExampleSelector这是代码的核心亮点解决「固定示例数量易超上下文长度」的问题核心作用根据输入文本的长度自动计算并选择合适数量的示例输入越长选的示例越少避免 Prompt 总长度超出模型上下文限制 关键参数 - examples候选示例列表 - example_prompt示例格式化模板用于计算单示例长度 - max_lengthPrompt 允许的最大长度此处为字符数近似值。3. LangChain 链式调用| 操作符简化多组件协作流程是 LangChain 核心设计理念- 链条构成dynamic_prompt生成 Prompt | llm调用模型 | output_parser解析结果 - 核心优势无需手动分步调用先格式化 Prompt、再调用模型、最后解析结果一行代码完成全流程 - 调用方式chain.invoke({adjective: 热情}) 传入输入变量直接返回解析后的纯文本结果。