版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LangChain核心模块(Model/Memory/Chain)【课程目标】1、学习langchain的Model、Chain、Memory三大模块2、基于三大模块的功能完成客服助手的开发【课程重难点】1、JsonOutputParser的使用2、定义PydanticBaseModel的使用3、RunnableWithMessageHistory的使用思考:当我们直接调用大模型API时,会遇到哪些问题?无上下文记忆•每次对话都是“一次性”的,模型无法关联并记住上一轮的对话内容。•例如:问完“什么是人工智能?”,再问“它有什么应用?”,模型可能无法理解“它”的指代对象。调用方式零散•文本生成、对话管理、工具调用等功能,都需要编写不同的API调用代码,缺乏统一的框架。•业务逻辑分散,代码重复冗余,不仅开发效率低,后期也难以维护和扩展。复杂业务难以构建•如何让模型先联网搜索最新资料,再根据资料撰写报告?•如何在多轮对话中精准控制模型的角色人设?原生API接口功能单一,很难直接实现这些复杂的业务逻辑流程。什么是LangChainLangChain正是为了解决这些痛点而生的主流大模型应用开发框架。它通过标准化的模块化设计,像“胶水”一样将各种能力粘合起来,是当前开发RAG(检索增强生成)、智能Agent、对话机器人的核心工具。统一接口屏蔽不同大模型厂商的API差异,开发适配更简单。模块化组件提供模型、记忆、提示词、工具等可复用的基础组件。LangChain让大模型应用开发变得更简单、更高效、更强大三大核心模块为了高效学习,我们首先要建立一个清晰的整体认知:Chain为载体、Model为算力、Memory为上下文。ChatModel·模型层基础算力|底层基石📍定位:应用的“发动机”和“大脑”,提供核心计算能力。⚡作用:统一各大厂商模型的调用接口,负责处理复杂逻辑推理与文本生成任务。Memory·记忆层上下文支撑|中层连接📍定位:应用的“短期记忆”或“对话日记本”,解决模型遗忘问题。🧠作用:管理和存储多轮对话历史,为模型提供必要的上下文信息,确保对话的连贯性。Chain·链路层业务核心|顶层应用📍定位:应用的“业务骨架”或“工作流流水线”,连接一切组件。🔗作用:串联提示词、模型、记忆等各个独立组件,将其封装为一个可执行的业务逻辑单元。核心依赖关系:Chain主动调用ChatModel并集成Memory,共同构建完整的智能应用闭环ChatModel模块什么是ChatModelChatModel是LangChain对所有大模型能力的统一抽象封装层,旨在解决不同模型平台之间的碎片化问题。屏蔽底层差异无需为OpenAI、Google、阿里等不同厂商编写特定适配代码,统一封装各类模型细节,降低适配成本。提供标准化接口极大提升开发效率与灵活性,支持在不同模型间一键切换,快速进行效果对比与选型,避免供应商锁定。简单来说:ChatModel模块让你可以“一招鲜,吃遍天”,用统一的方式调用全世界的大模型。ChatModel模块的特点与传统的LLM(输入输出均为纯文本)不同,ChatModel的输入和输出都是结构化的消息(Message)。这种结构化方式更符合人类对话的模式,能够有效保留上下文语境,实现自然流畅的多轮交互。输入(Input)•SystemMessage:设定AI角色、性格与行为准则,定义“人设”。•HumanMessage:代表用户发起的提问或指令。•AIMessage:模型历史回复,维持多轮对话的上下文。输出(Output)通常返回一个AIMessage对象,其中包含模型基于输入上下文生成的具体回复内容,格式规范,易于解析和处理。ChatOpenAI:ChatModel接口的具体实现核心定位:接口的具体实现ChatOpenAI是LangChain中ChatModel抽象接口的一个关键具体实现。它负责将上层统一的方法调用(如invoke,stream)转化为对底层特定模型API(如OpenAIAPI)的实际HTTP请求。核心方法:与模型交互•invoke(input,config=None):最常用方法,发送请求并等待完整结果,config为字典类型•stream(input,config=None):获取流式输出,逐块接收响应,适合实时聊天。方法参数详解•包含模型名称、模型请求地址以及请求鉴权所需的api_key等请求大模型服务所需要的必要信息。model核心参数llm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0.7,max_tokens=1024,top_p=0.9,frequency_penalty=0.1,presence_penalty=0.0,api_key="你的APIKey",base_url="模型地址")参数取值作用说明model根据模型名称确认指定使用的OpenAI模型temperature0-1控制输出随机性:值越高越创意发散,值越低越精准确定max_tokens根据模型信息自行设定限制单次响应的最大token长度,控制生成内容篇幅top_p0.9核采样:只从概率最高的前90%词汇中选择,平衡多样性与准确性frequency_penalty0.1降低重复词汇/句子的概率,轻微减少内容冗余presence_penalty0不强制引入新话题,保持回答聚焦api_key密钥字符串OpenAI官方身份凭证,用于接口调用鉴权base_urlAPI地址模型服务请求的接口基础地址,默认官方地址ChatModel基础使用#1.导入必要的类与消息对象fromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessage,SystemMessage#2.初始化模型实例并配置参数llm=ChatOpenAI(model="模型名",api_key="你的api_key",base_url="模型地址")#2.直接提问response=llm.invoke("请用一句话介绍LangChain是什么")#3.输出结果print(response.content)代码核心逻辑拆解01/模块导入:引入`ChatOpenAI`模型类和构建对话所需的`SystemMessage`与`HumanMessage`消息对象。02/实例化:创建模型实例,通过参数指定底层大模型类型与生成随机性(temperature)。03/模型调用:使用`invoke()`方法将消息列表传入模型,触发计算并获取回复。054/结果处理:从返回的响应对象中提取`.content`属性,即可得到模型生成的文本内容。拓展:ChatModel流式输出演示#使用stream()方法进行流式调用
forchunkinllm.stream("介绍一下大模型嵌入技术的应用场景"):#end=""确保不换行,flush=True确保立即输出print(chunk.content,end="",flush=True)代码核心解读•将原有的invoke()方法替换为stream()方法即可开启流式生成。
•stream()返回一个可迭代对象,需通过for循环逐块获取生成内容。
•打印时设置end=""和flush=True实现不间断的实时输出。交互体验升级实现类似“人类打字”的动态实时输出效果。
用户无需等待模型完整生成后才能看到内容,而是随着模型的思考过程逐字阅读,大幅减少了等待焦虑,显著提升交互体验。课堂练习基于上一页“ChatModel基础使用”的代码,填写自己的api_key、模型名以及模型请求接口后运行并打印模型请求,并进行改造,完成prompt模板的使用?(10分钟)其中系统提示词要求如下:你是一个专业的客服分析系统。你的任务是在对话上下文中提取关键信息并生成工单。重要规则:1.从对话历史中提取客户信息2.判断问题类型和紧急程度3.给出置信度评分chain模块传统调用大模型请求实现大家是否还记得我们之前使用langchain请求大模型的方式我们需要手动的调用格式化prompt、请求大模型、解析大模型响应各环节编排任务,有没有一种方式能够像coze搭建工作流一样编排任务呢?更简洁的编排方式——Chain`Chain`是LangChain的业务编排核心,本质上是一个将组件连接起来、实现业务逻辑的可复用的工作流流水线。形象比喻如果说`Model`是工人,`Prompt`是图纸,`Memory`是记录本...那么`Chain`就是把这些要素组织起来,按照特定流程完成复杂任务的自动化“智能生产线”。核心作用•串联零散组件(Prompt,Model,Tools等)
•将单一的模型能力,封装为可落地的、解决实际问题的复杂业务逻辑LCEL语法(重点)LCEL(LangChainExpressionLanguage)作为链式语法。它取代了传统的`LLMChain`等类,是目前企业级开发的主流标准。LCEL基本语法LCEL(LangChainExpressionLanguage):一种声明式编排语言,利用Python管道符`|`无缝串联不同的AI组件。💡核心思想:代码即流程图
数据像水流一样从左向右流经各个组件,逻辑直观,将复杂工作流转化为简单的线性结构。提示词模板(Prompt)|大语言模型(LLM)|输出解析器(Parser)1.提示词模板(Prompt)负责接收用户输入并格式化指令。
📥输入:含变量的字典
📤输出:格式化的`ChatMessage`对象列表2.大语言模型(LLM)核心计算单元,基于指令生成文本内容。
📥输入:消息列表(ChatMessage)
📤输出:模型生成结果(`AIMessage`)3.输出解析器(Parser)将模型原始输出转换为易处理的数据格式。
📥输入:原始模型回复(AIMessage)
📤输出:干净的字符串、JSON或自定义类✨优势总结:组件完全解耦,支持独立测试与灵活替换,极大提升代码的可维护性与扩展性。LCEL基本语法的数据流转标准结构:提示词模板|大语言模型|输出解析器定义的不只是业务流程,更是数据流转的方向和节点LCEL链式语法使用#1.初始化模型llm=ChatOpenAI(model="gpt-3.5-turbo",api_key="你的API_KEY",)#3.定义提示词模板(支持system/user结构化消息)prompt=ChatPromptTemplate.from_messages([("system","你是一个专业的客服分析系统............"),("user","{input}")])#4.定义输出解析器parser=StrOutputParser()#5.链式组装(LangChain标准LCEL写法)chain=prompt|llm|parser#6.执行调用,需注意以链式语法创建时向大模型发送请求的不再是llm对象而是我们定义的chain对象response=chain.invoke({"input":"什么是LangChain链式调用?"})print(response)这里出现了一个新的概念:解析器,它是用来做什么的呢?核心:结果解析器将大模型返回的原始文本,转化为代码可直接利用的结构化数据,是连接LLM与应用逻辑的关键桥梁。它解决了非结构化自然语言到工程化可用数据的转换难题,让AI的输出不再是“一次性文本”,而是可被程序逻辑复用的精准信息。StrOutputParser|极简文本输出直接将模型消息对象转为纯字符串,是最基础也最常用的解析器。适用于聊天对话、创意文本生成、简单问答等仅需原生文本内容的场景,无需复杂数据处理。JsonOutputParser|字典结构化将JSON格式的字符串解析为Python字典(dict)。适用于结构化信息抽取、API请求参数提取、工具函数调用后的结果标准化,让数据可被键值对快速索引与使用。解析器是LLM应用的「数字翻译官」。它将人类可读的自然语言,精准转化为机器可执行的程序语言。在实际开发中,解析器的选型直接决定了应用的稳定性与开发效率。选型心法:从简入繁,按需进阶
简单文本用Str,数据结构用JsonStrOutputParser解析器核心作用:文本归一化作为LangChain中最基础的解析器,它能直接剥离模型返回结果中的元数据与格式封装,将消息对象转换为纯净的字符串类型。这一过程剔除了所有冗余信息,让开发者可以直接获取到可阅读、可直接处理的原始文本内容。fromlangchain_core.output_parsersimportStrOutputParserparser=StrOutputParser()#初始化解析器chain=prompt|llm|parser#构建调用链res=chain.invoke({"input":"你好"})#执行调用适用场景:轻量文本交互适用于聊天机器人对话、通用文案生成、简单问答系统等场景。当业务逻辑不需要复杂的JSON结构或列表数据,仅需处理纯文本内容时,使用该解析器能以最小的性能开销完成数据转换,是构建快速原型和轻量级应用的首选方案。关键价值:极简与通用无需任何配置即可开箱即用,极大降低了开发门槛。它兼容几乎所有主流大模型的基础输出格式,不会引入额外的依赖项。在构建快速迭代的应用时,这种“所见即所得”的解析方式能让开发人员将精力聚焦于业务逻辑本身,而非数据格式的转换处理。JsonOutputParser解析器【重点】核心作用:JSON到Dict的无缝转换当我们要求大模型的回复内容输出JSON格式时,解析器自动将大模型返回的JSON格式字符串解析为Python原生字典对象。无需手动处理字符串切割、格式校验与异常捕获,直接通过键名即可访问目标数据,让结构化数据的提取与业务逻辑对接变得简洁、高效且不易出错。结构化数据提取针对用户评价、新闻报道等非结构化文本,精准提取关键信息并转化为可直接计算的字典格式,替代传统的正则表达式匹配,大幅降低开发成本与维护难度。智能信息抽取在复杂的多字段信息提取任务中,自动将模型输出的分散文本规整为结构化对象。无论是提取商品属性还是简历信息,都能确保数据的一致性与可访问性。工具调用结果处理作为Agent智能体的关键组件,快速解析大模型工具调用(FunctionCall)返回的JSON响应。将参数与执行结果直接映射为程序变量,无缝衔接后续业务逻辑的自动化执行。JsonOutputParser第一步:定义PydanticBaseModel子类PydanticBaseModel是实现结构化输出的核心基石。作为一款强大的Python库,它不仅用于数据解析与验证,更在大模型应用中充当了“翻译官”的角色——将大模型生成的自由文本,转化为程序可直接使用的、强类型的结构化数据对象。1、自定义class并继承BaseModel2、自定义类型的字段并用Filed进行修饰3、使用Filed中的description属性进行类字段描述注:pydantic语法中类字段的定义与python略有不同:name:类型其中name为字段名,类型为字段数据类型。代码示例:定义Ticket模型classTicket(BaseModel):summary:str=Field(description="问题摘要")suggested_solution:str=Field(description="建议解决方案")confidence_score:float=Field(description="置信度(0-1)",ge=0,le=1)安装依赖库使用pip命令安装LangChain核心库:
pipinstallpydanticJsonOutputParser第二步:实例化解析器直接使用JsonOutParser类进行实例化,在实例化过程中并为pydantic_object入参赋值,赋值内容为第一步定义的BaseModel子类JsonOutputParser第三步:翻译BaseModel1、在prompt定义时预留输出格式要求占位符:{format_instructions}2、使用partial()方法进行输出格式的填充3、使用get_format_instruction()翻译BaseModel并当作partial()函数的入参注意:get_format_instruction函数中入参变量名要与prompt中占位符的名称一致JsonOutputParser第四步:组装调用链并打印PydanticField深度解析:灵魂所在Field函数是Pydantic模型的“灵魂”,它让我们能为字段注入丰富的元数据与验证规则。这些信息不仅是代码层面的数据校验准则,更是JsonOutputParser与大模型沟通的语言,帮助生成更精准、更符合业务预期的结构化输出指令。核心关键:description——给LLM的“说明书”
这是Field最核心的属性,直接定义了字段的语义与内容标准。它相当于开发者写给大模型的“需求文档”,清晰、具体的描述能有效避免模型生成“格式合规但内容偏离”的无效数据,是确保输出质量的第一道防线。💡描述的颗粒度决定输出质量:setup:str=Field(description="笑话的铺垫部分,用于引出笑点的问题或情景")进阶:加入场景与逻辑特征(如“双关语”、“预期违背”),让LLM理解内容背后的创作意图,而非仅停留在字面定义。核心洞察:细节即指令大模型无法“猜”出你的业务细节。一个优秀的description应当包含:字段的业务含义、内容的格式要求、典型的场景案例以及内容的边界条件。描述越具体,模型的输出就越精准,这也是实现“一次定义,多次复用”高效开发的核心策略。Field属性:default&default_factorydefault:静态常量赋值核心作用:为字段直接绑定一个固定不变的默认值。在类定义阶段即完成初始化,所有实例共享该初始值(对于不可变类型安全)。适用场景:当默认值是确定的、不会变化的常量时使用,例如用户的默认成年年龄、接口的默认分页大小等静态配置。classUserProfile(BaseModel):name:str#所有新用户默认年龄设为18age:int=Field(default=18)default_factory:动态函数生成核心作用:传入一个可调用对象(如函数)。每次创建新实例时才调用该函数生成值,有效避免可变默认参数带来的副作用。适用场景:生成唯一ID、当前时间戳等动态值;或初始化空列表、空字典等可变对象,是处理动态默认值的最佳实践。classOrder(BaseModel):#每次创建订单生成新的唯一ID和时间id:str=Field(default_factory=lambda:uuid4().hex)items:list=Field(default_factory=list)Field属性:数值与字符串约束数值约束(int/float)针对整数和浮点数类型,通过边界值与倍数规则精准限定数值范围,是处理价格、数量、评分等业务数据的基础校验手段。gt/lt大于/小于,设定数值的严格排他边界,如价格必须大于0。ge/le大于等于/小于等于,包含临界值,如库存数量下限为1。classProduct(BaseModel):
price:float=Field(gt=0,description="价格必须大于0")
quantity:int=Field(ge=1,le=100,description="数量1-100")字符串约束(str)针对文本内容进行结构化校验,是确保用户名、邮箱、地址等关键信息合规的核心手段,支持灵活的格式定义。min_length设定字符最小长度,防止无效的过短输入。max_length限制字符最大长度,控制存储与展示成本。pattern正则表达式匹配,校验复杂格式。classUser(BaseModel):
username:str=Field(min_length=3,max_length=20)
课堂练习基于上一个课堂练习,请自行设计BaseModel子类,并改造prompt,填充输出格式信息,完成基JsonOutputParser的大模型输出内容解析要求:1、需使用Filed描述子类字段
2、打印解析后的JSON。时间:15分钟Memory(记忆)模块大家回想一下,第五次课程时我们对历史消息处理的步骤是什么呢?chathistory=[]resp=stream_chat_response(llm=llm,prompt=prompt,system_prompt=system_prompt,user_question=user_input,chat_history=chat_history)#更新历史chat_history.append(HumanMessage(content=user_input))chat_history.append(AIMessage(content=response))关键点:需要手动维护历史信息定义一个空列表封装用户问题与系统回复将问题与回复按顺序存入列表处理大模型响应核心区别解析:from_template()vsfrom_messages()langchain为我们提供了运行时添加历史的功能(Memory:上下文管理),核心知识点为:InMemoryChatMessageHistory+RunnableWithMessageHistoryInMemoryChatMessageHistory-对话记忆的基石核心概念:单会话的“记忆容器”LangChain中管理对话上下文的基础类,本质是一个按时间排序的消息数组。它仅负责存储和管理单个用户与AI的交互记录,不直接参与大模型推理,是实现短期记忆、维持对话连续性的底层核心组件。add_user_message()向历史中追加用户发起的消息,明确标记消息来源为人类用户,构建对话的“提问端”。add_ai_message()记录AI模型生成的回复内容,形成对话的“响应端”,让交互过程形成完整的闭环。clear()安全地清空当前会话的所有历史数据,释放内存资源,常用于开启全新对话或重置上下文。messages属性返回包含所有历史消息的完整列表,支持开发者直接读取、遍历或对原始对话数据进行二次加工。常用方法add_message属性通过HumanMessage、AIMessage等message对象添加InMemoryChatMessageHistory基本使用关键API:RunnableWithMessageHistory参数核心参数与配置易错点解析实现上下文对话的基础,重点关注input_messages_key/history_messages_key与Prompt模板变量名的精确对应。runnable[必需]你想要赋予“记忆能力”的原始基础链(Runnable),是整个逻辑的执行主体。get_session_history[必需]一个工厂函数,接收session_id,返回对应会话的BaseChatMessageHistory实例,负责历史数据存取。input_messages_key[必需]调用invoke方法时,入参字典中代表“用户最新提问”的键名。history_messages_key[必需]Prompt模板中用于“注入历史对话记录”的占位符变量名。这是历史与当前会话结合的关键。output_messages_key[可选]若需在最终的输出中包含完整的对话消息列表(而非仅文本),可指定此键名来接收。核心避坑指南:确保input_messages_key/history_messages_key与Prompt模板中定义的变量名100%一致,包括大小写。RunnableWithMessageHistory使用
第一步:定义存储容器新增session_history工厂函数注意:1、这部分代码为成熟解决方案使用时基本一致,无需修改2、session_id为会话id,大家可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 同德县学前教育政府教师招聘笔试真题2025
- 周口西华县公益性岗位招聘笔试真题2025
- 南阳市消防救援支队招聘政府专职消防员笔试真题2025
- 赤峰市红山区公益性岗位人员招聘笔试真题2025
- 2026 年初中秋季开学第一课秋季流感预防校园健康科普课
- 2026年安徽省中考化学试卷(真题+答案)
- 2026 年秋季初一开学第一课适应初中节奏心理调适课件
- 钢铁厂设备维护准则
- 湖南省长沙市望城区某中学2026届高三考前模拟历史试卷(含答案)
- 图形诠释类试题和答案
- 2025年海南三沙市事业单位公开招聘笔试试卷(含完整答案解析)
- 江苏盐城东台市2026年专职网格员招聘考试试卷-含答案解析
- 2026年消化系统内镜报告规范解读手册
- 2026年南昌县医疗健康集团县120急救中心自主招聘16人考试备考题库及答案详解
- 2026年CCAA国家注册审核员考试(有机产品认证基础)复习题及答案
- 2025年国家文物保护工程监理师考试试卷(附答案)
- 2026内蒙古工程建设行业供需现状调研及战略发展规划分析报告
- 2026年人教部编版新教材语文四年上册全册教案设计(含教学计划)
- 药剂师招聘笔试题试题集详解
- YY/T 0474-2025外科植入物聚丙交酯均聚物、共聚物和共混物体外降解试验
- 中国平安IQ测评题库
评论
0/150
提交评论