LangChain入门:Prompt模板与结构化输出详解
从手写提示词到结构化数据一文搞定LangChain核心输出解析 引言在开发大模型应用时我们常常面临两个核心问题如何高效地组织和管理提示词Prompt—— 避免代码中到处拼接字符串如何让模型返回程序可直接使用的结构化数据—— 而不是自然语言段落LangChain 提供了完善的解决方案PromptTemplate系列管理输入OutputParser系列处理输出。本文将带你从零开始掌握这两大模块并完成多个实战案例。一、Prompt 基础与模板1.1 什么是 PromptPrompt就是给模型的指令。简单示例python请用中文介绍一下LangChain。但在实际项目中Prompt 往往包含角色设定、任务描述、输入数据和约束条件python system 你是一名资深技术顾问擅长用通俗语言解释复杂概念。 human 请向非技术人员介绍LangChain字数控制在200字以内。如果每次都在代码中拼接会产生大量重复和易错代码。Prompt 模板将固定部分与变量分离提高复用性和可维护性。1.2 PromptTemplate纯文本模板适用于不需要区分系统/用户角色的简单文本任务。python from langchain_core.prompts import PromptTemplate template PromptTemplate.from_template( 请为产品{product_name}写一句广告语突出{feature}。 ) prompt template.invoke({product_name: 智能手环, feature: 超长续航}) print(prompt) # 输出请为产品智能手环写一句广告语突出超长续航。1.3 ChatPromptTemplate聊天消息模板推荐使用因为它可以构建结构化的消息列表SystemMessage / HumanMessage / AIMessage更符合现代对话模型的输入习惯。python from langchain_core.prompts import ChatPromptTemplate chat_template ChatPromptTemplate.from_messages([ (system, 你是一位{role}回答要简洁专业。), (human, {question}) ]) prompt_value chat_template.invoke({ role: AI产品经理, question: 什么是RAG }) # 内部会生成 [SystemMessage, HumanMessage]模板类型输出形式适用场景PromptTemplate纯字符串简单文本生成无角色区分ChatPromptTemplate消息列表聊天、Agent、多轮对话二、Prompt 编写最佳实践掌握以下四个原则就能写出高质量的 Prompt明确角色—— 让模型以特定身份思考明确任务—— 说清楚要做什么明确约束—— 限制输出格式、字数、风格给出输入字段—— 让模型清楚每个变量的含义三、实战案例Prompt 篇案例1商品文案生成器根据商品信息自动生成电商文案。代码01_product_copywriter.pypython from langchain_core.prompts import ChatPromptTemplate from utils.model_factory import get_deepSeek_model model get_deepSeek_model() template ChatPromptTemplate.from_messages([ (system, 你是一名资深电商文案写手擅长用吸引人的语言描述产品。), (human, 请为以下商品撰写一段电商文案150字以内包含标题和卖点。 商品名称{name} 核心卖点{feature} 适用人群{target} ) ]) prompt template.invoke({ name: 智能保温杯, feature: 24小时保温智能测温健康提醒, target: 注重健康的办公族 }) response model.invoke(prompt) print(response.content)案例2学习计划生成器根据学习目标生成分阶段计划。代码02_study_plan.pypython from langchain_core.prompts import ChatPromptTemplate from utils.model_factory import get_deepSeek_model model get_deepSeek_model() template ChatPromptTemplate.from_messages([ (system, 你是一位资深学习规划师。), (human, 为以下学习目标制定一份为期{days}天的学习计划。 目标{goal} 当前水平{level} 每日可用时间{hours}小时 请按阶段列出每日任务并给出学习建议。 ) ]) prompt template.invoke({ goal: 从零开始学习Python数据分析, days: 30, level: 零基础, hours: 2 }) response model.invoke(prompt) print(response.content)案例3客服回复生成器模拟根据用户问题和订单信息生成回复。代码03_customer_reply.pypython from langchain_core.prompts import ChatPromptTemplate from utils.model_factory import get_deepSeek_model model get_deepSeek_model() template ChatPromptTemplate.from_messages([ (system, 你是一名专业客服回复要礼貌且解决问题。), (human, 用户问题{question} 订单状态{status} 物流信息{logistics} 请生成一段客服回复给出明确解决方案。 ) ]) prompt template.invoke({ question: 我的快递显示签收但我没收到, status: 已签收, logistics: 2025-01-15 10:00 已由门卫代收 }) response model.invoke(prompt) print(response.content)四、MessagesPlaceholder插入多轮对话历史在构建聊天应用时经常需要将历史消息插入到模板中。MessagesPlaceholder专门用于此。python from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder prompt ChatPromptTemplate.from_messages([ (system, 你是一个乐于助人的AI助手。), MessagesPlaceholder(history, optionalTrue, n_messages4), # 最多保留4条 (human, {question}) ]) history [ (human, 我叫小明), (ai, 你好小明有什么可以帮你), (human, 我喜欢Python), (ai, Python是很好的语言) ] prompt_value prompt.invoke({ history: history, question: 我刚才说了什么 }) # 实际只会插入最近4条历史消息如果超过参数说明variable_name输入变量名optional是否必须传入默认Falsen_messages最多保留最近几条消息五、结构化输出让程序读懂模型结果模型返回的自然语言虽然易读但程序难以直接处理。我们需要让模型输出JSON或其他结构化格式。5.1 StrOutputParser简单的字符串提取如果只想要纯文本内容StrOutputParser可以将AIMessage转为普通字符串并支持管道组合。python from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate model get_deepSeek_model() parser StrOutputParser() chain ChatPromptTemplate.from_template(翻译成中文{text}) | model | parser result chain.invoke({text: LangChain is awesome!}) print(result) # 直接打印字符串为什么不用response.content在管道|中每个组件必须是Runnable而.content是属性不是 Runnable。StrOutputParser正是为了合规接入管道。5.2 Pydantic 定义输出结构使用Pydantic声明期望的字段及类型让模型按此格式返回。python from pydantic import BaseModel, Field from typing import Literal class ResumeInfo(BaseModel): name: str Field(description候选人姓名) years_of_experience: int Field(description工作年限) skills: list[str] Field(description掌握的技术技能) target_position: str Field(description目标岗位)5.3 PydanticOutputParser手动解析该解析器会根据 Pydantic 模型生成格式说明get_format_instructions()并嵌入 Prompt最后将模型输出解析成对象。案例简历信息抽取 (02_resume_extractor.py)python from langchain_core.output_parsers import PydanticOutputParser from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel, Field from utils.model_factory import get_deepSeek_model model get_deepSeek_model() class ResumeInfo(BaseModel): name: str Field(description姓名) years_of_experience: int Field(description工作年限) skills: list[str] Field(description掌握的技术技能) target_position: str Field(description目标岗位) parser PydanticOutputParser(pydantic_objectResumeInfo) format_instructions parser.get_format_instructions() template ChatPromptTemplate.from_messages([ (system, 你是一名招聘分析助手。\n{format_instructions}), (human, {resume_content}) ]) resume_text 我叫张三工作10年擅长Python、LangChain、FastAPI想找智能体开发岗位。 prompt template.invoke({ format_instructions: format_instructions, resume_content: resume_text }) response model.invoke(prompt) result parser.invoke(response) print(result.name) # 张三 print(result.years_of_experience) # 10 print(result.skills) # [Python, LangChain, FastAPI] print(result.target_position) # 智能体开发5.4 with_structured_output更简洁的方式如果模型服务支持如 OpenAI、DeepSeek 的 JSON 模式可以直接在模型上绑定输出结构。python structured_model model.with_structured_output(ResumeInfo, methodjson_mode) result structured_model.invoke(从简历中提取信息...) # 返回的 result 就是 ResumeInfo 实例注意使用 DeepSeek 时需指定methodjson_mode否则会报错。案例商品评论分析 (03_review_analyzer.py)python from typing import Literal from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel, Field from utils.model_factory import get_deepSeek_model class ReviewAnalysis(BaseModel): sentiment: Literal[正面, 负面, 中性] Field(description情感倾向) keywords: list[str] Field(description关键词) summary: str Field(description评论总结) needs_reply: bool Field(description是否需要商家回复) model get_deepSeek_model() structured_model model.with_structured_output(ReviewAnalysis, methodjson_mode) template ChatPromptTemplate.from_messages([ (system, 你是评论分析专家严格按JSON格式输出。), (human, 分析评论{review}) ]) prompt template.invoke({ review: 鼠标手感不错也很安静但是用了两周滚轮就有异响。 }) result structured_model.invoke(prompt) print(result.sentiment) # 负面 print(result.keywords) # [手感, 安静, 滚轮异响] print(result.summary) # 用户认可手感但反映滚轮质量问题 print(result.needs_reply)# True案例工单分类 (04_ticket_classifier.py)python from typing import Literal from langchain_core.output_parsers import PydanticOutputParser from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel, Field from utils.model_factory import get_deepSeek_model class TicketResult(BaseModel): category: Literal[订单, 物流, 退款, 产品, 其他] Field(description工单分类) priority: Literal[低, 中, 高] Field(description优先级) reason: str Field(description分类原因) parser PydanticOutputParser(pydantic_objectTicketResult) format_instructions parser.get_format_instructions() template ChatPromptTemplate.from_messages([ (system, 客服工单分类助手。\n{format_instructions}), (human, {question}) ]) prompt template.invoke({ format_instructions: format_instructions, question: 订单显示已签收但我没收到商品请处理。 }) response model.invoke(prompt) result parser.invoke(response) print(result.category) # 物流 print(result.priority) # 高 if result.priority 高: print(立即转人工)六、处理解析错误模型输出不稳定时可能返回不符合结构的内容。应捕获OutputParserException或通用异常。python from langchain_core.exceptions import OutputParserException try: result parser.parse(response.content) except OutputParserException as e: print(解析失败原始输出, response.content) print(错误信息, e) # 可进行重试、日志记录或人工干预七、结构化方式对比方式优点缺点适用场景StrOutputParser简单、管道兼容仅返回字符串摘要、翻译、问答PydanticOutputParser清晰、可自定义需手动拼接格式说明需要精细控制解析过程with_structured_output代码简洁依赖模型服务支持现代大模型OpenAI/DeepSeek等建议先掌握PydanticOutputParser理解原理实际项目优先使用with_structured_output。八、工具函数封装减少重复代码为了让案例更干净我们将模型初始化抽到utils/model_factory.pypython # utils/model_factory.py from langchain_openai import ChatOpenAI import os def get_deepSeek_model(temperature0): return ChatOpenAI( modeldeepseek-chat, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com/v1, temperaturetemperature )这样每个案例只需导入get_deepSeek_model即可。九、常见问题解答Q1Prompt 越长越好吗不是。应清晰简洁避免过多无关要求否则模型可能顾此失彼。Q2模型为什么不完全按指令输出大模型是概率性生成不能保证100%服从。若输出格式关键需配合结构化输出和程序校验。Q3PromptTemplatevsChatPromptTemplate如果模型支持多角色消息System/Human优先用ChatPromptTemplate本课程所有案例均使用它。Q4为什么temperature0对于信息抽取、分类等确定性任务温度设为0可获得最稳定输出。Q5with_structured_output没看到 JSON 字符串因为 LangChain 内部已将 JSON 自动解析为 Pydantic 对象你拿到的直接就是模型实例。 总结通过本文你学会了使用PromptTemplate/ChatPromptTemplate管理提示词编写高质量 Prompt 的四个原则三个业务案例文案、计划、客服实战MessagesPlaceholder处理聊天历史三种输出解析器StrOutputParser、PydanticOutputParser、with_structured_output结构化输出案例简历抽取、评论分析、工单分类处理解析错误和异常掌握这些技能你就能构建出既易于维护又能与业务系统无缝对接的 LLM 应用。

相关新闻

猫抓浏览器插件终极指南:3步解锁网页视频下载,告别平台限制!

猫抓浏览器插件终极指南:3步解锁网页视频下载,告别平台限制!

猫抓浏览器插件终极指南:3步解锁网页视频下载,告别平台限制! 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还…

2026/7/24 18:22:14阅读更多 →
OpenAI API集成实战:构建AI辅助开发环境ADE完整指南

OpenAI API集成实战:构建AI辅助开发环境ADE完整指南

在实际项目开发中,我们经常需要处理各种数据格式转换、API 集成和自动化流程。特别是在 AI 技术快速发展的背景下,如何高效利用 OpenAI 提供的强大模型能力,将其无缝集成到现有工程体系中,成为很多开发者关注的重点。本文将以一个…

2026/7/24 18:22:14阅读更多 →
如何成为黑客:(Kali配置与DVWA渗透实战全攻略)

如何成为黑客:(Kali配置与DVWA渗透实战全攻略)

第一部分&#xff1a;环境搭建&#xff08;步步截图级详细&#xff09; 步骤1&#xff1a;准备虚拟机与Kali Linux 下载并安装虚拟机软件&#xff1a; <ul>前往 VirtualBox (https://www.virtualbox.org/) 或 VMware Workstation Player (Fusion and Workstation | VMw…

2026/7/24 18:22:14阅读更多 →
GPT模型演进:从Transformer到多模态智能的突破

GPT模型演进:从Transformer到多模态智能的突破

1. GPT系列模型的技术演进图谱 当我们追溯GPT系列的发展轨迹&#xff0c;会发现一条清晰的"算力-数据-架构"协同进化路径。2018年诞生的GPT-1首次验证了Transformer解码器在语言建模中的潜力&#xff0c;其1.17亿参数规模在当年已属大型模型&#xff0c;但真正突破发…

2026/7/24 19:48:27阅读更多 →
抖音无水印下载神器:专业级批量下载工具完全指南

抖音无水印下载神器:专业级批量下载工具完全指南

抖音无水印下载神器&#xff1a;专业级批量下载工具完全指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…

2026/7/24 19:48:27阅读更多 →
15天学会AI应用开发(二十)使用LangChain实现RAG检索功能

15天学会AI应用开发(二十)使用LangChain实现RAG检索功能

之前的文章《15天学会AI应用开发&#xff08;十三&#xff09;上下文与RAG的阶段性总结》概述了检索RAG知识库的主要步骤&#xff0c;现在采用LangChain将其改造为更智能的本地RAG系统。 接下来基于LangChain框架与Chroma向量数据库&#xff0c;结合离线的文本嵌入模型和大语言…

2026/7/24 19:48:27阅读更多 →
3D LUT Color Conversion之查找表索引解析

3D LUT Color Conversion之查找表索引解析

目录 1 硬件基础规格定义 1.1 维度标准化定义 1.2 多维网格转一维索引通用数学公式 2 公式分项物理含义拆解 2.1 第一项 R&#xff1a;R 轴最小粒度偏移 2.2 第二项 9G&#xff1a;G 轴单行跨度权重 2.3 第三项 81B&#xff1a;B 轴整层 RG 平面跨度权重 3 四面体顶点偏…

2026/7/24 19:48:27阅读更多 →
实时语音翻译中的证据驱动术语适应技术解析

实时语音翻译中的证据驱动术语适应技术解析

在实时语音翻译&#xff08;Simultaneous Speech Translation, SimulST&#xff09;系统中&#xff0c;术语一致性是影响专业领域翻译质量的关键因素。当翻译涉及医疗、法律、技术等专业内容时&#xff0c;同一个术语在原文和译文中的表达必须严格对应&#xff0c;否则会引发歧…

2026/7/24 19:48:27阅读更多 →
LoRA微调技术解析:轻量化适配大模型的黄金法则

LoRA微调技术解析:轻量化适配大模型的黄金法则

1. LoRA微调技术解析&#xff1a;轻量化适配大模型的黄金法则在自然语言处理领域&#xff0c;微调预训练大语言模型&#xff08;LLM&#xff09;一直是提升模型特定任务表现的核心手段。但传统全参数微调方法面临显存占用高、计算资源消耗大等痛点&#xff0c;尤其当模型参数规…

2026/7/24 19:46:27阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好&#xff0c;我是一名编程初学者&#xff0c;同时这也是我编程学习之路上的第一篇博客。在这里&#xff0c;我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手&#xff0c;目前在学习c语言&#xff0c;我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述&#xff1a; 解法&#xff1a; 1、模拟&#xff08;参考自【LeetCode 54】螺旋矩阵-CSDN博客&#xff09; int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会&#xff0c;昔日AI六小龙来了五家&#xff0c;分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了&#xff0c;唯一缺席的竟是近几个月来风光无限的智谱。&#xff08;DeepSeek一直不参加&#xff09;WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →