Langchain01_框架之模型的创建与调用
模型创建3种方式1.使用特定的Model Class最直接但不好用LangChain为一些大模型供应商提供了专门的Model类导入对应的具体类如ChatOpenAI、ChatAnthropic、ChatDeepSeek、ChatOllama、ChatHunyuan、ChatTongyi、ChatZhipuAI并进行实例化。官网链接chat-models | langchain_community | LangChain Reference用哪个大模型提供商就调哪个Model类但是支持的Model类有限有的提供商不支持比如硅基流动、CloseAI这两个平台就没有对应的Model类。示例1调用DeepSeek官网的DeepSeek模型import os from dotenv import load_dotenv from langchain_deepseek import ChatDeepSeek # 1、读取.env配置文件中的信息。相关的环境变量以.env文件中的优先 load_dotenv(overrideTrue) # 当 .env 文件中的变量与系统现有环境变量重合时启动覆盖 DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY) DEEPSEEK_BASE_URL os.getenv(DEEPSEEK_BASE_URL) # 2、模型的初始化 llm_deepseek ChatDeepSeek( modeldeepseek-v4-flash, api_keyDEEPSEEK_API_KEY, # 若未传入系统将自动从环境变量 DEEPSEEK_API_KEY 中读取 api_baseDEEPSEEK_BASE_URL, # 若未传入系统将自动从环境变量 DEEPSEEK_BASE_URL 中读取 ) # 3、模型的调用 response llm_deepseek.invoke(请用一句话介绍你自己) print(response)2. langchain_openai.ChatOpenAI 通用一方面LangChain没有为所有大模型厂商提供专用接口见Langchain大模型集成列表。如果选用的平台没有专用接口可以通过兼容接口调用。另一方面专用接口的对接方式五花八门如腾讯混元的ChatHunyuan需要单独的 APP_ID SecretId SecretKey 配置繁琐用户不友好。为此大多数API平台都支持OpenAI API接口规范所以基本都可以通过 ChatOpenAI 集成。注意具体api_key、base_url、model还是要设置具体提供商的具体请求参数见对应提供商官网示例2使用ChatOpenAI类调硅基流动平台的模型import os from langchain_openai import ChatOpenAI from dotenv import load_dotenv # 1、读取.env配置文件中的信息。相关的环境变量以.env文件中的优先 load_dotenv(overrideTrue) # 硅基流动的 API Key通常在 .env 文件中配置为 SILICONFLOW_API_KEY SILICONFLOW_API_KEY os.getenv(SILICONFLOW_API_KEY) SILICONFLOW_BASE_URL os.getenv(SILICONFLOW_BASE_URL) # 2、模型的初始化 llm_silicon ChatOpenAI( # 指定硅基流动的官方 API 转发地址 base_urlSILICONFLOW_BASE_URL, # 传入硅基流动的 API Key api_keySILICONFLOW_API_KEY, # 填入硅基流动支持的模型名称例如 DeepSeek-V3 或 DeepSeek-R1 modeldeepseek-ai/DeepSeek-V4-Flash, ) # 3、模型的调用 response llm_silicon.invoke(请用一句话介绍你自己) print(response.content) # 使用 .content 只打印文本内容3.init_chat_model() 统一封装基本语法from langchain.chat_models import init_chat_model model init_chat_model( provider:model_name, # 提供商:模型名称 api_keyyour-api-key, # API 密钥可选可从环境变量读取 temperature0.7, # 温度参数可选 max_tokens1000, # 最大 token 数可选 **kwargs # 其他模型特定参数 )问题1model_provider支持哪些providermodel_provider 表示模型的提供者支持的providers有anthropic, anthropic_bedrock,azure_ai, azure_openai, bedrockbedrock_converse, cohere,deepseek, fireworks,google_anthropic_vertex, google_genai, google_vertexaigrog, huggingface, ibm, mistralai, nvidia,ollama,openai,openrouter, perplexity, together, upstage, xai。如果 model_provideropenai 会自动加载 langchain-openai 的依赖包底层调用的是ChatOpenAI 类。如果 model_providerdeepseek 会自动加载 langchain-deepseek 的依赖包底层调用的是 ChatDeepSeek 类。像阿里的 dashscope 尚未被LangChain官方纳入模型的统一注册体系暂时不知道dashscope的提供者是谁。此时可以将model_provider设置为openai底层将会用openai的规范处理请求这就要求我们调用的模型服务是OpenAI Compatible的。官方文档Chat model integrations - Docs by LangChain问题2如果在model参数中没有指明模型提供者必须在model_provider中指明可以在model参数中通过前缀指定模型供应商和模型名称之间用 冒号分割 等价于通过model_provider参数指定供应商。如果两个位置都没有指明供应商LangChain底层会按照内置规则自动推断。但是并非所有的模型都支持自动推断如model名称 qwen-plus 不支持自动推断没有指明供应商会报错。示例3使用init_chat_model()去调用DS平台的模型from langchain.chat_models import init_chat_model import os from dotenv import load_dotenv # 加载配置文件 load_dotenv(overrideTrue) DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY) DEEPSEEK_BASE_URL os.getenv(DEEPSEEK_BASE_URL) # 获取大模型 model init_chat_model( # modeldeepseek-v4-flash, # model_providerdeepseek, # 或者 modeldeepseek:deepseek-v4-flash, api_keyDEEPSEEK_API_KEY, base_urlDEEPSEEK_BASE_URL, ) print(model.invoke(一句话介绍下你自己))示例4使用init_chat_model()去调用阿里云百炼平台的模型from langchain.chat_models import init_chat_model import os from dotenv import load_dotenv # 加载配置文件 load_dotenv(overrideTrue) DASHSCOPE_API_KEY os.getenv(DASHSCOPE_API_KEY) DASHSCOPE_BASE_URL os.getenv(DASHSCOPE_BASE_URL) # 获取大模型 model init_chat_model( # modeltongyi:deepseek-v4-flash, modelopenai:deepseek-v4-flash, # 提供者换成openai就行了兼用 api_keyDASHSCOPE_API_KEY, base_urlDASHSCOPE_BASE_URL, ) print(model.invoke(一句话介绍下你自己))问题init_chat_model 和直接使用 ChatTongyi、ChatOpenAI、ChatDeepSeek有什么区别回答init_chat_model 是 LangChain 1.0 的统一接口优势包括统一接口无需记住每个提供商的不同初始化方式以一致的方式初始化易于切换简化了智能体系统中模型切换策略只需修改模型字符串简洁明了更简洁的语法减少样板代码自动适配内部根据模型标识自动选择对应的驱动类(ChatOpenAI、ChatDeepSeek)图示在LangChain中Model Class和init_chat_model初始化模型共同的参数及解释常用参数API文档https://docs.langchain.org.cn/oss/python/langchain/models#parameters模型调用3种同步调用3种异步调用方式invoke() 阻塞式一次性返回完整结果问答、批处理任务、无需实时反馈的场景。ainvoke() 非阻塞式提高系统吞吐量高并发Web应用、IO密集型任务。stream() 流式输出实时返回每个token聊天机器人、长文本生成、需要提升用户体验的交互应用。asteam() 非阻塞式提高系统吞吐量高并发Web应用、IO密集型任务。batch() 批量处理多个输入高并发场景需要同时处理大量请求。abatch() 非阻塞式提高系统吞吐量高并发Web应用、IO密集型任务。1、invoke()invoke 方法的作用就是1. 接收你的输入问题、指令、对话历史等2. 发送给 LLM 模型如 GPT-4、Llama、Claude 等3. 返回模型的响应文本回复 元数据信息输入参数详解输入参数支持三种形式的输入 文本输入 、 字典列表 、 消息对象列表 。其中字典列表(推荐最灵活)创建字典列表组成消息。一条消息通常包含 role角色 、 content内容 等信息。消息对象列表使用内置的消息类如 SystemMessage, HumanMessage, AIMessage将消息对象列表输入模型。返回值详解invoke 返回一个 AIMessage对象 源码如下def invoke( self, input: LanguageModelInput, config: RunnableConfig | None None, *, stop: list[str] | None None, **kwargs: Any, ) - AIMessage:AIMessage中包含丰富的信息为例说明如下1. 核心内容与基本信息content : 模型生成的文本回答。这是你最关心的核心输出。id : 本次运行在 LangChain 内部生成的唯一标识符Run ID。additional_kwargs : 包含特定供应商的额外参数。refusal : 如果模型拒绝回答涉及敏感政策此处会显示拒绝原因。2. 消耗统计 (Token Usage)这部分决定了你这一行输入操作花了多少钱prompt_tokens / input_tokens : 输入 Token 数。你发送给模型的问题长度。completion_tokens / output_tokens : 输出 Token 数。模型回答生成的长度。total_tokens : 总消耗。 两者之和。reasoning_tokens : 推理 Token 数。 如果是 O1/O3 等推理模型这里会显示它在“思考”时消耗的 Token。cached_tokens : 缓存命中的 Token 数。重复提问时如果命中了模型商的缓存这部分费用通常更低。3. 响应元数据 (Response Metadata)这部分是 API 返回的原始详细信息model_name : 实际调用的模型具体版本如 gpt-5.4-mini 。model_provider : 模型供应商如 openai 。finish_reason : 生成停止的原因。stop : 正常回答结束。length : 达到最大 Token 限制被截断。system_fingerprint : 系统指纹用于追踪模型后端的配置变更。4. 性能与延迟 (Latency Checkpoint)这是针对 API 响应速度的深度拆解单位通常为毫秒 mstotal_duration_ms : 总耗时。从请求发出到完全收到的总时间259ms。user_visible_ttft_ms : 首字到达时间。用户看到第一个字跳出来等待的时间194ms这是体感快慢的关键。engine_ttft_ms : 引擎层面的首字到达时间36ms。engine_ttlt_ms : 引擎生成最后一个字的时间100ms。pre_inference_ms : 推理前处理耗时。包括安全审核、Token 化等预处理86ms。service_tbt_ms : Time Between Tokens。字与字之间生成的间隔时间决定了打字机效果是否丝滑。5. 工具调用信息tool_calls : 结构化工具调用列表。如果模型决定调用某个 Python 函数或搜索工具参数会在这里。invalid_tool_calls : 格式错误的工具调用尝试。2、stream()invoke 和 stream 有什么区别invoke() 同步调用在模型输出完成后一次性获取响应对于输出文本很长的场景用户体验不好。stream() 流式调用实时返回响应片段。调用后返回一个 迭代器(iterator) 可以通过循环来实时处理每一个新生成的chunk内容块。注意流式输出依赖于模型供应商对于流式输出的支持3、batch()batch() 方法允许你一次性 发送一组请求 含多条独立请求模型会在后台 并行处理 然后返回所有结果的列表 。与逐个顺序调用invoke相比能大幅 减少网络往返开销 和 等待时间 显著提升性能、降低成本。默认一次性接收所有的响应不按照顺序batch_as_completed()允许应用在收到第一个结果后立即返回响应而不会等待批次内所有任务完成才响应。即batch_as_completed() 每个请求完成后立即 yield 结果 结果可能乱序 。但是每个返回的响应都被放在一个 元组 中元组的第一个元素是原始输入的 index 索引可根据索引重新排序。异步调用ainvoke()、astream()、abatch()异步调用复习见Python异步编程入门案例-CSDN博客在LangChain框架中异步方法ainvoke、astream、abatch与它们的同步版本invoke、stream、batch相比具备如下特点避免阻塞主线程 同步调用会阻塞程序执行而异步方法让应用程序在等待API响应时保持响应性。优化资源利用 异步操作可以更高效地利用系统资源减少空闲等待时间扩展内容1、模型配置信息profileLangChain1.1及更高版本可以通过profile属性查看模型的配置信息。这是LangChain针对模型的能力画像但是否存在取决于LangChain在集成模型厂商的服务时是否声明了能力画像。2、模型初始化参数官方文档和源码注释没有给出完整的参数列表。以ChatDeepSeek类为例其参数可以由 自身定义 或 从父类BaseChatModel继承 。直接查看源码也很难拼凑完整列表。这里通过查ChatDeepSeek的类属性model_fields来获得完整参数列表。from langchain_deepseek import ChatDeepSeek print(ChatDeepSeek.model_fields.keys())3、模型类的参数构成以ChatDeepSeek为例完整参数列表由如下几部分构成1、客户端与连接参数 (Networking)这类参数决定了代码“怎么连到服务端”而不是“让模型怎么生成”。2、模型推理参数 (Model Inference)这些是直接传递给 DeepSeek 模型 API 的参数决定了 生成内容 的质量和风格。3、LangChain 框架通用参数由 LangChain 的 BaseChatModel 定义所有其子类ChatXxx 都具备的用于管理 LangChain 内部的逻辑如日志、回调、元数据仅在内部生效4、高级与特定扩展参数这类参数通常用于特定场景或为了保持与 OpenAI 协议的兼容性而存在。底层客户端访问: client , async_client , root_client 这些通常是内部生成的 SDK 实例不建议在初始化时手动传参。透传参数:model_kwargs,extra_body如果你想传递 DeepSeek API 支持但 LangChain 还没定义的参数可以写在这里。功能开关: disable_streaming , include_response_headers 决定是否在输出中包含Header。兼容性参数: openai_organization , service_tier , store 这些多为 OpenAI 遗留参数DeepSeek 实际使用较少。参数model_kwargs这里用于存放那些OpenAI Compatible API支持但LangChain没有直接列出的字段如用于支持Function Call的 tools 字段。参数extra_body这里用于存放模型厂商基于OpenAI API协议扩展的字段。记住常见参数及用法即可如果需要精细控制模型输出可以查阅OpenAI和特定模型供应商的官方文档通过 model_kwargs 或 extra_body 传递。4、模型调用中config参数在调用模型时如使用 invoke(), ainvoke(), stream(),batch()等方法时我们可以传入config参数。def invoke( self, input: LanguageModelInput, config: RunnableConfig | None None, *, stop: list[str] | None None, **kwargs: Any, ) - AIMessageconfig参数允许在调用模型时动态地配置和控制模型的行为而无需在初始化时就固定所有参数这为应用带来了极大的灵活性和可维护性。config中支持配置的参数如下