码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 15. 别再硬写提示词了!LangChain ChatPromptTemplate核心实战


    合集 - 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-0814.14. 别再硬写提示词了!LangChain PromptTemplate从入门到实战05-12
    15.15. 别再硬写提示词了!LangChain ChatPromptTemplate核心实战05-15
    16.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
    收起
    在使用LangChain与AI交互时,想要让对话更有条理、适配多角色、多轮次的沟通场景,ChatPromptTemplate这个工具绝对少不了。它本质上就是一个用来构建聊天消息列表的提示模板,能帮我们规范AI的交互逻辑,让每一次对话都更贴合预期。

    如果你喜欢看视频学习,就看 《15. LangChain ChatPromptTemplate核心实战》。

    prompt_template = ChatPromptTemplate.from_messages([
        SystemMessagePromptTemplate.from_template("你是AI开发助手{name},擅长编程开发。"),
        HumanMessagePromptTemplate.from_template("你能帮我做什么?"),
        AIMessagePromptTemplate.from_template("我可以帮你写代码、改bug。"),
        HumanMessagePromptTemplate.from_template("{user_question}")
    ])

    使用这个模板时,写法可以灵活调整。如果只是简单传递消息内容,不需要额外附带参数,用字符串别名的写法会特别简洁,省去不少冗余操作。

    prompt_template = ChatPromptTemplate.from_messages([
        ("system", "你是AI开发助手{name},擅长编程。"),
        ("user", "你能帮我做什么?"),
        ("ai", "我可以帮你写代码、改bug。"),
        ("user", "{user_question}")
    ])

    但如果追求更高的清晰性和可扩展性,想兼容一些高级功能,那字典写法就比元组简写更合适,后续维护和修改也会更方便。

    prompt_template = ChatPromptTemplate.from_messages([
        {"role": "system", "content": "你是AI开发助手{name},擅长编程。"},
        {"role": "user", "content": "你能帮我做什么?"},
        {"role": "ai", "content": "我可以帮你写代码、改bug。"},
        {"role": "user", "content": "{user_question}"}
    ])

    这里要重点说一下不同字符串别名的用法,它们对应着不同的消息类,各有明确的用途和使用规则,记清楚这些能避免很多操作失误。

     

    字符串别名

    对应消息类

    用途

    使用规则

    system

    SystemMessage

    给AI设定人设、规则和上下文

    必在开头只能有1个

    user/human

    HumanMessage

    代表用户的输入

    与“ai”交替,不能连续出现2个

    ai/assistant

    AIMessage

    表示AI的输出约束

    跟在“user”后,不能连续出现2个

    了解完这些基础规则,就到了实战环节,其实操作步骤很简单,一步步来就能上手。首先要做的就是导入ChatPromptTemplate类,这是所有后续操作的基础。接着,用from_messages方法创建这个类的实例,这个方法需要接收一个消息列表作为参数,列表里的每条消息都是包含role和content字段的字典,其中content里用大括号包裹的部分,就是我们后续要填充的变量占位符。通过system、user、ai这三种角色的搭配,我们就能轻松定义出完整的对话上下文,甚至可以加入回答范例,让AI更清楚该如何响应。

    创建好实例后,调用invoke方法,传入一个包含具体填充值的字典,它就会自动替换掉所有的占位符,生成一个完整的PromptValue提示词对象。最后,把这个PromptValue对象传入已经初始化好的大语言模型的invoke方法,就能完成一次规范的AI交互了。

    复制代码
    from langchain_core.prompts import ChatPromptTemplate
    
    prompt_template = ChatPromptTemplate.from_messages([
        {"role": "system", "content": "你是AI开发助手{name},擅长编程开发和技术问题解答。"},
        {"role": "user", "content": "你能帮我做什么?"},
        {"role": "ai","content": "我可以帮你写代码、改bug、设计技术方案。"},
        {"role": "user", "content": "{user_question}"}
    ])
    prompt_value = prompt_template.invoke(
        {
            "name": "神算子",
            "user_question": "用Python写一个简单的计算器程序"
        }
    )
    res = llm.invoke(prompt_value, config=config)
    print(res.content)
    复制代码

    除此之外,还有一个实用小技巧可以记一下。如果我们需要预先定义部分变量,不用每次都完整传入所有参数,借助partial方法就能轻松指定,后续使用时只需要补充剩余变量即可。

    复制代码
    from langchain_core.prompts import ChatPromptTemplate
    
    prompt_template = ChatPromptTemplate.from_messages([
        {"role": "system", "content": "你是AI开发助手{name},擅长编程开发和技术问题解答。"},
        {"role": "user", "content": "你能帮我做什么?"},
        {"role": "ai", "content": "我可以帮你写代码、改bug、设计技术方案。"},
        {"role": "user", "content": "{user_question}"}
    ])
    partial_prompt = prompt_template.partial(name="神算子")
    prompt_value = partial_prompt.invoke(
        {
            "user_question": "用Python写一个简单的计算器程序"
        }
    )
    res = llm.invoke(prompt_value, config=config)
    print(res.content)
    复制代码

    要是想在模板中嵌入消息列表,比如多轮对话的历史消息,就可以使用MessagesPlaceholder,它的字符串别名是placeholder,用起来特别便捷,能很好地适配多轮交互场景。

    复制代码
    from langchain_core.prompts import ChatPromptTemplate
    
    prompt_template = ChatPromptTemplate.from_messages([
        {"role": "system", "content": "你是AI开发助手{name},擅长编程开发和技术问题解答。"},
        {"role": "placeholder", "content": "{chat_history}"},
        {"role": "user", "content": "你能帮我做什么?"},
        {"role": "ai", "content": "我可以帮你写代码、改bug、设计技术方案。"},
        {"role": "user", "content": "{user_question}"}
    ])
    partial_prompt = prompt_template.partial(name="神算子")
    prompt_value = partial_prompt.invoke(
        {
        "user_question": "用Python写一个简单的计算器程序",
        "history": [
        {"role": "user", "content": "我想做个编程工具"},
        {"role": "ai", "content": "我来帮你实现"}
        ]
        }
    )
    res = llm.invoke(prompt_value, config=config)
    print(res.content)
    复制代码

     

  • 相关阅读:
    Navicat for MySQL 11软件下载及安装教程
    顺序表的定义和基本操作
    Java反射(Reflex)机制
    PAT 1065 A+B and C (64bit)
    RabbitMQ:基于DelayExchange插件实现延迟队列
    信息化发展55
    什么是机器学习中的集成学习,列举几种常见的集成学习算法
    css:img引入svg后修改颜色
    HTML5基础:label,select,textarea
    手动模式配置链路聚合
  • 原文地址:https://www.cnblogs.com/halfcode/p/20048498
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    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号