ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LangChain链和LangGraph图的学习笔记【四】——(1)调用方法:invoke(2)提示语模板:PromptTemplate

LangChain链和LangGraph图的学习笔记【四】——(1)调用方法:invoke(2)提示语模板:PromptTemplate 一、【调用方法invoke】1. 概念与参数在 LangChain Chain是指链式中invoke 是 LangChain 中最基础的同步调用入口是 Runnable 协议的核心同步调用方法。它常见用法既可拼接模板又可调用模型起了“链”的作用。【语法格式】 invoke(input, configNone)‌1 input‌ 的格式由组件决定。2 config‌ 用于高级控制追踪、标签、回调、超时等。3 在构建Chain链时invoke 会自动处理组件间的数据流转如 Prompt 的输出自动传给 Model。4 对于生产级应用且需要异步和流式输出则考虑使用 ainvoke、stream 等方法。【核心参数】参数类型必填默认值详细说明input‌Any是‌(1)输入数据‌。具体格式取决于调用该方法的组件类型。(2)Prompt‌: 通常为字典 dict键对应模板变量。(3)Model‌: 可以是字符串 str、消息列表 List[BaseMessage] 或 PromptValue。(4)Retriever‌: 通常为查询字符串 str。(5)Chain‌: 取决于链条第一个组件的要求。config‌RunnableConfig否None运行时配置对象‌用于控制执行行为。【注意‌】1 input 是位置参数必须提供。2 config 是关键字参数通常用于高级场景。在简单脚本中常省略。2. 【不同组件的 invoke 用法与输入输出规范】【高级用法input 参数详解】LangChain 的核心优势在于统一接口但不同组件对 input 的解释和返回结果不同。1 提示词模板 (PromptTemplate / ChatPromptTemplate)功能‌将动态变量填充到静态模板中生成最终的结构化提示。Input (input)‌‌字典 (dict)‌。键 (Key) 必须与模板中的占位符变量名完全一致。Output‌‌PromptValue 对象‌。ChatPromptTemplate 返回 ChatPromptValue包含消息列表。PromptTemplate 返回 StringPromptValue包含字符串。2 聊天模型 (ChatModel, 如 ChatOpenAI, ChatTongyi)功能‌接收提示并生成 AI 回复。Input (input)‌‌灵活支持多种类型‌。List[BaseMessage]: 标准消息列表推荐。str: 单个字符串会自动包裹为 HumanMessage。PromptValue: 由 Prompt 模板 invoke 生成的对象推荐链式调用时使用。Output‌‌AIMessage 对象‌。主要内容包括 content (文本)、tool_calls (工具调用信息) 等。3 传统语言模型 (LLM, 如 OpenAI legacy)功能‌接收提示并生成纯文本字符串。Input (input)‌字符串 str、消息列表或 PromptValue。Output‌‌字符串 (str)‌。直接返回生成的文本不包含消息对象结构。4 输出解析器 (OutputParser)功能‌将模型的原始输出转换为结构化数据。Input (input)‌‌BaseMessage 或 str‌。通常是前一步 Model 的输出。Output‌‌取决于解析器类型‌。StrOutputParser: 返回 str。JsonOutputParser: 返回 dict 或 list。PydanticOutputParser: 返回 Pydantic 模型实例。5 检索器 (Retriever)功能‌根据查询字符串从向量数据库或其他源检索文档。Input (input)‌‌字符串 (str)‌。即用户的查询问题。Output‌‌List[Document]‌。文档列表每个文档包含 page_content 和 metadata。【高级用法Config 参数详解】config 参数虽然可选但在生产环境中非常重要。它允许你在不修改代码逻辑的情况下改变运行行为。【示例说明】from langchain_core.runnables import RunnableConfig config RunnableConfig( tags[production, math-bot], # 添加标签便于在 LangSmith 中过滤 metadata{user_id: 12345}, # 添加元数据关联用户信息 run_nameMathExplanationChain, # 自定义运行名称 callbacks[my_custom_handler], # 自定义回调处理器 max_concurrency5 # 限制并发数 ) # 在 invoke 中传入 config response chain.invoke({question: 11?}, configconfig)常见应用场景‌追踪与调试 (LangSmith)‌通过 tags 和 run_name 区分不同环境或功能的调用便于后续分析成本和质量。超时控制‌防止某个步骤卡死整个应用。回调监控‌记录 Token 消耗、响应时间等指标。二、【提示语模板PromptTemplat】1. 【安装Python 及调用大模型的 Langchain 包】1安装 Python3.12 或 以上版本2在虚拟环境终端安装包 或 在CMD环境安装包全局可用安装 【angchain-community】包来调用大模型不推荐pip install langchain0.3.30pip install langchain-community0.3.27 #【因包里面有“-”这符号所以包名要加冒号。】pip install dashscope1.27.4 # 【用通义大模型(LLM)时须安装。】pip install langchain0.3.30 pip install langchain-community0.3.27 pip install dashscope1.27.4或 安装 【langchain-openai】包来调用大模型强烈推荐无特别说明后面示例都用此法pip install langchain1.4.0pip install langchain-openai1.6.1pip install langchain1.4.0 pip install langchain-openai1.6.1【强调】无特别说明后面示例代码都是在Windows10\11平台、Python3.12或以上、langchain1.4.0、langchain-openai1.6.1环境中运行。2.【LangChain 关键对象--提示词模板】(1)LangChain 的提示词模板引擎Prompt Template Engine是其核心组件之一主要用于构建和管理与大语言模型LLM交互的提示词Prompt。(2)它的作用是将用户的输入或 [动态数据] 结构化地嵌入到预定义的模板中从而生成适合模型处理的提示词提升模型输出的准确性和一致性。3.【模板的核心价值】(1) 标准化确保提示结构一致性(2) 参数化动态注入变量提高复用性(3) 可维护集中管理提示逻辑。4. 【提示模板分类】(1)PromptTemplate最基础的模板用于将变量填入一个字符串模板中生成给 LLM 的输入。(2)ChatPromptTemplate专为聊天模型设计支持多轮对话结构包含不同角色的消息。# # 组成# # SystemMessagePromptTemplate 设定系统角色如“你是一个翻译助手”# # HumanMessagePromptTemplate 用户输入# # AIMessagePromptTemplate AI 的历史回复用于上下文# # ChatMessagePromptTemplate 通用角色消息可自定义角色名(3)FewShotPromptTemplate: 通过提供少量示例来引导模型行为常用于提升模型在特定任务上的表现。5.【选择模板策略】Agent类型推荐模板关键特性适用场景任务型AgentPromptTemplate结构固定参数明确数据提取、格式转换对话型AgentChatPromptTemplate多轮对话角色扮演客服、角色扮演聊天推理型AgentFewShotPromptTemplate示例驱动类比推理逻辑推理、代码生成三、【分步执行 与 链式执行LCEL】LangChain 的发展史中经历了一次重要的编程范式变革从早期基于 传统 Chain 类如 LLMChain、SimpleSequentialChain、SequentialChain分步调用的命令式写法演进到 2023 年 8 月推出的 LCELLangChain Expression Language 声明式链式写法。1.【 PromptTemplate 模板 与 分步执行】显式调用每个组件自己管理数据流转【PromptTemplate 模板写法1与format方式填充变量 --示例展示1分步执行】示例里面有更详细的讲解和注释且可直接复制运行。# 从 langchain_openai 库导入 ChatOpenAI 类 # 这是 LangChain 对 OpenAI 兼容 API 的封装提供了统一的聊天模型接口 # 它内部仍然依赖 openai 库来发送实际的 HTTP 请求 from langchain_core.prompts import PromptTemplate # 导入 os 模块用于读取系统环境变量 from langchain_openai import ChatOpenAI # 从 python-dotenv 库导入 load_dotenv 函数 # 该函数的作用是将项目根目录下 .env 文件中定义的键值对加载到系统环境变量中 import os from dotenv import load_dotenv # 加载 .env 文件中的环境变量 load_dotenv() # 从环境变量中读取阿里云百炼平台的 API 地址 # os.getenv(ALI_URL) 会查找名为 ALI_URL 的环境变量 # 如果找不到则返回 None。这里对应 .env 文件中配置的 base_url url os.getenv(ALI_URL) # 从环境变量中读取 API 密钥 # 这是调用大模型接口时的身份认证凭证 # 通常以 sk-xxx 格式存在绝不能硬编码在代码中 key os.getenv(API_KEY) # 实例化 ChatOpenAI 对象配置大语言模型的各项参数 llm ChatOpenAI( # model指定要使用的模型名称 # 这里使用的是通义千问的 qwen3.8-max 模型 modelqwen3.8-max, # base_url指定 API 的基础地址 # 因为通义千问兼容 OpenAI 的 API 格式 # 所以可以通过修改 base_url 将请求转发到阿里云的接口 base_urlurl, # api_key传入 API 密钥用于身份认证 api_keykey, # temperature控制模型输出的随机性/创造性 # 取值范围通常为 0~2值越大输出越随机多样值越小输出越确定保守 # 设为 1 表示使用默认的随机程度 temperature1, # streaming是否开启流式输出 # 设为 True 后模型不会等全部生成完毕再返回 # 而是每生成一小段文本就立即推送一个 chunk # 这是实现打字机效果逐字显示的前提条件 streamingTrue, # extra_body向 API 请求体中注入额外的自定义参数 # 这些参数会被直接附加到发送给模型的 HTTP 请求体中 extra_body{ # thinking开启模型的思考能力思维链推理 # {type: enabled} 表示启用深度思考模式 # 模型在生成最终回答前会先进行内部推理 thinking: {type: enabled}, # search开启联网搜索能力 # {type: enabled} 表示允许模型在回答时调用搜索引擎 # 获取最新的实时信息来辅助回答 search: {type: enabled}, }, ) # # 定义模板 template 你是一个{role},请用{style}风格回答问题:{question} # # 创建对象构造模板时直接把参数写好。【input_variables 不是强约束参数少写不影响后面。主要为了方便维护要保持一致。】 prompt_template PromptTemplate(templatetemplate, input_variables[role, style, question]) # # 创建对象构造模板时用【from_template方法】也可实现与上述一模一样的功能 # prompt_template PromptTemplate.from_template(template) # # 填充变量【format】方式传入类型为字符型的函数参数参数名称与上面自定义动态变量名称一致 filled_format prompt_template.format(role金融分析师, style通俗易懂, question今天A股市场的热点是什么) print(format填充的效果, filled_format, \n, format填充的类型, type(filled_format)) # # 调用模型 response llm.invoke(filled_format) # 传递字符串而非对象 print(【format】方式填充的输出, \n, response.content)【PromptTemplate 模板写法2与invoke方式填充变量--示例展示2分步执行】示例里面有更详细的讲解和注释且可直接复制运行。from langchain_openai import ChatOpenAI from langchain_core.prompts import PromptTemplate import os from dotenv import load_dotenv # 加载 .env 文件中的环境变量 load_dotenv() # 从环境变量中读取阿里云百炼平台的 API 地址 # os.getenv(ALI_URL) 会查找名为 ALI_URL 的环境变量 # 如果找不到则返回 None。这里对应 .env 文件中配置的 base_url url os.getenv(ALI_URL) # 从环境变量中读取 API 密钥 # 这是调用大模型接口时的身份认证凭证 # 通常以 sk-xxx 格式存在绝不能硬编码在代码中 key os.getenv(API_KEY) # 实例化 ChatOpenAI 对象配置大语言模型的各项参数 llm ChatOpenAI( # model指定要使用的模型名称 # 这里使用的是通义千问的 qwen3.8-max 模型 modelqwen3.8-max, # base_url指定 API 的基础地址 # 因为通义千问兼容 OpenAI 的 API 格式 # 所以可以通过修改 base_url 将请求转发到阿里云的接口 base_urlurl, # api_key传入 API 密钥用于身份认证 api_keykey, # temperature控制模型输出的随机性/创造性 # 取值范围通常为 0~2值越大输出越随机多样值越小输出越确定保守 # 设为 1 表示使用默认的随机程度 temperature1, # streaming是否开启流式输出 # 设为 True 后模型不会等全部生成完毕再返回 # 而是每生成一小段文本就立即推送一个 chunk # 这是实现打字机效果逐字显示的前提条件 streamingTrue, # extra_body向 API 请求体中注入额外的自定义参数 # 这些参数会被直接附加到发送给模型的 HTTP 请求体中 extra_body{ # thinking开启模型的思考能力思维链推理 # {type: enabled} 表示启用深度思考模式 # 模型在生成最终回答前会先进行内部推理 thinking: {type: enabled}, # search开启联网搜索能力 # {type: enabled} 表示允许模型在回答时调用搜索引擎 # 获取最新的实时信息来辅助回答 search: {type: enabled}, }, ) # # 定义模板 template 你是一个{role},请用{style}风格回答问题:{question} # # 创建对象构造模板时直接把参数写好。【input_variables 不是强约束参数少写不影响后面。主要为了方便维护要保持一致。】 prompt_template PromptTemplate(templatetemplate, input_variables[role, style, question]) # # 填充变量【invoke】方式传类型为字典型字典中的键key为自定义动态变量名称一致 filled_invoke prompt_template.invoke({role: 金融分析师, style: 通俗易懂, question: 今天A股市场的热点是什么}) print(invoke填充的效果, filled_invoke, \n, invoke填充的类型, type(filled_invoke)) # # 调用模型 response llm.invoke(filled_invoke) # 传递字符串而非对象 print(【invoke】方式填充的输出, \n, response.content)【PromptTemplate 模板写法3--示例展示3分步执行】示例里面有更详细的讲解和注释且可直接复制运行。# 从 langchain_openai 库导入 ChatOpenAI 类 # 这是 LangChain 对 OpenAI 兼容 API 的封装提供了统一的聊天模型接口 # 它内部仍然依赖 openai 库来发送实际的 HTTP 请求 from langchain_core.prompts import PromptTemplate # 导入 os 模块用于读取系统环境变量 from langchain_openai import ChatOpenAI # 从 python-dotenv 库导入 load_dotenv 函数 # 该函数的作用是将项目根目录下 .env 文件中定义的键值对加载到系统环境变量中 import os from dotenv import load_dotenv # 执行加载操作将 .env 文件中的变量如 API_KEY注入到当前进程的环境变量中 # 如果 .env 文件不存在或没有对应变量后续 os.getenv() 将返回 None load_dotenv() # 从环境变量中安全地获取名为 API_KEY 的值 # 这种写法避免了在代码中硬编码密钥是生产环境推荐的安全实践 key os.getenv(API_KEY) # 定义阿里云百炼平台提供的 OpenAI 兼容接口地址 # 通义千问系列模型通过这个端点对外提供服务 url os.getenv(ALI_URL) # 实例化 ChatOpenAI 对象配置大语言模型的各项参数 llm ChatOpenAI( # model指定要使用的模型名称 # 这里使用的是通义千问的 qwen3.8-max 模型 modelqwen3.8-max, # base_url指定 API 的基础地址 # 因为通义千问兼容 OpenAI 的 API 格式 # 所以可以通过修改 base_url 将请求转发到阿里云的接口 base_urlurl, # api_key传入 API 密钥用于身份认证 api_keykey, # temperature控制模型输出的随机性/创造性 # 取值范围通常为 0~2值越大输出越随机多样值越小输出越确定保守 # 设为 1 表示使用默认的随机程度 temperature1, # streaming是否开启流式输出 # 设为 True 后模型不会等全部生成完毕再返回 # 而是每生成一小段文本就立即推送一个 chunk # 这是实现打字机效果逐字显示的前提条件 streamingTrue, # extra_body向 API 请求体中注入额外的自定义参数 # 这些参数会被直接附加到发送给模型的 HTTP 请求体中 extra_body{ # thinking开启模型的思考能力思维链推理 # {type: enabled} 表示启用深度思考模式 # 模型在生成最终回答前会先进行内部推理 thinking: {type: enabled}, # search开启联网搜索能力 # {type: enabled} 表示允许模型在回答时调用搜索引擎 # 获取最新的实时信息来辅助回答 search: {type: enabled}, }, ) # # 创建对象构造模板时直接把参数写好。 prompt_template PromptTemplate( template 你是一个{role},请用{style}风格回答问题:{question}, input_variables [role, style, question], partial_variables {role: 金融分析师, style: 通俗易懂} # 字典类型用于预设模板中部分 变量的固定值。这些变量在后续调用时 无需重复传入 ) # # 创建对象构造模板时用【partial方法】也可实现与上述一模一样的功能 # prompt_template PromptTemplate( # template 你是一个{role},请用{style}风格回答问题:{question}, # input_variables [role, style, question], # ) # prompt PromptTemplate.partial(role 金融分析师, style 通俗易懂) # # 填充变量【format】方式传入类型为字符型的函数参数参数名称与上面自定义动态变量名称一致 filled_format prompt_template.format(question今天A股市场的热点是什么) print(format填充的效果, filled_format, \n, format填充的类型, type(filled_format)) # # 调用模型 response llm.invoke(filled_format) # 传递字符串而非对象 print(【format】方式填充的输出, \n, response.content)【PromptTemplate 模板 与 分步执行--示例展示3】示例里面有更详细的讲解和注释且可直接复制运行。# 从 langchain_openai 库导入 ChatOpenAI 类 # 这是 LangChain 对 OpenAI 兼容 API 的封装提供了统一的聊天模型接口 # 它内部仍然依赖 openai 库来发送实际的 HTTP 请求 from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI # 导入 os 模块用于读取系统环境变量 import re # 从 python-dotenv 库导入 load_dotenv 函数 # 该函数的作用是将项目根目录下 .env 文件中定义的键值对加载到系统环境变量中 import os from dotenv import load_dotenv # 执行加载操作将 .env 文件中的变量如 API_KEY注入到当前进程的环境变量中 # 如果 .env 文件不存在或没有对应变量后续 os.getenv() 将返回 None load_dotenv() # 从环境变量中安全地获取名为 API_KEY 的值 # 这种写法避免了在代码中硬编码密钥是生产环境推荐的安全实践 key os.getenv(API_KEY) # 定义阿里云百炼平台提供的 OpenAI 兼容接口地址 # 通义千问系列模型通过这个端点对外提供服务 url os.getenv(ALI_URL) # 实例化 ChatOpenAI 对象配置大语言模型的各项参数 llm ChatOpenAI( # model指定要使用的模型名称 # 这里使用的是通义千问的 qwen3.8-max 模型 modelqwen3.8-max, # base_url指定 API 的基础地址 # 因为通义千问兼容 OpenAI 的 API 格式 # 所以可以通过修改 base_url 将请求转发到阿里云的接口 base_urlurl, # api_key传入 API 密钥用于身份认证 api_keykey, # temperature控制模型输出的随机性/创造性 # 取值范围通常为 0~2值越大输出越随机多样值越小输出越确定保守 # 设为 1 表示使用默认的随机程度 temperature1, # streaming是否开启流式输出 # 设为 True 后模型不会等全部生成完毕再返回 # 而是每生成一小段文本就立即推送一个 chunk # 这是实现打字机效果逐字显示的前提条件 streamingTrue, # extra_body向 API 请求体中注入额外的自定义参数 # 这些参数会被直接附加到发送给模型的 HTTP 请求体中 extra_body{ # thinking开启模型的思考能力思维链推理 # {type: enabled} 表示启用深度思考模式 # 模型在生成最终回答前会先进行内部推理 thinking: {type: enabled}, # search开启联网搜索能力 # {type: enabled} 表示允许模型在回答时调用搜索引擎 # 获取最新的实时信息来辅助回答 search: {type: enabled}, }, ) # # 定义模板 template 你是一个{role},请分析在A股上市的{share}最新{question},要求从以下维度进行分析 1.研发投入与创新(占25%权重):研发费用占比、专利数、新产品收入占比; 2.未来增长潜力(占8%权重):产能扩张、新市场布局、战略投资、数字化转型; 3.财务表现(占15%权重):营收、净利润、ROE、毛利率、净利率; 4.负债与偿债(占5%权重):资产负债率、流动比率、利息保障倍数; 5.行业地位与竞争力(占15%权重):市场份额、客户集中度、技术壁垒、品牌影响力; 6.管理与治理(占10%权重):管理层稳定性、股权激励、董事会独立性; 7.行业前景与政策(占10%权重):行业增长率、政策支持/限制、宏观环境; 8.盈利质量(占5%权重):净利润现金含量、非经常性损益占比; 9.国际化能力(占5%权重):海外营收、国际化程度; 10.其它(占2%权重):风险因素、ESG表现; 11.以上每项都是100分制; 12.总综合评分计算方法总综合评分研发投入与创新得分*0.25 未来增长潜力得分*0.08 财务表现得分*0.15 负债与偿债得分*0.05 行业地位与竞争力得分*0.15 管理与治理得分*0.1 行业前景与政策*0.1 盈利质量得分*0.05 国际化能力得分*0.05 其它得分*0.02; 13.把总综合用评分用【综合评分XXX分】的方式输出。 # # 创建模板对象 prompt_template PromptTemplate.from_template(template) # # 填充变量【invoke】方式 filled_prompt1 prompt_template.invoke({role: 资深证券分析师, share: 股票名称, question: 财报}) # # 调用模型 response1 llm.invoke(filled_prompt1) # 传递字符串而非对象 text response1.content print(text) pattern r综合评分(\d\.?\d*)分 # 匹配整数或小数 matches re.findall(pattern, text) print(匹配到的数字, matches)2.【 PromptTemplate 模板 与 链式执行LCEL】LCEL 是一种声明式语法其设计基石是统一的 Runnable 接口。LangChain 中所有组件——提示模板、模型、输出解析器、检索器、工具、自定义函数——都实现了 Runnable 接口因而都拥有统一的调用方法。组件之间用 管道操作符 |借鉴 Unix 管道思想串联前一个组件的输出自动作为后一个组件的输入。【LCEL 的优势】1语法简洁一行 prompt | llm | parser 即可表达完整数据流取代了大段类实例化代码。2原生流式输出链可以边计算边把 token 推给下游chain.stream() 开箱即用。3原生异步支持ainvoke/astream/abatch 直接可用适合高并发。4自动并行执行RunnableParallel 让多分支任务并行运行显著降低延迟。5统一接口、灵活路由所有组件调用方式一致支持条件分支、动态逻辑、容错降级。6免费获得生产级特性自动接入 LangSmith 追踪调试回调系统Callbacks广播每一步执行便于日志与 token 统计自动重试、with_fallbacks 降级部署为 APILangServe时无需改动代码。可视化chain.get_graph().print_ascii() 可图形化打印链结构。【LCEL 的劣势】1复杂控制流表达吃力LCEL 适合线性/分支/并行的 DAG 式流程但面对循环、回溯、重试跳出、人工审批、多 Agent 协作等复杂状态机式控制流时仍力不从心——这正是官方推出 LangGraphGraph是指图 的原因2调试细节传统的 set_verbose(True) 在 LCEL 中不再如预期工作需改用回调处理器如 ConsoleCallbackHandler查看中间步骤。# 最基础的 LCEL 链示例Prompt → Model → Parser# 对应 LCEL 三个核心组件提示模板 → 调用大模型 → 格式化输出# 用 | 管道符将三个组件串联成一条完整的处理流水线示例里面有更详细的讲解和注释且可直接复制运行。# ---------- 第一步导入所需的库 ---------- # 从 langchain_openai 库导入 ChatOpenAI 类 from langchain_openai import ChatOpenAI # # 新的导入方式 # from langchain_alibaba import ChatTongyi # 从 langchain_core 导入聊天提示模板类 # ChatPromptTemplate 用于定义结构化的聊天提示 # 支持 system / human / ai 等不同角色的消息模板 from langchain_core.prompts import PromptTemplate # 从 langchain_core 导入字符串输出解析器 # StrOutputParser 的作用是将模型返回的原始消息对象AIMessage # 提取为纯字符串方便后续直接使用 from langchain_core.output_parsers import StrOutputParser # 导入 os 模块用于读取系统环境变量 import os # 导入 python-dotenv 库的 load_dotenv 函数 # 它的作用是加载 .env 文件中的键值对到系统环境变量中 # 避免在代码中硬编码 API 密钥等敏感信息 from dotenv import load_dotenv # ---------- 第二步加载环境变量获取 API 密钥 ---------- # 执行加载操作将 .env 文件中的变量如 API_KEY注入到当前进程的环境变量中 # 如果 .env 文件不存在或没有对应变量后续 os.getenv() 将返回 None load_dotenv() # 从环境变量中安全地获取名为 API_KEY 的值 # 这种写法避免了在代码中硬编码密钥是生产环境推荐的安全实践 key os.getenv(API_KEY) # 定义阿里云百炼平台提供的 OpenAI 兼容接口地址 # 通义千问系列模型通过这个端点对外提供服务 url os.getenv(ALI_URL) # ---------- 第三步设置模型 ---------- # 实例化 ChatOpenAI 对象配置大语言模型的各项参数 llm ChatOpenAI( # model指定要使用的模型名称 # 这里使用的是通义千问的 qwen3.8-max 模型 modelqwen3.8-max, # base_url指定 API 的基础地址 # 因为通义千问兼容 OpenAI 的 API 格式 # 所以可以通过修改 base_url 将请求转发到阿里云的接口 base_urlurl, # api_key传入 API 密钥用于身份认证 api_keykey, # temperature控制模型输出的随机性/创造性 # 取值范围通常为 0~2值越大输出越随机多样值越小输出越确定保守 # 设为 1 表示使用默认的随机程度 temperature1, # streaming是否开启流式输出 # 设为 True 后模型不会等全部生成完毕再返回 # 而是每生成一小段文本就立即推送一个 chunk # 这是实现打字机效果逐字显示的前提条件 streamingTrue, # extra_body向 API 请求体中注入额外的自定义参数 # 这些参数会被直接附加到发送给模型的 HTTP 请求体中 extra_body{ # thinking开启模型的思考能力思维链推理 # {type: enabled} 表示启用深度思考模式 # 模型在生成最终回答前会先进行内部推理 thinking: {type: enabled}, # search开启联网搜索能力 # {type: enabled} 表示允许模型在回答时调用搜索引擎 # 获取最新的实时信息来辅助回答 search: {type: enabled}, }, ) # ---------- 第四步定义链的三个核心组件 ---------- # 【组件1】定义提示模板Prompt # from_template 方法接收一个字符串模板其中 {user_input} 是占位符变量 # 运行时invoke 传入的字典 {user_input: 人工智能} 会自动替换该占位符 # 最终生成类似 用一句话介绍人工智能 的完整提示发送给模型 prompt PromptTemplate.from_template(用一句话介绍{user_input}) # 填充变量【invoke】方式 # 输入 {user_input: 人工智能}将占位符替换生成完整提示 filled_prompt prompt.invoke({user_input: 人工智能}) # 【组件2】定义输出解析器Parser # StrOutputParser 会将模型返回的 AIMessage 对象中的 content 字段提取出来 # 例如模型返回 AIMessage(content人工智能是...) → 解析后得到纯字符串 人工智能是... parser StrOutputParser() # ---------- 第五步用管道符 | 将三个组件串联成链 ---------- # | 是 LCEL 的核心语法等价于把左边的输出作为右边的输入 # 执行流程 # → prompt 生成完整提示 # → llm 接收提示调用通义千问 API 进行推理 # → parser 提取模型返回的纯文本内容 # → 最终返回一个字符串 chain prompt | llm | parser # ---------- 第六步调用链并输出结果 ---------- # invoke() 是 LCEL 链的统一调用方法同步、单条 result chain.invoke(filled_prompt) # 打印最终结果此时 result 已经是纯字符串 print(result)
返回列表