第二章 LangChain核心组件实操
LangChain 做了统一抽象接口不管 OpenAI、DeepSeek、Hugging Face 模型调用写法基本一样屏蔽底层接口差异开发者只专注业务功能。在LangChain中大模型主要分为两类① LLM 文本生成模型只传一段文字、返回一段文字像 Llama、通义千问开源版适合翻译、摘要、单次短文生成。② ChatModel 对话模型传入完整多轮对话记录用户 助手历史消息返回单条回复像 GPT4o、DeepSeek 对话版适合聊天机器人能记住上下文。模型调用ChatOpenAI# 导入必要的模块from langchain_openaiimportChatOpenAI# OpenAI对话模型的统一接口from dotenvimportload_dotenvimportos# 加载API密钥和上一章一样从.env文件读取load_dotenv()API_KEYos.getenv(API_KEY)BASE_URLos.getenv(BASE_URL)# 从环境变量读取未配置时默认为None使用OpenAI官方地址ifnot API_KEY: raise ValueError(未检测到 API_KEY请检查 .env 文件是否配置正确)# 1. 初始化对话模型# 不管是哪个厂商的ChatModel初始化参数都类似model、temperature等chat_modelChatOpenAI(api_keyAPI_KEY,base_urlBASE_URL,modeldeepseek-chat,# 选择对话模型temperature0.3,# 随机性0-1越小越严谨越大越有创造力max_tokens200# 最大生成 tokens 数避免生成过长内容)# 2. 构造对话消息# ChatModel需要接收的是“消息列表”每个消息有角色user/assistant/system和内容messages[# system消息给助手设定身份和行为准则会影响后续所有回复{role:system,content:你是一个耐心的AI学习助手回复简洁易懂适合高校学生理解。},# user消息用户的问题{role:user,content:请用3句话解释什么是LangChain}]# 3. 调用模型生成结果# 统一调用方法invoke()传入消息列表resultchat_model.invoke(messages)# 4. 输出结果# 结果是一个ChatMessage对象content属性是回复内容print(ChatModel回复)print(result.content)备注模型有多个角色system/user/assistant 不只是标记是谁说话本质是给模型施加不同层级的约束。优先级system user assistant三个角色分别是什么约束① system 系统提示最高优先级全局约束对话开篇一次性设定全局规则角色身份、回答风格、输出限制、行为边界。全程生效所有问答都必须遵守用户无法覆盖这条规则用户看不到这条消息。类比课前统一教学准则。② user 用户消息单次任务输入每轮用户新提问 / 指令推进对话流程必须服从 system 定下的全局规则不能更改底层约束。类比学生当场提出的新问题。③ assistant 助手消息上下文记忆载体模型不会自动记住历史回复必须把上一轮模型输出以 assistant 格式塞进消息列表模型才能连贯理解上下文。作用是留存对话历史保证多轮对话不脱节。类比刚讲完的板书不记录就会失忆。from langchain_openaiimportChatOpenAI from dotenvimportload_dotenvimportos load_dotenv()API_KEYos.getenv(API_KEY)BASE_URLos.getenv(BASE_URL)ifnot API_KEY: raise ValueError(未检测到 API_KEY请检查 .env 文件是否配置正确)chat_modelChatOpenAI(api_keyAPI_KEY,base_urlBASE_URL,modeldeepseek-chat,temperature0.3,max_tokens200)# 初始化对话历史包含 system 设定history[{role:system,content:你是一个耐心的AI学习助手回复简洁易懂适合高校学生理解。}]# 第一轮对话history.append({role:user,content:请用3句话解释什么是LangChain})resultchat_model.invoke(history)print(【第一轮回复】)print(result.content)# 将模型的回复添加到历史中assistant 消息history.append({role:assistant,content:result.content})# 第二轮对话# 追问模型需要上下文才能理解它history.append({role:user,content:它的核心组件有哪些})resultchat_model.invoke(history)print(\n【第二轮回复】)print(result.content)# 继续记录history.append({role:assistant,content:result.content})# 第三轮对话history.append({role:user,content:给我一个简单的使用场景})resultchat_model.invoke(history)print(\n【第三轮回复】)print(result.content)提示词模板PromptTemplatePromptTemplate 相当于提示词的 “填空模板”固定话术写死变化内容传参填入减少重复编码。拆分固定文本和动态可变参数模板一次定义、反复复用提示词统一规范。formatted_promptprompt_template.format(user_role程序员,subjectAI Agent)resultchat_model.invoke([{role:user,content:formatted_prompt}])print(给程序员的AI Agent学习建议)print(result.content)少样本提示词模板案例数据基建方向# 导入必要的模板类from langchain_core.promptsimportFewShotPromptTemplate, PromptTemplate from langchain_openaiimportChatOpenAI from dotenvimportload_dotenvimportos load_dotenv()API_KEYos.getenv(API_KEY)BASE_URLos.getenv(BASE_URL)ifnot API_KEY: raise ValueError(未检测到 API_KEY请检查 .env 文件是否配置正确)chat_modelChatOpenAI(api_keyAPI_KEY,base_urlBASE_URL,modeldeepseek-chat,temperature0.3,max_tokens300)# 1. 定义少样本示例数据基建相关两大模块examples[{data_infra_module:数据仓库搭建,build_plan:核心目标统一企业数据口径支撑报表与离线分析搭建步骤1. 梳理业务分层ODS/DWD/DWS 2. 选型存储引擎与调度工具 3. 制定数据血缘与质量校验规则注意事项分层解耦提前预留分区扩容方案。},{data_infra_module:实时数据管道开发,build_plan:核心目标低延迟同步业务数据流支持实时指标看板搭建步骤1. 接入消息中间件Kafka 2. 使用Flink做流清洗与聚合 3. 写入实时数仓/Redis注意事项做好消息重试、幂等处理避免数据重复。}]# 2. 定义示例模板example_template 数据基建模块{data_infra_module}建设方案{build_plan} example_promptPromptTemplate(input_variables[data_infra_module,build_plan],templateexample_template)# 3. 组装少样本提示模板few_shot_promptFewShotPromptTemplate(examplesexamples,example_promptexample_prompt,suffix数据基建模块{new_data_module}\n建设方案,input_variables[new_data_module])# 4. 传入目标模块数据底座平台OpenClawformatted_promptfew_shot_prompt.format(new_data_moduleOpenClaw统一数据底座平台)print(少样本完整提示词)print(formatted_prompt)# 5. 调用模型生成标准化建设方案resultchat_model.invoke([{role:user,content:formatted_prompt}])print(\n生成的数据底座建设方案)print(result.content)