ARTICLE DETAIL

资讯详情

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

LangChain 入门系列二:Model初始化及调用方式实操

LangChain 入门系列二:Model初始化及调用方式实操 前言c一、Model初始化模型初始化是使用 LangChain 调用大模型的第一步。LangChain 提供两套初始化方案ModelClass 类实例化和init_chat_model统一工厂方法。1.1 用Model Class初始化模型Model Class方式直接导入对应厂商提供的聊天模型类手动实例化对象灵活性比较高。支持 DeepSeek、OpenAI、通义千问、智谱 AI、Ollama 等主流模型1安装依赖在导入具体类前需要安装对应的依赖#切换python环境 conda activate langchain_v1.3 #安装ChatOpenAI依赖包 pip install langchain-openai #安装ChatDeepSeek 依赖包 pip install langchain-deepseek #安装 ChatTongyi、ChatZhipuAI社区依赖包 pip install langchain-community ## 阿里dashscope通义千问底层sdk pip install dashscopePS不指定版本时默认安装最新稳定版。2.env文件配置在.env文件中配置各个厂商大模型的api_key和base_url的环境变量避免密钥硬编码到业务代码。3) env_utils文件配置编写工具获取.env文件中环境变量的值4创建大模型对象创建 llm.py 文件实例化大模型对象from langchain_anthropic import ChatAnthropic from langchain_community.chat_models import ChatHunyuan, ChatTongyi, ChatZhipuAI from langchain_deepseek import ChatDeepSeek from langchain_ollama import ChatOllama from langchain_openai import ChatOpenAI from env_utils import DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL, OPENAI_API_KEY, OPENAI_BASE_URL, ZHIPUAI_API_KEY, ZHIPUAI_BASE_URL, #创建DeepSeek LLM deepseek ChatDeepSeek( api_keyDEEPSEEK_API_KEY, base_url DEEPSEEK_BASE_URL, modeldeepseek-v4-pro, ) gpt ChatOpenAI( api_keyOPENAI_API_KEY, base_urlOPENAI_BASE_URL, modelgpt-5, ) zhipu ChatZhipuAI( api_keyZHIPUAI_API_KEY, modelglm-4, )PS: 兼容 OpenAI 接口的大模型厂商模型都可以直接复用ChatOpenAI完成初始化deepseek ChatOpenAI( api_keyDEEPSEEK_API_KEY, base_urlDEEPSEEK_BASE_URL, modeldeepseek-v4-pro, )5) 创建 model_invoke.py 文件调用模型response1 deepseek.invoke(介绍一下你自己) print(response1.content) response2 gpt.invoke(介绍一下你自己) print(response2.content) response3 zhipu.invoke(介绍一下你自己) print(response3.content)1.2 用init_chat_model初始化模型1模型初始化init_chat_model 初始化模型是LangChain 1.0版本后提供的统一工厂函数传入“model”模型、“model_provider”模型提供商、“api_key”、“base_url”参数后自动创建出对应的模型实例调用模型方式与ModelClass 方式完全一致降低多模型切换的成本from langchain.chat_models import init_chat_model from langchain_core.language_models import BaseChatModel from env_utils import DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL, OPENAI_API_KEY, OPENAI_BASE_URL, ZHIPUAI_API_KEY, ZHIPUAI_BASE_URL deepseek: BaseChatModel init_chat_model( modeldeepseek-chat, model_providerdeepseek, api_keyDEEPSEEK_API_KEY, base_urlDEEPSEEK_BASE_URL, ) gpt init_chat_model( modelgpt-4, model_provideropenai, api_keyOPENAI_API_KEY, base_urlOPENAI_BASE_URL, ) # 兼容OpenAI协议的第三方模型provider填openai zhipu init_chat_model( modelglm-4, model_provideropenai, api_keyZHIPUAI_API_KEY, base_urlZHIPUAI_BASE_URL, )注意如果使用的模型供应商没有对应的provider但是该模型供应商支持标准OpenAI访问那么可以设置“model_provider”为“openai”如示例中zhipu 大模型初始化方式。2模型调用创建init_model.py文件执行如下代码from init_llm import deepseek, gpt print(deepseek.invoke(请介绍一下你自己)) print(gpt.invoke(请介绍一下你自己))模型初始化参数说明参数类型参数描述model字符串 必填提供商一起使用的具体模型的名称或标识符api_key字符串与模型提供商进行身份验证所需的密钥。通常在注册获取模型访问权限时颁发。通常通过设置环境变量base_url字符串指定模型访问的端点temperature数字控制模型输出的随机性。数值越高响应越有创意数值越低响应越确定。max_retries数字 默认值6如果请求因网络超时或速率限制等问题失败系统尝试重新发送请求的最大次数。重试使用带抖动的指数退避策略。网络错误、速率限制 (429) 和服务器错误 (5xx) 会自动重试。客户端错误如 401 未授权或 404不会重试。对于在不可靠网络上运行长时间 Agent 任务的情况请考虑将此值增加到 10–15。timeout数字在取消请求前等待模型响应的最长时间以秒为单位max_tokens数字限制响应中tokens的总数从而有效地控制输出的最大长度二、模型调用1.1 invoke调用模型invoke()是最直接、最常用的模型调用方法它是阻塞式的即模型完全生成整个响应后程序才会一次性将结果返回给用户。invoke方法支持三种形式的输入单条消息、消息列表字典格式、消息列表消息对象格式。1单条消息调用方式是简单给大模型一个指令from init_llm import deepseek 单条消息调用 resp deepseek.invoke(请介绍一下你自己) print(resp.content) # 输出:你好我是DeepSeek由深度求索公司创造的AI助手...2消息列表from init_llm import deepseek #消息列表字典格式调用 prompt [ {role: system, content: 你是一个资深程序开发人员}, {role: user, content: 写一个冒泡排序方法} ] resp deepseek.invoke(prompt) print(resp.content) #3消息列表对象格式消息列表对象格式是LangChain框架推荐的方式相比上面两种方式来说功能更丰富from init_llm import deepseek from langchain_core.messages import SystemMessage, HumanMessage, AIMessage conversation [ SystemMessage(你是一个有帮助的助手可以将汉语翻译成英语。), HumanMessage(翻译: 我喜欢编程), AIMessage(I love programming.), HumanMessage(翻译: 我喜欢大模型) ] resp deepseek_llm.invoke(conversation) print(resp.content) # 输出: I like large models.扩展关于LangChain框架的Message types有 System message、Human message、AI message 、ToolMessage四种解释如下System message用于在对话开始时为模型设定角色、行为准则和上下文背景。它像是给AI助手的一份工作说明书决定了其回答问题的风格、领域和专业范围。HumanMessage代表用户的输入包含简单的文本问题也可以是复杂的多模态内容如图片、音频、文档等。在多轮对话中它表示用户的一次发言。AIMessage 代表模型的输出或回复包括生成的文本、工具调用、元数据等。ToolMessage将工具执行的结果返回给模型让模型基于这个结果继续生成回复ChatModel聊天模型的 invoke方法返回的是一个 AIMessage对象你需要通过 .content属性来获取模型生成的文本内容。1.2 流式调用流式调用大模型使用方式是调用 stream() 会返回一个 迭代器 (iterator)逐个产生 AIMessageChunk对象。每个块都包含输出内容的一部分并且这些块可以通过拼接最终组合成一个完整的消息其最终效果与使用 invoke()得到的结果一致。from typing import Iterator from langchain_core.messages import AIMessageChunk from init_llm import deepseek resp : Iterator[AIMessageChunk] deepseek.stream(使用20个字给我介绍什么你自己) for chunk in resp: # print(chunk,type(chunk)) #end 避免打印时自动换行flushTrue 及时刷新输出 print(chunk.content, end|, flushTrue)1.3 批量调用LangChain 中的批处理功能是一种通过并行处理多个独立请求来显著提升性能、降低成本的强大机制。批处理的核心思想是将多个独立的请求集合成一个批次并行发送给模型处理。这与逐个顺序调用invoke相比能大幅减少网络往返开销和等待时间尤其适合处理问答、文本分类、情感分析等独立任务。from langchain_core.runnables.utils import Output from init_llm import deepseek responses:list[Output] deepseek.batch([ 写一首五言绝句, 飞机是如何飞行的, 航空和航天的区别是什么 ]) for response in responses: print(response.content)默认情况下batch()是等待所有请求处理完毕按原始输入顺序返回结果列表。当输入列表很大或单个模型调用耗时差异显著时batch_as_completed()允许应用在收到第一个结果后立即开始后续处理而不必等待最慢的那个请求也就是说batch_as_completed() 每个请求完成后立即 yield 结果结果可能乱序但包含索引信息。1.4 异步调用在LangChain框架中异步方法ainvoke、astream、abatch与它们的同步版本invoke、stream、batch相比具备如下特点避免阻塞主线程同步调用会阻塞程序执行而异步方法让应用程序在等待API响应时保持响应性。优化资源利用异步操作可以更高效地利用系统资源减少空闲等待时间下面通过一个完整的示例展示如何在LangChain中使用异步方法调用模型。import asyncio import time from langchain.chat_models import init_chat_model from init_model import deepseek async def demo_async_invoke(): 演示单个异步调用的非阻塞特性 print( 演示ainvoke 的异步非阻塞效果 ) print(程序开始...) # 1. 发起一个异步请求但不等待它完成 print(---发起异步模型调用 (ainvoke)...) async_task deepseek.ainvoke(用一句话解释人工智能。) # 2. 在等待模型响应的同时主程序可以继续执行其他任务 print(--- 模型请求已发送程序无需等待继续执行...) for i in range(3): # 等待1s await asyncio.sleep(1) print(f---- 正在执行第{i 1}个任务... ) # 3. 现在我们需要模型的结果了所以用 await 等待它完成 print(---其他任务已完成现在等待模型返回结果...) response await async_task # 此时才开始等待 print(f--- 模型返回: {response.content}) async def demo_async_stream(): 演示异步调用的非阻塞特性 print( 演示astream 的异步非阻塞效果 ) print(程序开始...) # 1. 发起异步流式请求但不立即处理结果 print(---- 发起异步流式调用 (astream)...) stream_resp deepseek.astream(请一句话解释机器学习的基本概念。) # 2. 在等待流式响应的同时执行其他任务 print(--- 流式请求已发送程序无需等待继续执行...) for i in range(3): # 等待1s await asyncio.sleep(1) print(f---正在执行第{i 1}个任务... ) # 3. 现在开始处理流式结果 print(--- 其他任务已完成开始处理流式结果...) print(---- 流式输出: , end, flushTrue) async for chunk in stream_resp: if hasattr(chunk, content): print(chunk.content, end, flushTrue) print(--- 流式输出结束\n) async def demo_async_batch(): 演示单个异步调用的非阻塞特性 print( 演示abatch 的异步非阻塞效果 ) print(程序开始...) # 准备批量输入即使是单个输入也用列表形式 questions [用一句话说明深度学习与传统机器学习的区别] # 1. 发起异步批量请求 print(---发起异步批量调用 (abatch)...) batch_resp deepseek.abatch(questions) # 2. 在等待批量处理的同时执行其他任务 print(--- 批量请求已发送程序无需等待继续执行...) for i in range(3): # 等待1s await asyncio.sleep(1) print(f--- 正在执行第{i 1}个任务... ) # 3. 等待批量处理结果 print(--- 其他任务已完成现在等待批量处理结果...) responses await batch_resp for response in responses: print(f--- 批量响应: {response.content}) async def main(): 主函数 await demo_async_invoke() await demo_async_stream() await demo_async_batch() if name main: asyncio.run(main())以上就是 LangChain 中大模型初始化与各类调用方式的全部实操示例。不同业务场景可以按需选择同步、流式、批量或异步调用方案。 如果文章对你有帮助欢迎关注➕收藏欢迎评论区交流相互学习预告下一篇分享内容大模型调用结构化输出相关内容。附件有关模型配置相关的内容参考LangChain 从入门到实战系列一框架了解与开发初体验-CSDN博客
返回列表