第02章:模型的创建与调用 (上)
目录1、模型调用的准备工作1.1 一张老图看大模型的调用1.2 模型初始化的分类方式1.3 线上大模型服务平台1.4 提前安装所有依赖2、模型初始化角度1使用模型提供商库2.1 通过专用API调用2.1.1 DeepSeek大模型2.1.2 智谱大模型2.1.3 千问大模型2.2 兼容用法2.3 中转平台( aicodemirror )3、模型初始化角度1init_chat_model()3.1 使用举例3.2 小结模型的创建3.3 模型初始化参数(常用版)本章对应的官网文档出处英文文档https://docs.langchain.com/oss/python/langchain/models中文文档https://docs.langchain.org.cn/oss/python/langchain/models1、模型调用的准备工作1.1 一张老图看大模型的调用在LangChain v0.3版本中提到了Model I/O包括输入提示(Format)、调用模型(Predict)、输出解析 (Parse)。分别对应着 Prompt Template Model 和 Output Parser 。关于模型调用模块如今对话模型已经是主要形式。从历史上解读、在GPT-3时代大模型以 补全模型 为主只能以类似“成语接龙”的方式对文本进行补全并且实际运行 效果也 非常不稳定 。此时LangChain借助一些高层封装的API能够让模型完成对话、调用外部工具、 甚至是结构化输出等功能为开发者提供了极大的便利。伴随着GPT-3.5模型的发布 对话模型 正式登上历史的舞台并逐渐 成为主流 。而得益于对话模型更 强的指令跟随能力很多GPT-3需要借助LangChain才能完成的工作已经成为GPT-3.5原生自带的一些 功能。所以本章只提供了对话模型的创建而没有了非对话模型。1.2 模型初始化的分类方式简单来说就是用谁家的API以什么方式创建存放在哪个位置的大模型角度1调用谁家的API使用模型提供商的库使用LangChain统一方式 推荐 角度2模型初始化时几个重要参数(如BASE_URL、API-KEY)的书写位置的不同使用配置文件 推荐 硬编码写在代码文件中角度3调用的模型所在位置在线部署的大模型本地部署的大模型LangChain作为一个“工具”不提供任何 LLMs而是依赖于第三方集成各种大模型。这里就看大 模型到底部署在哪里。1.3 线上大模型服务平台有许多提供大模型API服务的平台使用时只需要注册、充值并创建API-Key之后即可使用API-Key与 URL来调用平台提供的相应的模型的服务。说明每个平台配置时都需要几个要素 模型名 、 api-key 、 base-url 。如果大家想使用国外的大模型就选择前两个如果只使用国内的大模型可以选择后四个。阿里云百炼所有新用户可获得超过5000万Tokens的免费额度及4500张图片生成额度。适合toB 企业用户硅基流动号称9B 以下模型永久免费开源模型价格低适合个人学习。此外还有各个模型自己的厂商平台。比如deepseek、智谱等。OpenRouter是一个第三方镜像站专门转发大模型厂商的API服务。通过它我们可以间接调用几 乎所有大模型厂商的API服务。支持国内直连。OpenRouter支持支付宝或微信充值最低限额$5税费$0.8此外如果调用的模型禁止在国内 使用如ChatGPT则无法通过OpenRouter直接调用需要Magic会提示This model is not available in your region根据个人情况决定是否充值并调用OpenRouter API。1.4 提前安装所有依赖课程中会涉及到多个库的安装这里一并声明在 requirements.txt 文件 中。 同时LangChain的版本变化较快不同版本之间可能存在兼容问题为了避免因版本不一致导致的问 题本课程会通过 requirements.txt 固定主要依赖版本 。 用法将requirements.txt存放到项目所在的目录下执行pip install -r .\requirements.txt说明课程中的部分章节会单独列出相关依赖主要是为了帮助大家了解该章节涉及的核心库。 无需重 复安装 这些依赖已经统一包含在 requirements.txt 中。2、模型初始化角度1使用模型提供商库在 LangChain 中初始化模型主要可以通过直接使用特定的Model Class和使用统一的 init_chat_model函数这两种方式来实现。这里先讲方式1这种方式最直接。LangChain为一些大模型供应商提供了专门的Model类导入对应的 具体类如 ChatOpenAI、ChatAnthropic、ChatDeepSeek、ChatOllama、ChatHunyuan、 ChatTongyi、ChatZhipuAI并进行实例化。官网链接https://reference.langchain.com/python/langchain-community/chat-models2.1 通过专用API调用注意使用不同的模型可能传入的参数名称不同可以参考对应的源码2.1.1 DeepSeek大模型官网https://www.deepseek.com/步骤1安装必要的依赖(略)执行过前面的requirements.txt文件指令的情况下这里就不需要安装了。#切换python环境 conda activate langchain1.2 #安装ChatOpenAI依赖包 pip install langchain-openai #安装ChatDeepSeek 依赖包 pip install langchain-deepseek # 用于环境管理的包 pip install python-dotenv说明langchain-deepseek 是使用deepseek 大模型必要依赖。注意 langchain-deepseek 依赖于 langchain-openai 安装前者pip会自动从pypi拉取元数据解析 依赖后者也会被安装。所以我们把 langchain-openai 也放在此处。步骤2配置.env文件明确去deepseek官网获取key)在项目根目录下创建.env文件在.env文件中写入以下内容DEEPSEEK_API_KEYYour API Key DEEPSEEK_BASE_URLhttps://api.deepseek.com说明将占位符替换为自己的API_KEY。步骤3读取配置并初始化模型这里我们用DeepSeek的模型进行测试LangChain会从环境变量中读取DEEPSEEK_API_KEY。如下是 代码实现from langchain_deepseek import ChatDeepSeek import os from dotenv import load_dotenv # 通过load_dotenv()将.env中的变量加载为环境变量 # overrideTrue表示无论你当前的操作系统、终端或者虚拟环境中是否已经存在同名的环境变量 # 都会强行用 .env 文件里写的值去覆盖它 load_dotenv(overrideTrue) # 从环境变量读取配置 DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY) DEEPSEEK_BASE_URL os.getenv(DEEPSEEK_BASE_URL) # 创建DeepSeek LLM deepseek_llm ChatDeepSeek( api_keyDEEPSEEK_API_KEY, api_baseDEEPSEEK_BASE_URL, # 注意这里是api_base不是base_url model_namedeepseek-v4-flash, ) print(deepseek_llm.invoke(请介绍一下你自己))基于模型集成手册和LangChain Reference的API参考页ChatDeepSeek可知相关的配置参数。ChatDeepSeek | langchain_deepseek | LangChain Referencelangchain | LangChain ReferenceChatDeepSeek integration - Docs by LangChain方式2优化依靠默认行为读取 .env 环境变量from langchain_deepseek import ChatDeepSeek from dotenv import load_dotenv # 通过load_dotenv()将.env中的变量加载为环境变量 load_dotenv(overrideTrue) deepseek_llm ChatDeepSeek( model_namedeepseek-v4-flash, ) print(deepseek_llm.invoke(请介绍一下你自己))调用ChatDeepSeek要求系统存在名为DEEPSEEK_API_KEY的环境变量。URL通过源码可以查看 有默认值。如下api_key: SecretStr | None Field( default_factorysecret_from_env(DEEPSEEK_API_KEY, defaultNone), ) DeepSeek API key api_base: str Field( default_factoryfrom_env(DEEPSEEK_API_BASE, defaultDEFAULT_API_BASE), ) DeepSeek API base URL DEFAULT_API_BASE https://api.deepseek.com/v1式3硬编码方式不推荐from langchain_deepseek import ChatDeepSeek # 创建DeepSeek LLM deepseek_llm ChatDeepSeek( api_keysk-2nkIWkv6M...U1Ra4P0NGa, # 明文暴露密钥 api_basehttps://api.deepseek.com, modeldeepseek-v4-flash, ) print(deepseek_llm.invoke(请介绍一下你自己))直接将 API Key 和模型参数写入代码仅适用于临时测试存在密钥泄露风险在 生产环境不推荐 。 相比来讲.env配置文件方式生产环境推荐配置文件可加入 .gitignore 避免泄露。2.1.2 智谱大模型官网https://www.bigmodel.cn/相关依赖# 安装 Langchain 社区依赖包包含ChatHunyuan、ChatTongyi、ChatZhipuAI pip install langchain-community # ChatZhipuAI / 智谱 AI 认证相关依赖 pip install pyjwt环境变量在.env中补充ZHIPUAI_API_KEYYour API Key ZHIPUAI_BASE_URLhttps://open.bigmodel.cn/api/paas/v4/chat/completions确保余额或免费额度大于零。举例import os from langchain_community.chat_models import ChatZhipuAI from dotenv import load_dotenv # overrideTrue 确保.env文件优先 load_dotenv(overrideTrue) ZHIPUAI_API_KEY os.getenv(ZHIPUAI_API_KEY) ZHIPUAI_BASE_URL os.getenv(ZHIPUAI_BASE_URL) zhipu_llm ChatZhipuAI( modelglm-5.1, api_baseZHIPUAI_BASE_URL, #可选 api_keyZHIPUAI_API_KEY #可选 ) print(zhipu_llm.invoke(请介绍一下你自己))2.1.3 千问大模型通过阿里云百炼平台调用官网https://bailian.console.aliyun.com/相关依赖#切换python环境 conda activate langchain1.2 # ChatTongyi / 阿里通义千问依赖包 pip install dashscope环境变量在.env中补充DASHSCOPE_API_KEYYour API Key注意一般不要添加这样的环境变量DASHSCOPE_BASE_URLhttps://dashscope.aliyuncs.com/compatible-mode/v1百炼平台提供了两种访问方式专用SDK和OpenAI兼容接口上述URL是为后者准备的而ChatTongyi 底层是基于专用SDK实现的如果指定了上述URL则运行报错举例import os from langchain_community.chat_models import ChatTongyi from dotenv import load_dotenv # overrideTrue 确保.env文件优先 load_dotenv(overrideTrue) DASHSCOPE_API_KEY os.getenv(DASHSCOPE_API_KEY) tongyi_llm ChatTongyi( api_keyDASHSCOPE_API_KEY, modelqwen-plus, ) print(tongyi_llm.invoke(请介绍一下你自己))2.2 兼容用法一方面LangChain没有为所有大模型厂商提供专用接口见Langchain大模型集成列表。如果选用的 平台没有专用接口可以通过兼容接口调用。另一方面专用接口的对接方式五花八门如腾讯混元的ChatHunyuan需要单独的 APP_ID SecretId SecretKey 配置繁琐用户不友好。结论大多数API平台都支持OpenAI API接口规范所以基本都可以通过 ChatOpenAI 集成。举例1import os from dotenv import load_dotenv # overrideTrue 确保.env文件优先 from langchain_openai import ChatOpenAI load_dotenv(overrideTrue) # 通过ChatOpenAI 连接deepseek模型 DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY) DEEPSEEK_BASE_URL os.getenv(DEEPSEEK_BASE_URL) deepseek_llm2 ChatOpenAI( api_keyDEEPSEEK_API_KEY, base_urlDEEPSEEK_BASE_URL, modeldeepseek-v4-flash, ) response deepseek_llm2.invoke(1 1 ) print(response)举例2import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv(overrideTrue) tongyi_llm2 ChatOpenAI( api_keyos.getenv(DASHSCOPE_API_KEY), base_urlos.getenv(DASHSCOPE_BASE_URL), modelqwen-plus, ) response tongyi_llm2.invoke(介绍一下你自己) print(response)2.3 中转平台( aicodemirror )AICodeMirror官方共享平台 - 中国用户专属AI编程助手可以领取免费额度无需编程基础仅依靠自然语言就能将您的想法变为现实用最简单的配置即刻使用稳定、安全、优惠的 Claude Code 、 Codex 和 Gemini CLI体验当前全球最顶级的AI编程工具。为企业和开发者提效300%LangChain没有为aicodemirror提供专用集成可以通过ChatOpenAI兼容接口调用。在.env中补充AICODE_KEYYour API Key AICODE_URLhttps://api.aicodemirror.com/api/codex/backend-api/codex/v1举例import os from dotenv import load_dotenv # overrideTrue 确保.env文件优先 from langchain_openai import ChatOpenAI load_dotenv(overrideTrue) #通过ChatOpenAI 连接通义千问模型 DASHSCOPE_API_KEY os.getenv(AICODE_KEY) DASHSCOPE_BASE_URL os.getenv(AICODE_URL) tongyi_llm2 ChatOpenAI( api_keyDASHSCOPE_API_KEY, base_urlDASHSCOPE_BASE_URL, modelgpt-5.5, ) response tongyi_llm2.invoke(1 1 ) print(response)3、模型初始化角度1init_chat_model()init_chat_model 是 LangChain 1.x 中推出的用于初始化聊天模型的统一接口。只要是LangChain支持 的模型都可以处理它会根据模型名称自动选择对应的模型类初始化实例。基本语法from langchain.chat_models import init_chat_model model init_chat_model( model_providermodel_name, # 提供商:模型名称 api_keyyour-api-key, # API 密钥可选可从环境变量读取 temperature0.7, # 温度参数可选 max_tokens1000, # 最大 token 数可选 model_kwargs[] # 其他模型特定参数 )问题 init_chat_model 和直接使用 ChatTongyi、ChatOpenAI、ChatDeepSeek有什么区别回答 init_chat_model 是 LangChain 1.0 的统一接口优势包括统一接口无需记住每个提供商的不同初始化方式以一致的方式初始化易于切换简化了智能体系统中模型切换策略只需修改模型字符串简洁明了更简洁的语法减少样板代码自动适配内部根据模型标识自动选择对应的驱动类(ChatOpenAI、ChatDeepSeek)3.1 使用举例举例1调用DeepSeek官网的大模型import os from langchain.chat_models import init_chat_model from dotenv import load_dotenv # 从.env文件中加载环境变量 load_dotenv(overrideTrue) # 从环境变量读取配置 DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY) DEEPSEEK_BASE_URL os.getenv(DEEPSEEK_BASE_URL) model init_chat_model( modeldeepseek:deepseek-v4-flash, #model_providerdeepseek, api_keyDEEPSEEK_API_KEY, base_urlDEEPSEEK_BASE_URL) # 向模型发送单条数据 response model.invoke(你好用一句话回答) # 打印响应 print(response)当我们传递的模型名称为 deepseek-v4-flash 时init_chat_model会自动调用ChatDeepSeek初始化模 型实例和直接通过ChatDeepSeek初始化的效果完全一致。举例2调用阿里百炼大模型环境变量DASHSCOPE_BASE_URLhttps://dashscope.aliyuncs.com/compatible-mode/v1 DASHSCOPE_API_KEYYOUR_API_KEY代码import os from langchain.chat_models import init_chat_model from dotenv import load_dotenv # 从.env文件中加载环境变量 load_dotenv(overrideTrue) # 从环境变量读取配置 DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY) DEEPSEEK_BASE_URL os.getenv(DEEPSEEK_BASE_URL) model init_chat_model( modeldeepseek:deepseek-v4-flash, #model_providerdeepseek, api_keyDEEPSEEK_API_KEY, base_urlDEEPSEEK_BASE_URL ) # 向模型发送单条数据 response model.invoke(你好用一句话回答) # 打印响应 print(response)举例3调用aicodemirror中转平台大模型环境变量AICODE_KEYYour API Key AICODE_URLhttps://api.aicodemirror.com/api/codex/backend-api/codex/v1代码from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os load_dotenv(overrideTrue) AICODE_KEYos.getenv(AICODE_KEY) AICODE_URLos.getenv(AICODE_URL) model init_chat_model( modelgpt-5.5, model_provideropenai, api_keyAICODE_KEY, base_urlAICODE_URL ) print(model.invoke(你好用一句话回答))问题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的。问题2如果在model参数中没有指明模型提供者必须在model_provider中指明可以在model参数中通过前缀指定模型供应商和模型名称之间用 冒号分割 等价于通过 model_provider参数指定供应商。如果两个位置都没有指明供应商LangChain底层会按照内置规则自 动推断。但是并非所有的模型都支持自动推断如model名称 qwen-plus 不支持自动推断没有指明供应商会 报错。3.2 小结模型的创建DeepSeek官网的DeepSeek模型可以调用ChatDeepSeek()、ChatOpenAI()、 init_chat_model()三种方式阿里云百炼平台的DeepSeek模型可以调用ChatTongyi()、ChatOpenAI()、init_chat_model() 三种方式3.3 模型初始化参数(常用版)在LangChain中Model Class 和init_chat_model初始化模型共同的参数及解释。API文档https://docs.langchain.org.cn/oss/python/langchain/models#parameters说明1、temperature 参数根据使用场景选择0.0-0.3需要一致性、准确性的任务数学计算、数据提取、分类、代码生成0.5-0.7平衡创造性和一致性聊天、问答0.8-1.5创造性任务写作、头脑风暴\1.5-2.0高度创造性诗歌、故事创作举例from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os load_dotenv(overrideTrue) model init_chat_model( modeldeepseek-v4-pro, model_provideropenai, temperature0, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL), ) # 向模型发送单条数据 for i in range(3): response model.invoke(帮我写一首描述春天的七言绝句诗) # 打印响应 print(response.content)此时设置为 后模型会始终选择概率最高的 Token确保字段准确、不胡乱发挥。作为对比from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os load_dotenv(overrideTrue) model init_chat_model( modeldeepseek-v4-pro, model_provideropenai, temperature1.5, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL), ) # 向模型发送单条数据 for i in range(3): response model.invoke(帮我写一首描述春天的七言绝句诗) # 打印响应 print(response.content)使用场景严格的结构化数据提取from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os load_dotenv(overrideTrue) model init_chat_model( modeldeepseek-v4-pro, model_provideropenai, temperature0, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL), ) # 向模型发送单条数据 response model.invoke(张三男30岁拥有8年编程开发经验目前在某互联网大厂担任技术专家。帮我从上文中提取数据返回JSON格式) print(response.content)使用场景创意文案与头脑风暴from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os load_dotenv(overrideTrue) model init_chat_model( modeldeepseek-v4-pro, model_provideropenai, temperature2, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL), ) # 向模型发送单条数据 response model.invoke(请为一款极致静音的机械键盘写3个充满诗意且极具张力的广告语。) print(response.content)2、Token是什么基本单位 : 大模型通过分词器Tokenizer将文本拆分后的最小语义单元是token相当于自然语言中 的词或字。不同的模型采用不同的 分词算法 如BPE、WordPiece因此同一段文本在不同模型中 的Token数量可能不同。收费依据 大语言模型通常也是以token的数量作为其计量或收费的依据。1个中文Token≈1-1.8个汉字1个英文Token≈3-4个字符Token与字符转化的可视化工具OpenAI提供https://platform.openai.com/tokenizer百度智能云提供https://console.bce.baidu.com/support/#/tokenizer举例from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os load_dotenv(overrideTrue) model init_chat_model( modelgpt-5.4, model_provideropenai, max_tokens15, api_keyos.getenv(AICODE_KEY), base_urlos.getenv(AICODE_URL), ) # 向模型发送单条数据 response model.invoke(请用中文详细介绍什么是AI) print(response.content)