AI Agent从无到有33: 使用 Partial 实现提示词部分格式化

【AI大模型应用开发】【项目实战】29.Agent智扫引擎项目-(三)项目/代码架构,数据集介绍,ReAct模块实现,模型选择及实现(Agent模块实现,LLM模型选择及实现) 基于Streamlit和LangChain的智能客服Agent系统(InsightScan),采用ReAct框架实现动态推理与工具调用。系统核心包括Agent模块(支持思维链推理与错误回溯)、工具管理模块(安全调用外部API)、LLM模块(模型工厂统一管理)、RAG技术(处理扫地机器人产品手册数据)及提示词工程。数据来源于产品手册知识库,涵盖10类常见问题。项目使用Ollama部署多个开源模型(如Qwen、Gemma),并通过工厂模式解耦配置与代码,便于模型切换 阅读详情

纲要

  • 部分格式化概念:分步填充模板变量,打破“一次性提供所有变量”的限制
  • PromptTemplate 的 partial 方法:
    • 静态值部分格式化:先填充已知变量,返回中间模板
    • 函数动态生成:通过无参函数在 format 时动态生成变量值
  • 典型应用场景:异步数据注入、默认参数设置、动态上下文注入
  • 完整可运行示例:包含静态与动态两种 Partial 用法(基于 langchain-core)
  • 版本信息:适用 LangChain v0.1.0 及以上版本

引言

在构建提示词模板时,模板往往需要多个变量,而这些变量的值并非总是同时就绪。例如,一个变量来自用户输入,另一个变量需要从数据库异步查询,甚至需要动态生成当前时间。若直接调用 format 方法,则必须一次性传入所有参数,这会导致代码耦合度高、流程僵化,且难以适应异步编程场景。

LangChain 的 PromptTemplate 提供了 partial 方法,支持对模板进行“部分格式化”。开发者可以先填充已知变量,得到一个仍包含未填充变量的中间模板对象,待剩余变量就绪后再完成最终格式化。这种方式让提示词的构建过程更加灵活,也更契合现代 AI 应用中的异步与动态需求。

核心机制:PromptTemplate.partial

PromptTemplate.partial 方法返回一个新的 PromptTemplate 对象,该对象的 input_variables 列表中已移除被部分填充的变量,同时内部记录了已绑定的静态值或动态函数。在后续调用 format 时,这些预绑定的值会被自动合并,最终生成完整的提示词字符串。

方法签名(基于 langchain-core >= 0.1.0):

PromptTemplate.partial(**kwargs: Any) -> PromptTemplate
  • 参数:接受关键字参数,键为模板中的变量名,值可以是静态值(字符串、数字等)或可调用对象(无参函数)。
  • 返回值:返回一个新的 PromptTemplate 实例,其 input_variables 属性已移除已部分填充的变量。

部分格式化的两种模式

静态值填充

若模板中的某些变量值可在较早阶段确定,而其余变量需等待运行时数据,可先调用 partial 提前注入已知值。得到的中间模板对象仍保留未填充变量,方便后续在合适的时机完成格式化。此过程不会立即生成字符串,而是保持模板的结构化状态,便于在流程中传递和组合。

函数动态生成

更常见的场景是某些变量需要在每次调用时动态计算,例如当前日期时间、随机 ID 或会话标识。通过将一个无参函数作为部分格式化的值,当最终调用 format 时,该函数会被自动执行,并将返回值填入模板对应位置。这样,每次生成的提示词都能反映最新的动态信息,且调用方无需关心该变量的生成逻辑。

完整可运行示例

以下代码演示了 partial 的两种用法,无需外部 API Key,可直接运行。

环境准备(安装依赖):

pip install langchain-core>=0.1.0

核心代码:

from langchain_core.prompts import PromptTemplate
from datetime import datetime

# 定义一个包含两个变量的模板
template = "foo 的值为:{foo},bar 的值为:{bar}"

# 创建 PromptTemplate 对象
prompt = PromptTemplate.from_template(template)

# ----- 示例1:静态值部分格式化 -----
# 先填充 foo,保留 bar 未填充
partial_prompt = prompt.partial(foo="foo_test")
print("部分格式化后的对象(此时尚未完全格式化):")
print(partial_prompt)
print()

# 稍后获得 bar 的值,完成最终格式化
final_prompt = partial_prompt.format(bar="barzzz")
print("完全格式化后的提示词:")
print(final_prompt)
print()

# ----- 示例2:使用函数动态生成当前时间 -----
# 定义一个返回当前时间的函数
def get_current_time():
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# 新的模板:需要 adjective 和 date 两个变量
time_template = "给我讲一个{adjective}的笑话,日期是{date}"

time_prompt = PromptTemplate.from_template(time_template)

# 部分格式化:将 date 绑定到时间函数
time_partial = time_prompt.partial(date=get_current_time)

# 最终格式化时只需传入 adjective,date 会自动调用函数生成
joke_prompt = time_partial.format(adjective="有趣的")
print("带动态时间的提示词:")
print(joke_prompt)
print("再次执行,时间会变化(验证函数动态执行):")
print(time_partial.format(adjective="有趣的"))

运行结果说明:

  • 示例1中,final_prompt 输出中 foo 被替换为 foo_test,bar 被替换为 barzzz。
  • 示例2中,两次输出的日期时间字符串会不同,验证了动态函数的实时执行。

API 速览 (API Overview)

方法/类所属库说明适用版本
PromptTemplate.from_templatelangchain_core.prompts类方法,从字符串模板创建 PromptTemplate 实例>=0.1.0
PromptTemplate.partiallangchain_core.prompts部分填充模板变量,返回新的 PromptTemplate 对象>=0.1.0
PromptTemplate.formatlangchain_core.prompts完成最终格式化,返回填充后的字符串>=0.1.0

关键类型说明:

  • PromptTemplate 对象包含 input_variables 属性,列出所有尚未填充的变量名。
  • partial 方法的参数值可以是任何可调用对象(callable),但要求该可调用对象不接受参数,并返回一个可字符串化的值。

应用场景扩展

  • 异步数据注入
    在异步流程中,部分变量来自用户请求,另一部分需要查询外部服务。可先 partial 填充已获取的请求参数,待异步结果返回后再调用 format 完成最终提示词组装,避免阻塞主流程。

  • 默认参数设置
    可为模板的某些变量设定默认生成函数(如获取当前用户 ID、会话 Token),减少在每次调用时重复传递这些参数,简化调用链。

  • 动态上下文管理
    在基于 LangChain 的 Chain 或 Runnable 流水线中,可将 partial 与 RunnableLambda 结合,在运行时动态注入上下文信息,实现更灵活的提示词编排策略。

参考文档

官方文档

参考链接

总结

PromptTemplate.partial 提供了一种优雅的方式,将提示词模板的格式化过程从“一次性全量填充”拆解为多个可组合的步骤。

这不仅使代码更适应异步和数据驱动的场景,还通过函数动态生成机制简化了时间戳、会话信息等动态变量的管理。

该特性在 LangChain v0.1.0 及以上版本中稳定支持,是构建灵活、可维护的提示词工程的核心工具之一。

Cursor项目感知原理:重构编辑器的工程理解能力 现代中大型代码库的复杂性已远超传统编辑器的语义处理边界。项目感知(Project Awareness)并非营销概念,而是指编辑器对跨文件调用链、Git变更上下文、配置语义联动等工程要素的深度建模能力。其技术基础在于AST驱动的符号解析、版本历史注入与结构化配置推导,核心价值是将AI从文本补全工具升级为开发闭环协作者。典型应用场景包括快速定位隐蔽Bug、安全重构遗留模块、生成符合业务规则的代码,以及自动化编写高准确率的技术文档。Cursor正是通过原生集成这三层能力,实现了对VS Code等传统工具在‘工程理 阅读详情

相关推荐

LangChain + NestJS + Next.js 三角架构实战指南

LangChain 是面向大语言模型应用的编排框架,其核心价值在于抽象提示工程、记忆管理与工具调用等 AI 原语;NestJS 提供企业级 TypeScript 后端能力,支撑依赖注入、异常处理与可观测性;Next.js(App Router)则通过 Server Components 和 Streaming 实现服务端优先的流式交互体验。三者协同构成现代 AI 应用的标准分层架构:Next.js 负责安全触达与用户体验,NestJS 承载可维护、可测试的 AI 服务逻辑,LangChain 作为嵌入其中的

weixin_33957648的博客 382

03 大模型核心开发框架

如果是java选手,学习过langchain4j,上手这部分内容应该很快。先详细看看课程目标建立对 LangChain 的整体认识,知道它是什么、解决什么问题、在 AI 应用开发里处于什么位置。理解 LangChain 在 1.x 时代的产品边界、包结构、版本演进,以及它与LangGraph、LangSmith、Deep Agents 的关系。建立对 Model I/O、Chains、Memory、Retrieval、Tools/Agents、Callbacks 这六类教学视角的整体认知。

Misnearch的博客 398

Re-TRAC框架:用结构化状态表示重塑LLM搜索智能

大语言模型在复杂搜索任务中常因上下文膨胀、目标漂移和冗余探索而失效,其本质是传统ReAct范式缺乏对‘记忆’与‘反思’的工程化支持。结构化状态表示(SSR)通过将答案、证据与不确定性三维度压缩为可复用的认知快照,使模型具备跨轨迹知识沉淀能力;递归执行机制则让每次推理都基于历史状态持续收敛,显著提升准确率并降低工具调用开销。该技术已验证于4B小模型达SOTA性能,并在BrowseComp等专业基准上实现30B模型反超358B的突破,为边缘部署、隐私敏感与高并发搜索场景提供全新工程范式。

weixin_33795806的博客 362

Claude Code 核心架构和源码解析

⑥ 基础设施层 (Utils & Infra)⑤ 服务层 (Services)④ 工具层 (Tools)③ 核心编排层 (Core Loop & Core Subsystems)② 界面层 (UI / Ink TUI)① 入口 / 初始化层 (Entrypoints & Bootstrap)动态加载主模块共享入口preAction / action交互模式非交互 / print 模式共享服务能力共享工具能力cli.tsxCLI 入口 / fast-path / 动态 import main.tsxmcp.t

qq_40369829的博客 870

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1389

【信息科学与工程学】计算机科学与自动化——第十八篇 存储系统设计 10 存储器/存储软件/存储芯片/存储盘/存储系统/存储网络01

③ MTJ电阻 → 界面:TMR=(R_AP-R_P)/R_P = 2P₁P₂/(1-P₁P₂) (Julliere模型);③ 访问延迟模型 → 统计:平均访问延迟 = p_hot * t_dram + (1-p_hot) * t_nvm + t_migration_overhead;:① 储能电容计算 → 数学物理:所需能量 E = P * t_backup,电容 C = 2E / (V_start² - V_end²);:① B-tree平衡 → 代数:树高 h = log_m(N),m为扇出;

weixin_49199313的博客 265

Python机器学习:从零基础到项目实战

当您翻开此书,您正踏入一场数据与智慧的修行。机器学习,并非冰冷的符码,而是机器模拟人类洞察世界的法门。本书将带您,以Python为舟,泛游于算法之海。我们不只传授“术”,更探求其后的“道”——从数据的生灭流转中观照规律,于模型的迭代演进里体悟得失。愿您合上书卷时,收获的不仅是驾驭数据的技能,更有一双洞悉复杂、化繁为简的“智慧之眼”。现在,让我们一同启程。

YunWisdom 972

【信息科学与工程学】计算机科学与自动化——第三百零五篇 数据中心 Scale-Up、Scale-Out、Scale-Across 01

临界带宽B_critical满足:V_orig/B_critical = V_orig/(r·B_critical) + V_orig/R_compress + r·V_orig/R_decompress ⇒ 1/B_critical = 1/(r·B_critical) + 1/R_compress + r/R_decompress ⇒ B_critical = (1 - 1/r) / (1/R_compress + r/R_decompress)。T_original中所有数据均经内存总线传输。

weixin_49199313的博客 476

177.Agent-LangGraph-MCP的构成说明

MCP架构通过MCP主机、客户端与服务器的协同,实现工具、资源与提示词的统一管理。MCP服务器提供Tools、Resources、Prompts能力,MCP客户端则负责发现、调用与读取,使Agent可按需获取上下文。其核心在于将工具从Agent中抽离,封装为可复用的服务,提升灵活性与可维护性,推动AI应用高效协作。

计算机王的博客 292

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 12 公有云里的“多Region + 多AZ“ 02 运营算法01

算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)云厂商提高闲置资源利用率。算法复杂度为O(N),N为实例数量。

weixin_49199313的博客 283

AI学习-langchain

也可以安装一下读取环境变量的依赖。

qq_62408075的博客 335

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 477

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档)

本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。

招风的黑耳优快云 304

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 436

FreeCAD MCP实战:用自然语言驱动AI建模,效率提升10倍

MCP(Model Context Protocol)是一种让AI模型调用外部工具和数据的协议标准,通过标准化通信层解决AI与CAD软件之间的交互难题。其原理是向AI暴露工具清单,AI根据自然语言需求自动选择工具并填充参数。在工程实践中,这一技术显著降低了CAD建模门槛,将重复性操作从手动点击转为语音指令,适用于批量零件生成、参数化设计等场景。FreeCAD作为开源CAD,凭借开放的Python API和脚本化能力,成为落地MCP的理想平台。本文基于FreeCAD MCP的实操经验,分享环境搭建、自然语言建

weixin_31188927的博客 328

保姆级教程:用U盘给浪潮服务器装系统(含RAID驱动加载技巧)

本文提供了一份详细的浪潮服务器U盘安装系统指南,重点介绍了RAID驱动加载技巧与实战步骤。从准备工作到系统安装全流程,涵盖RAID配置、驱动加载方法及常见问题排查,帮助用户高效完成服务器系统部署。特别强调RAID驱动与服务器型号的匹配性,确保安装过程顺利。

uuu88的博客 738

【基于 WebSocket 的多用户网页五子棋】—— 数据管理模块

但行好事,莫问前程

qq_42996461的博客 251

深入解析Flex NOC总线驱动的实时带宽与延迟优化策略

本文深入解析了Flex NOC总线驱动的核心价值与优化策略。通过解读`/proc/noc/real_time`中的实时带宽与延迟数据,并结合`sysfs`接口进行动态QoS调优,可以有效解决芯片内部数据拥堵问题。文章以智能摄像头和算力盒子的实际案例,详细说明了如何通过优先级调整、带宽限制和参数优化,提升系统在复杂任务下的实时性与稳定性。

weixin_29289821的博客 284

OpenClaw 深度调查:把 AI 助手做成你自己的控制平面

对 openclaw/openclaw 的完整技术尽调:Gateway 架构、Agent 运行时、工具与沙箱、30 个消息通道、181 个插件、安全信任边界、工程代价与采用建议。17 章 / 10 张图,全部数字标注口径,数据截至 2026-10-31。

厚积薄发 313

Qt + Robot Interface实现上位机和发那科机器人通信

摘要: 本文详细介绍了FANUC机器人的RobotInterface模块开发流程,包括环境配置、通信连接和上位机开发等内容,并提供了数值寄存器、位置寄存器和当前位置的读写代码等示例。适用于自动化行业有通讯需求的上位机开发人员,保姆教程,超详细版,新手也可以根据示例开发自己的通信程序。

xyhkma的博客 1752

脑电时频分析I:谱分析

1、EEG频带划分 自发的EEG活动在活体大脑中持续存在,通常通过频率进行分类(也叫神经振荡活动) 特定频段的脑活动,即节律性的活动,具有特定的头皮分布和生物学意义 最后还有一个γ波,主要是指30hz~100hz的一个波段,通常这个波段也包含了噪声唁电的成分,比较难提取处理,比较少用到这个波段 这个波段主要是有可能躯体感觉皮层,进行一个多通道的感觉输入的i信号处理,比如我们同时处理视觉和听觉信号的处理,而且γ波与我们记忆的形成有关 除此之外,还有一个特殊的波段,8~12hz的Mu波段主要是特指我们

Kobe123brant的博客 1万+

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 180

LabVIEW内存优化实战:用DVR和队列高效处理大型数组,告别数据副本

本文深入探讨LabVIEW内存优化技术,重点介绍数据值引用(DVR)和单元素队列(SEQs)在高效处理大型数组中的应用。通过对比传统方法与现代引用技术的性能差异,提供减少内存副本、提升程序效率的实战方案,帮助开发者在测试测量、图像处理等数据密集型场景中实现显著性能提升。

weixin_30835649的博客 1062

TransactionInactiveError:await 之后事务已经不活跃了

TransactionInactiveError 出现于 IndexedDB 事务已结束(非 active 状态)时调用 put、get 等操作。常见于 await 后或 setTimeout 中执行请求,因任务已完成,事务已提交或进入 finished 状态。请求必须在创建事务的同一任务中挂起,否则无效。解决方法:在 onsuccess 回调内同步发起后续操作,或提前将所有请求挂入事务。避免在异步上下文中使用事务操作,确保请求在事务活跃期内完成。

qq_40822000的博客 159

信号处理算法:离散余弦变换(DCT)_(1).离散余弦变换(DCT)概述

离散余弦变换的数学定义如下:对于一个长度为NNN的离散信号xnx(n)xn,其DCT变换后的系数XkX(k)XkXk∑n0N−1xncos⁡πNn12kk012N−1Xkn0∑N−1​xncosNπ​n21​kk012N−1其中,kkk是频率指数,nnn是时间或空间索引。离散余弦变换(DCT)是一种强大的信号处理技术,广泛应用于图像压缩、音频处理、数据压缩等领域。

2401_87715305的博客 1557

SAP-ABAP:FI财务会计模块常用BAPI及核心用途实例说明

SAP FI模块的BAPI覆盖了从主数据管理、凭证过账到财务关账的全流程操作,是系统集成与自动化的重要工具。实际应用中需结合业务场景选择合适的BAPI,并严格遵循事务控制与校验规则。如需扩展功能,可通过BAdI或用户出口增强标准逻辑。

baidu_35680696的博客 1601
上一篇: AI Agent从无到有32: 基于最大边际相关性(MMR)的示例选择器实现与选型指南
下一篇: AI Agent从无到有34: 用 LangSmith Hub 实现团队级提示词管理
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值