LangChain快速筑基(带代码)P1-输入控制与输出解析

article/2025/8/18 15:45:51

欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。

目录

  • 引言
  • 基础代码
    • LangChain python官方文档
  • 输出可控性
    • 结构化输入输出:提示模板Prompt Templates
    • 输出解析器 Output Parsers(输出解析器)

引言

在上一篇LangChain入门中,我们已经了解到了可以使用LangChain的langchain_deepseek组件与DeepSeek进行对话。
但DeepSeek并没有提供如OpenAI一样的诸多参数来解决AI使用的问题,如控制随机性的temperature,控制重复(质量和新颖度)的presence_penalty和frequency_penalty。

关于参数在之前常见AI参数讲解有介绍过。

那AI的诸多问题要怎么解决呢?要怎么控制大模型(AI)呢?
常见问题如下:
![[【LangChain】LangChain基础概念-2.png]]

我们应该使用“直接修改大模型本身”之外的方案来解决问题(不现实)。
比如,LangChain。
LangChain不仅仅通过简单传递参数给 LLM API来解决问题,它还抽象了一系列组件来提供问题的解决方案。使用LangChain,可以讲不同大模型API封装成统一、易于调用的形式。

需要快速回顾和看懂Python的Java程序员可以看一下我之前写的Python快速入门

基础代码

上一篇入门中有与DeepSeek联网搜索对话的代码,这里放一个对话基础代码。

我本地是没有问题的(狗头)。有问题随时交流。

在DeepSeek官网购买获取API-KEY后替换到代码中。

import os# 基础对话所需
from langchain_deepseek import ChatDeepSeek
from langchain_core.messages import SystemMessage, HumanMessage# 环境key
os.environ["DEEPSEEK_API_KEY"] = 'sk-xx'def get_deepseek_key():key = os.getenv('DEEPSEEK_API_KEY')if key is None:raise ValueError("DEEPSEEK_API_KEY not found in environment variables.")return key# --- LLM 初始化 ---
def create_deepseek_llm():api_key = get_deepseek_key()if not api_key:raise ValueError("没有ds key")return ChatDeepSeek(model = "deepseek-chat",temperature=0.1, # 低温度,更具备确定性max_tokens=1024, timeout=None,max_retries=2,api_key=api_key)def test_simple_llm_call():llm = create_deepseek_llm()# 封装消息# LangChain 支持的消息类型如下:# - 'human': 人类消息# - 'user': 用户消息# - 'ai': AI 消息# - 'assistant': 助手消息# - 'function': 函数消息# - 'tool': 工具消息# - 'system': 系统消息# - 'developer': 开发者消息messages = [("system","你是一个乐于助人的LangChain专家。"),("human","你好,请用一句话介绍LangChain。")]# 流式响应for chunk in llm.stream(messages):print(chunk.text(), end="")print("\n AI回答完了")# 单词响应# response = llm.invoke(messages)# print("AI:", response.content)if __name__ == '__main__':test_simple_llm_call()

LangChain python官方文档

https://python.langchain.com/docs/how_to/#prompt-templates

输出可控性

结构化输入输出:提示模板Prompt Templates

LangChain提供了组件 Prompt Templates(提示模板)用来"让你的指令更规范、灵活,并且可以动态地根据用户输入或上下文调整"。

# 导入提示模板
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate

场景:我们创建一个LangChain专家的提示模板

import os# 基础对话所需
from langchain_deepseek import ChatDeepSeek
from langchain_core.messages import SystemMessage, HumanMessage# 提示模板
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate# 环境key
os.environ["DEEPSEEK_API_KEY"] = 'sk-xx'def get_deepseek_key():key = os.getenv('DEEPSEEK_API_KEY')if key is None:raise ValueError("DEEPSEEK_API_KEY not found in environment variables.")return key# --- LLM 初始化 ---
def create_deepseek_llm():api_key = get_deepseek_key()if not api_key:raise ValueError("没有ds key")return ChatDeepSeek(model = "deepseek-chat",temperature=0.1, # 低温度,更具备确定性max_tokens=1024,timeout=None,max_retries=2,api_key=api_key)# --- 使用模板对话限定输入输出 ---
def create_langchain_teacher_template():# 创建基础对话模板 """ 我们能在一些消息的构建上看到这种使用消息对象的写法。但是实际上这不是推荐的简洁写法,应该直接使用元组。是的,这个写法不会被视为一个s-string模板,而是一个stringreturn ChatPromptTemplate.from_messages([SystemMessage(content="你是一个乐于助人的LangChain专家。"),HumanMessage(content="你好,我想问一个关于LangChain的问题: {actual_user_input}")])"""return ChatPromptTemplate.from_messages([("system", "你是一个乐于助人的LangChain专家。"),("human", "你好,我想问一个关于LangChain的问题: {actual_user_input}") # 确保这里是占位符])def test_simple_template_call():llm = create_deepseek_llm()user_question = "你好,请问LangChain组件Prompt Templates可以做什么?"prompt_template = create_langchain_teacher_template()messages = prompt_template.format_messages(actual_user_input=user_question)print("最终发送给 LLM 的消息:")for msg in messages:print(f"- 类型: {msg.type}, 内容: {msg.content}")print("\nAI开始回答")for chunk in llm.stream(messages):print(chunk.content, end="")print("\nAI回答完了")if __name__ == '__main__':test_simple_template_call()

Prompt Templates可以告诉LLM它应该扮演什么角色、提供上下文、引导输出。

这里需要注意的是,在使用ChatPromptTemplate.from_messages()方法创建ChatPromptTemplate实例时,使用元组消息而是不是使用消息对象。
(“human”, “…”) 语法糖在幕后为你做了更多的工作,将字符串自动识别和处理为模板。而直接使用 HumanMessage(content=“…”) 时,content 被视为最终内容,而不是一个待格式化的模板。

输出解析器 Output Parsers(输出解析器)

现在,我们已经了解了基本对话和使用提示词模板Prompt Templates来限制输出。有时候我们需要结构化的输出数据,比如JSON、列表等…
LangChain提供了Output Parsers(输出解析器)来解析大模型返回文本。

以Prompt Templates的代码为基础,我们导入类库,询问LangChain的3个优点

import os# 基础对话所需
from langchain_deepseek import ChatDeepSeek
from langchain_core.messages import SystemMessage, HumanMessage# 提示模板
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate# 输出解析器
from langchain.output_parsers import CommaSeparatedListOutputParser# 链条
from langchain.chains import LLMChain, SimpleSequentialChain, SequentialChain# 环境key
os.environ["DEEPSEEK_API_KEY"] = 'sk-xx'def get_deepseek_key():key = os.getenv('DEEPSEEK_API_KEY')if key is None:raise ValueError("DEEPSEEK_API_KEY not found in environment variables.")return key# --- LLM 初始化 ---
def create_deepseek_llm():api_key = get_deepseek_key()if not api_key:raise ValueError("没有ds key")return ChatDeepSeek(model = "deepseek-chat",temperature=0.1, # 低温度,更具备确定性max_tokens=1024,timeout=None,max_retries=2,api_key=api_key)# --- 使用模板对话限定输入输出 ---
def create_langchain_teacher_template():return ChatPromptTemplate.from_messages([("system", "你是一个乐于助人的LangChain专家。"),("human", "你好,我想问一个关于LangChain的问题: {actual_user_input} \n\n {format_instructions}") # 确保这里是占位符])# --- 使用输出解析器解析输出 ---
def create_output_parser():return CommaSeparatedListOutputParser()def test_output_parser_with_template():llm = create_deepseek_llm()output_parser = create_output_parser()"""1.获取格式化指令对于 CommaSeparatedListOutputParser,它会是类似 "Your response should be a list of comma separated values, eg: `foo, bar, baz`""""format_instructions = output_parser.get_format_instructions()print(f"输出解析器的格式化指令: {format_instructions}")prompt_template = create_langchain_teacher_template()user_task = "请列出 LangChain 的3个主要优点。"# 2.格式化完整提示,包含用户任务和格式指令messages_for_llm = prompt_template.format_messages(actual_user_input=user_task,format_instructions=format_instructions)print("\n最终发送给 LLM 的消息 (包含格式指令):")for msg in messages_for_llm:print(f"- 类型: {msg.type}, 内容: {msg.content}")# 3. 调用LLM并获取原始文本输出print("\nAI开始生成原始文本 (等待 LLM 响应)...")ai_response_message = llm.invoke(messages_for_llm)raw_llm_output = ai_response_message.content # AIMessage对象的content属性是字符串print(f"LLM 返回的原始文本: '{raw_llm_output}'")# 4. 解析原始文本输出try:parsed_output = output_parser.parse(raw_llm_output)print("\n解析后的输出 (Python列表):")print(parsed_output)if isinstance(parsed_output, list):print("LangChain 的3个优点是:")for i,advantage in enumerate(parsed_output):print(f"{i}. {advantage.strip()}")except Exception as e:print(f"解析输出时出错: {e}")print("这通常意味着 LLM 的输出没有严格遵循格式化指令。")print("你可以尝试调整提示,或者使用更鲁棒的解析器/重试机制。")print("--- 结束测试:带输出解析器的模板调用 ---\n")if __name__ == '__main__':test_output_parser_with_template()

![[【LangChain】LangChain2-基础概念P1.png]]


http://www.hkcw.cn/article/DjSWgOioHn.shtml

相关文章

在哈佛毕业礼上演讲的中国女孩是谁?江玉蓉来自中国青岛

在哈佛毕业礼上演讲的中国女孩是谁?5月29日,在哈佛大学毕业典礼上,三名毕业生代表在演讲时强调,要保持学生群体的多元化和国际化,并在特朗普政府的攻击面前坚持真理。其中一位演讲者是来自中国的江玉蓉(音译)。她说,自己从小就相信世界正在变成一个小村庄,并在哈佛找到…

日本北海道东部近海发生5.4级地震

日本北海道东部近海发生地震。5月30日电,据日本气象厅消息,当地时间5月30日7时23分左右,日本北海道东部近海地区发生5.4级地震,最大震感为震度3,震源深度50公里。责任编辑:0882

ubuntu24.04启用fcitx 5

在ubuntu24.04中启用fcitx 5 ubuntu24.04系统自带三种键盘输入法系统: IBusFcitx 5XIM 系统默认使用的是IBus,这个拼音输入少了一些智能的味道,比较影响输入体验。换用Fcitx 5后,加上搜狗细胞词库,感觉很丝滑,特记录…

C++多态的详细讲解

【本节目标】 1. 多态的概念 2. 多态的定义及实现 3. 抽象类 4. 多态的原理 5. 单继承和多继承关系中的虚函数表 前言 需要声明的,本博客中的代码及解释都是在 vs2013 下的 x86 程序中,涉及的指针都是 4bytes 。 如果要其他平台下,部…

上海女子新装修房子被人拆光 乌龙事件背后的真相

最近,家住浦东新区“芳草苑”小区的张女士向《新闻坊》同心服务平台反映,她家刚刚完成了老房新装,原本计划第二天从出租屋搬回去。但当她回家查看收尾进度时,发现厨房和卫生间里的设施设备被三个陌生人拆了。这些设施和装修材料都是全新的、一线品牌的定制款,这让张女士非…

范丞丞广电培训手写笔记曝光 青年演员心得分享

5月30日,“陈都灵杨超越范丞丞广电培训笔记”的词条冲上热搜。此前,5月18日至21日,2025年青年演员和经纪人培训班(第二期)在广电总局研修学院顺义校区举办。这是广电总局组织的总第6期青年演员和经纪人培训班,共有34名青年演员和23名经纪人参加了为期四天的封闭学习。参加…

万达已出售近五分之一的万达广场!

万达已出售近五分之一的万达广场。距离卖掉万达集团北京总部还不到半年时间,王健林再次出售手中资产。2025年5月20日,根据国家市场监督管理总局官网信息:太盟(珠海)管理咨询合伙企业(有限合伙)、高和丰德(北京)企业管理服务有限公司、腾讯控股有限公司、北京市潘达商业…

YOLO12改进-模块-引入AFE模块 增强模型对复杂场景(如杂乱背景、小目标、半透明物体)的特征提取能力

在语义分割任务中,复杂场景(如杂乱背景、半透明物体)下的语义线索捕捉是难点。现有方法(如基于 CNN 和 Transformer 的模型)存在以下局限: CNN:受限于局部感受野,难以建模长…

华为OD机试真题——字母组合过滤组合字符串(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

男子深夜爬泰山崩溃痛哭:大喊要回家找媳妇

男子深夜爬泰山崩溃痛哭。全网疯传!夜爬泰山避坑指南:为何有人登顶后痛哭?这些细节能救命!泰山景区数据显示,夜爬游客受伤率同比激增,其中78%因未携带照明设备跌落台阶。最近曝光的"大学生夜爬冻伤事件",正是轻视了泰山顶与山脚高达15℃的温差。正值暑期夜爬高…

网友在摩洛哥偶遇成都“洋中医”狂飙四川话

网友在摩洛哥偶遇成都“洋中医”。首位外籍中医博士迪亚拉在摩洛哥被偶遇与成都“老乡”狂飙四川话5月26日,有网友发布视频称在摩洛哥偶遇首位外籍中医博士迪亚拉,两人狂飙四川话,还约在成都吃火锅。迪亚拉,1984年获奖学金到中国学习,于1997年获得成都中医药大学博士学位,…

端午假期首都博物馆延长开放时间 六月活动精彩纷呈

端午假期首都博物馆延长开放时间!为了满足广大观众的参观需求,首都博物馆2025年6月将进行部分场次的延时开放活动。端午假期及6月份延时开放相关事宜如下:2025年5月31日(端午节、周六)至6月2日(周一)正常开放。延时开放场次为5月31日(端午节、周六)、6月7日(周六)、…

老人骑电动车捎人遇车祸后被判赔14万 好心搭载惹争议

老人骑电动车捎人遇车祸后被判赔14万 好心搭载惹争议!2023年8月15日清晨,浙江省东阳市六石街道徐庄村的卢某芳老人骑电动车前往镇上参加领鸡蛋的促销活动。在现场,她遇到了隔壁村的老友吕某,在返程时捎带吕某一同回家,尽管这需要绕路。不幸的是,在返程途中,电动车与一辆…

辣目洋子回母校重大讲座分享 勇敢追梦不惧质疑

5月29日,李嘉琦回到母校重庆大学,参加新闻学院“优秀校友回母校”系列讲座。她以“梦想?梦幻?人生也是一部电视剧”为主题,与学弟学妹们分享了自己在母校时的学习生活和进入娱乐圈的经历。李嘉琦从小有一个当演员的梦想,但不知道如何实现。高考时,她从内蒙古考入重庆大学…

济南5元快餐店老板回应是否亏钱 意外走红后生意更旺

山东济南市天桥区一家名为“小孟5元自助快餐”的小店,因一条关于“菜量少并且贵”的差评意外走红网络。许多网友在该店外卖及美食点评平台的评论区跟帖“玩梗”,晒出波龙、帝王蟹等海鲜美食图片,替店老板发声鸣不平。这家备受热捧的小店位于巷子里,面积约10平方米。厨房和打…

数据库 | timescaledb性能初步测试

数据库docker限制资源:CPU 4核,内存 8G。数据库版本:2.15.1-pg16 表结构和索引如下: CREATE TABLE dm_tag_value (id BIGINT NOT NULL DEFAULT 0,ds_id BIGINT DEFAULT NULL,tag_name VARCHAR(200) DEFAULT NULL,tag_value VARCH…

CVE-2019-0193源码分析与漏洞复现

漏洞概述 漏洞名称:Apache Solr DataImportHandler 远程代码执行漏洞 漏洞编号:CVE-2019-0193 CVSS 评分:9.8 影响版本:Apache Solr 1.3 - 8.2.0 修复版本:Apache Solr ≥ 8.2.0 漏洞类型:输入验证缺陷导致…

圣杯布局和双飞翼布局的实现方法

目录 一、圣杯布局 1.传统布局floatmargin 2.使用flex布局 3.使用grid网格布局 二、双飞翼布局 一、圣杯布局 1.传统布局floatmargin 使用传统的float浮动和相对定位来实现 <div class"main-container"><div class"main"></div><div …

第4讲、Odoo 18 模块系统源码全解与架构深度剖析【modules】

引言 Odoo 是一款强大的开源企业资源规划&#xff08;ERP&#xff09;与客户关系管理&#xff08;CRM&#xff09;系统&#xff0c;其核心竞争力之一在于高度模块化的架构设计。模块系统不仅是 Odoo 框架的基石&#xff0c;更是实现功能灵活扩展与定制的关键。本文将结合 Odoo…

一台笔记本实现基因表达敲除?!scTenifoldKnk 单细胞基因模拟敲除教程

生信碱移 单细胞基因模拟敲除 scTenifoldKnk 是一种基于单细胞RNA测序数据进行虚拟基因敲除分析的方法&#xff0c;能够用于预测特定基因在某一细胞群体中敲低后的整体基因表达谱变化&#xff0c;也可以扩展到多细胞群体的敲除分析。 基因扰动实验是研究特定基因功能作用的强大…