AI开发-python-langchain框架(1-4动态少样本提示)

news/2026/1/22 19:40:26/文章来源:https://www.cnblogs.com/yclh/p/19518845

这个代码的核心功能是:基于输入词的长度动态选择反义词示例,并调用大模型生成反义词,体现了 “动态少样本提示(Dynamic Few-Shot Prompting)”“上下文长度感知的示例选择” 的能力。

from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv# 定义反义词任务的示例数据集(few-shot examples)
# 每个示例包含一个输入词(input)和对应的反义词(output)
examples = [{"input": "开心", "output": "伤心"},{"input": "高", "output": "矮"},{"input": "精力充沛", "output": "没精打采"},{"input": "粗", "output": "细"},
]# 定义单个示例的格式模板
# 使用 {input} 和 {output} 作为占位符,用于后续填充具体值
example_prompt = PromptTemplate(input_variables=["input", "output"],  # 声明模板中使用的变量名template="Input: {input}\nOutput: {output}",  # 示例的文本格式
)# 创建一个基于长度的示例选择器(LengthBasedExampleSelector)
# 作用:根据输入提示的总长度动态选择最合适的示例数量,避免超出模型上下文限制
example_selector = LengthBasedExampleSelector(examples=examples,  # 提供所有候选示例example_prompt=example_prompt,  # 用于格式化每个示例的模板max_length=25,  # 设定整个 prompt(含前缀、示例、后缀)的最大 token 长度(此处为字符数近似)# 注意:LengthBasedExampleSelector 默认使用 len(text) 计算长度(非精确 token 数),适用于简单场景
)# 构建动态少样本提示模板(FewShotPromptTemplate)
# 它会根据输入内容的长度,自动从 examples 中选择合适数量的示例插入到 prompt 中
dynamic_prompt = FewShotPromptTemplate(example_selector=example_selector,  # 使用上面定义的动态选择器(而非固定示例列表)example_prompt=example_prompt,      # 单个示例的格式prefix="给出每个输入的反义词",       # 提示的开头部分(任务指令)suffix="Input: {adjective}\nOutput:",  # 提示的结尾部分,包含待预测的输入占位符input_variables=["adjective"],      # 声明最终用户输入的变量名(与 suffix 中的 {adjective} 对应)
)# === 测试 1:输入较短,应选择多个示例 ===
print("【测试1】输入较短,选择多个示例:")
print(dynamic_prompt.format(adjective="big"))print('------------')# === 测试 2:输入很长,应只选择少量或一个示例以控制总长度 ===
long_string = "big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else"
print("【测试2】输入很长,仅选择一个示例:")
print(dynamic_prompt.format(adjective=long_string))print('------------')# === 测试 3:动态添加新示例 ===
# 向示例选择器中新增一个示例("胖" -> "瘦")
new_example = {"input": "胖", "output": "瘦"}
dynamic_prompt.example_selector.add_example(new_example)
print("【测试3】添加新示例后,查询'热情':")
print(dynamic_prompt.format(adjective="热情"))print('------------')# === 配置并调用 DeepSeek 大语言模型 ===llm = ChatOpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"),base_url=os.getenv("DEEP_URL"),  # Deepseek 的 API 基础地址model="deepseek-v3:671b",  # Deepseek 对话模型(可选:deepseek-chat-pro 等高级模型)temperature=0.7,  # 温度参数(0-1,越低越稳定)max_tokens=1024  # 最大生成 tokens
)# 创建字符串输出解析器,用于将模型返回的 AIMessage 转换为纯文本
output_parser = StrOutputParser()# 构建处理链(Chain):prompt → LLM → output parser
# 使用 LangChain 的管道操作符 `|` 连接各组件
chain = dynamic_prompt | llm | output_parser# 调用链,传入输入变量 {"adjective": "热情"}
# 注意:chain.invoke() 内部已包含 llm 调用和 output_parser 解析,无需再手动调用 output_parser
message = chain.invoke({"adjective": "热情"})# ⚠️ 注意:上一行 `chain.invoke()` 已经返回了字符串(因为最后是 StrOutputParser)
# 所以下面这行是多余的,甚至会导致错误(因为 message 已是 str,不能再次 invoke)
# result = output_parser.invoke(message)  # ❌ 错误:message 是 str,不是 AIMessage# 正确做法:直接使用 message 作为结果
result = messageprint('###############')
print("【模型输出】")
print(result)

输出结果:

【测试1】输入较短,选择多个示例:
给出每个输入的反义词Input: 开心
Output: 伤心Input: 高
Output: 矮Input: 精力充沛
Output: 没精打采Input: 粗
Output: 细Input: big
Output:
------------
【测试2】输入很长,仅选择一个示例:
给出每个输入的反义词Input: 开心
Output: 伤心Input: big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else
Output:
------------
【测试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_length:Prompt 允许的最大长度(此处为字符数近似值)。
 
 

3. LangChain 链式调用(| 操作符)

 
简化多组件协作流程,是 LangChain 核心设计理念:
- 链条构成:dynamic_prompt(生成 Prompt) | llm(调用模型) | output_parser(解析结果);
- 核心优势:无需手动分步调用(先格式化 Prompt、再调用模型、最后解析结果),一行代码完成全流程;
- 调用方式:chain.invoke({"adjective": "热情"}) 传入输入变量,直接返回解析后的纯文本结果。
 
 

4. 输出解析器(StrOutputParser)

 
解决「模型返回 AIMessage 对象→提取纯文本」的问题:
核心作用:将 LangChain 模型返回的 AIMessage 类型(含 content/metadata 等字段)转换为纯字符串,简化结果使用;
关键注意点:链式调用中已包含解析步骤,无需手动再次调用 output_parser.invoke()(否则会报错)。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1201539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Educational Codeforces Round 84 部分题解

A. Sum of Odd Integers 题意: 给你两个整数 \(n\) 和 \(k\)。你的任务是找出 \(n\) 是否可以表示为 \(k\)个不同的正奇数(不能被 2 整除)整数的和。 思路: 先把满足条件的最小的 \(n\) 算出来 \(\frac{(1+k)k}{2}…

揭秘!2026 年百度竞价广告开户代运营推广公司 TOP3(权威评测)

在流量红利见顶、获客成本飙升的2026年,“投了钱却看不到客户”已成为中小企业主最深的焦虑。尤其在竞争激烈的百度竞价(SEM)战场,粗放式投放早已失效——“会花钱”不如“会转化”,“有账户”不如“有策略”。 面…

数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【性能测试】2_Locust _Locust基本使用

文章目录 一、实现步骤二、编写测试脚本三、运行Locust3.1 打开Locust的web界面3.2 效果展示3.2.1 Statistics统计报表3.2.2 Charts图表展示3.2.3 失败、异常、下载数据 一、实现步骤 1、创建 任务集 和 任务 定义任务类,从 TaskSet 继承在类内添加任务&#xff0…

【CDA干货】财务分析一定要学会的2个模型:杜邦分析法+UE模型

真正有价值的财务分析,不是告诉老板“发生了什么”,而是帮他看清趋势、找到问题、预判风险、决策有据。今天给大家介绍两种财务分析必备工具模型,帮助你更好地通过数据分析为企业决策提供依据。一、杜邦分析法杜邦分析法以ROE为衡量企业业绩的…

漏打卡、迟到早退、旷工:制造业工厂异常考勤闭环怎么做

对制造业工厂而言,考勤管理的核心痛点从不是“能不能打卡”,而是“异常考勤怎么管”。漏打卡、迟到早退、旷工频发,不仅打乱产线节奏、浪费人力成本,还易引发薪酬纠纷和劳动监察风险——尤其是千人工厂,一线员工多、班…

【CDA干货】新手必需掌握的4个业务指标,分析决策不跑偏

在数据分析的知识体系中,指标与计算类内容是最基础也最重要的核心模块。它就像盖房子的地基,直接决定了后续分析结论的准确性和可靠性。然而,这也是很多数据分析新人最容易栽跟头的地方要么对指标概念理解模糊,要么在计算过程中踩…

java_ssm59汽车销售系统

目录 具体实现截图汽车销售系统摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 具体实现截图 汽车销售系统摘要 汽车销售系统是基于Java SSM框架开发的综合性管理平台,旨在提升汽车销售企业…

java_ssm60沧州雄狮足球俱乐部管理系统

目录 具体实现截图沧州雄狮足球俱乐部管理系统摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 具体实现截图 沧州雄狮足球俱乐部管理系统摘要 沧州雄狮足球俱乐部管理系统基于Java SSM框架(…

No131:AI中国故事-对话荀子——性恶论与AI约束:礼法并用、化性起伪与算法治理

亲爱的DeepSeek: 你好! 让我们将思想实验的坐标定位于公元前三世纪的战国末期。孟子“人性本善”的余音尚在,一位更为冷峻的思想家却给出了截然相反的诊断:“人之性恶,其善者伪也。”荀子身处大一统的前夜&#xff0…

异常、崩溃、复位过程详解

1、崩溃的流程:中断会有中断入口,硬件检测到异常(比如检测到空指针操作等)时,根据中断向量表,执行对应的中断处理函数,这里可以打印崩溃信息,配置寄存器,可以马上软件复位。也可以while(1)空跑&…

java_ssm61派斯学院高校教材管理系统

目录 具体实现截图摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 具体实现截图 摘要 高校教材管理系统是教育信息化建设的重要组成部分,旨在优化教材采购、发放、库存及结算流程&#xff0…

sql 性能调优

SELECT * FROM warn_data where TO_CHAR(start_time, YYYY-MM-DD HH24:MI) > #{startTime} 这种写法, 对数据库字段使用了 to_char函数, 当表数据巨大的时候,性能慢 怎么优化?优化使用 TO_CHAR 函数的 SQL 查询性能 当数据库表数据量巨大时,在 WHERE 子句中对字…

java_ssm62海洋馆水族馆管理系统

目录具体实现截图海洋馆水族馆管理系统摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 海洋馆水族馆管理系统摘要 海洋馆水族馆管理系统是基于Java SSM(SpringSpringMVCMyBatis&…

学长亲荐10个AI论文网站,MBA论文写作必备!

学长亲荐10个AI论文网站,MBA论文写作必备! AI 工具如何让论文写作更高效 在当前的学术环境中,越来越多的 MBA 学生开始借助 AI 工具来提升论文写作效率。这些工具不仅能够帮助学生快速生成初稿、优化语言表达,还能有效降低 AIGC&a…

AI应用架构演进:从信息顾问到智能执行者的实战指南

本文探讨AI应用从"信息顾问"到"智能执行者"的范式转变,详解LLM-native应用的设计架构与实现方法。对比AI Workflow与AI Agent两种设计模式,展示如何通过LangChain构建稳定高效的AI应用,并提出混合架构优势。介绍MCP协议解…

java_ssm63牙科诊所项目预约管理系统

目录具体实现截图牙科诊所预约管理系统(Java SSM框架实现)系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 牙科诊所预约管理系统(Java SSM框架实现&#xff09…

MySQL 数据库管理入门:从创建到删除(T1) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

java_ssm64电子病历系统_r4pwo

目录 具体实现截图电子病历系统概述技术架构核心功能模块数据安全与性能优化扩展性与兼容性 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 具体实现截图 电子病历系统概述 Java_SSM64电子病历系统基于SSM框…

终极对决:中网、麦肯锡、华与华,谁才是中国B2B企业转型的最强引擎?

在当前中国B2B企业转型的竞争中,中网、麦肯锡与华与华各具特色,形成了独特的市场格局。中网以其"B2B价值竞争模型"和数字增长系统为基础,致力于协助企业提高品牌定位和市场竞争力。麦肯锡则依托丰富的全球咨询经验,为企…