码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 14. 别再硬写提示词了!LangChain PromptTemplate从入门到实战


    合集 - AI应用开发实战(32)
    1.1. AI应用实战开发04-292.2.【保姆级入门】什么是 AI?人工智能到底能干嘛?看完秒懂!04-293.3. AI大模型架构图和盈利模式04-304.4. Token(词元),5分钟彻底搞懂04-305.5. AI大模型的不足和解决方案04-306.6. LangChain,解决AI大模型的不足05-017.7. 搞懂LangChain开发库,还有dotenv实战05-028.8.【保姆级】从零学会LangChain调用大模型!统一接口+代码实战05-039.9. LangChain 6大核心参数详解 + 代码实战,看完就能直接用05-0410.10. LangChain开发核心技巧,动态切换AI大模型参数05-0511.11. LangChain实用技巧,轻松切换AI大模型05-0612.12. LangChain 6大核心调用方法:invoke/stream/batch同步异步全解析,新手也能轻松学会05-0713.13. 学会提示词,从此 AI 听你指挥05-08
    14.14. 别再硬写提示词了!LangChain PromptTemplate从入门到实战05-12
    15.15. 别再硬写提示词了!LangChain ChatPromptTemplate核心实战05-1516.16. LangChain ChatPromptTemplate多模态应用实战05-1617.17. LangChain FewShotPromptTemplate少样本应用实战05-1718.18. LangChain输出解析器实战:从大模型输出到结构化数据的转化05-1819.19. 大模型输出乱成渣?3个解析器轻松转成标准列表!05-1920.20. AI大模型输出转JSON,原来这么简单!05-2021.21. “|”不只是按位或,90%的人不知道05-2122.22. LangChain LCEL,用 | 串联AI的魔法语言05-2423.23. AI 智能体真的很难吗?5分钟一次性讲明白06-0124.24. LangChain内置工具,开发效率提升10倍!06-0325.25. AI 总是 “失忆“?3 行代码让它记住你!06-0626.26. Agent 记不住业务数据?用 Store 给它加个“笔记本“!06-1327.27. Agent 需要拦截模型调用?用 Middleware 给它加个“拦截器“!06-1428.28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!06-1829.29. MCP协议,让大模型自己调用工具06-2230.30. AI Skills技能系统,让 Agent 自动变强06-2431.31. RAG 检索增强生成,让大模型拥有外部知识07-0632.32. 从 LangChain 到实战落地:一条清晰的智能体技术进阶路径(完结篇)07-07
    收起

    在 AI 应用开发中,很多开发者都会犯一个共同的错误:把提示词直接写死在代码里。这种做法看似简单快捷,但随着应用功能的扩展,问题会迅速暴露。固定的提示词就像一把只能开一把锁的钥匙,严重限制了大模型的适用范围。

    image

     为了解决这个普遍存在的痛点,LangChain框架提供了一个核心基础组件 ——PromptTemplate。它就像一个提示词的 "模具",让你可以定义一次通用模板,然后通过传入不同的参数,动态生成成千上万条针对性的提示词。

    为了学习更轻松,我做了动画视频《14.LangChain PromptTemplate从入门到实战》。

    image

     当你需要创建一个 PromptTemplate 实例时,LangChain 提供了两种方式:直接使用构造方法,或者使用官方更推荐的 from_template 类方法。

    直接使用构造方法需要你手动列出所有的输入变量,代码冗长不说,还很容易出错。比如,如果你在模板中添加了一个新变量,但忘记在 input_variables 参数中同步声明,就会导致运行时错误。

    而 from_template 方法的最大优势在于它能够自动扫描模板字符串,智能推断出所有的输入变量。这不仅让代码更加简洁易读,还能彻底避免手动维护变量列表带来的不一致问题。

    image

     PromptTemplate 内置了对三种主流模板格式的支持,你可以根据自己的实际需求选择最合适的一种:

    f-string:这是 Python 的原生语法,也是 LangChain 默认使用的格式。它使用单大括号{variable_name}来标记变量占位符。f-string 格式简单直观,没有额外的学习成本,而且安全性最高,是绝大多数场景下的首选。

    jinja2:如果你需要在提示词中实现条件判断、循环等复杂逻辑,jinja2 格式会是更好的选择。它支持{% if %}、{% for %}等控制结构,可以根据不同的输入动态调整提示词的内容。不过需要注意的是,jinja2 模板存在一定的安全风险,在处理不可信的用户输入时需要格外谨慎。

    mustache:这是一种跨语言通用的模板格式,使用双大括号{{variable_name}}来标记变量。如果你需要在不同编程语言之间共享提示词模板,mustache 格式可以提供最好的兼容性。

    根据大量实际开发经验总结,90% 以上的应用场景使用默认的 f-string 格式就完全能够满足需求。只有当你确实需要复杂的逻辑控制或者跨语言共享时,才需要考虑使用其他两种格式。

    image

     从本质上讲,PromptTemplate 就是一个可复用的模板字符串。它的工作流程非常清晰:

    (1)   定义一个包含变量占位符的模板字符串

    (2)   以字典的形式传入具体的变量值

    (3)   PromptTemplate 会将这些值精确地填充到对应的占位符中

    (4)   最终输出一个统一格式的PromptValue对象

    这个 PromptValue 对象是 LangChain 中的一个通用数据类型,它可以直接传入任何大语言模型的 invoke 方法。同时,它也提供了便捷的转换方法,可以轻松地转换为普通字符串或者消息列表,满足不同模型的输入要求。

    prompt = PromptTemplate.from_template(
    "将{word}翻译成{lang}"
    )

    下面我们通过一个完整的示例来演示如何在实际代码中使用 PromptTemplate。

    首先从langchain_core.prompts模块导入PromptTemplate类。

    接着使用from_template方法创建PromptTemplate实例,该方法接收一个字符串模板作为参数,模板中用大括号包裹的部分即为变量占位符。

    然后调用 prompt 的invoke方法,传入包含具体填充值的字典,该方法会将这些值替换到模板中,生成完整的提示词对象PromptValue。

    最后将PromptValue传入之前已初始化好的大语言模型实例的invoke方法,并传入配置信息,大模型会根据该提示词生成对应的回答。

    复制代码
    from langchain_core.prompts import PromptTemplate
    
    prompt = PromptTemplate.from_template(
        "将{word}翻译成{lang}"
    )
    prompt_value = prompt.invoke({"word": "good", "lang": "中文"})
    res = llm.invoke(prompt_value, config=config)
    print(res.content)
    复制代码

    在某些情况下,你的模板中可能有一些变量的值在大部分时候都是固定的,只有少数几个变量需要每次调用时动态传入。这时,你可以使用partial_variables参数来预先定义这些固定变量,从而简化后续的调用过程。

    复制代码
    from langchain_core.prompts import PromptTemplate
    
    prompt = PromptTemplate.from_template(
        "将{word}翻译成{lang}",
        partial_variables={"lang": "中文"}
    )
    prompt_value = prompt.invoke({"word": "good"})
    res = llm.invoke(prompt_value, config=config)
    print(res.content)
    复制代码

     

  • 相关阅读:
    Java自学的话怎么样最有效果?
    docker真实IP解决
    uniapp 事件委托失败 获取不到dataset
    kube-prometheus 监控系统使用与总结
    GPT润色指令
    掌握rpc、grpc并探究内在本质
    【QT】续写文本存储到文件
    前端毕业设计:Nodejs+Vue菜鸟驿站仓库管理系统的设计与实现
    【技术分享】接口幂等性:为什么你需要它?
    前端黑魔法 —— 隐藏网络请求的调用栈
  • 原文地址:https://www.cnblogs.com/halfcode/p/20017945
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号