摘要:本文围绕 LangChain 中模型调用的多种方式展开,重点对比了 init_chat_model、langchain_openai 以及模型厂商官方库三种调用路径在思考能力上的差异,并给出对应的代码示例。文章还介绍了本地模型(Ollama)的接入方法、工具调用(Tool Calling)以及多模态输入(文本、图片、视频、音频)的实践方式,帮助读者根据场景选择合适的模型调用方案。
内容参考于:图灵AI大模型全栈
模型就是Agent的脑子,就跟你们人类一样,抬手、走路等一系列交互都是通过脑子控制的,Agent也是模拟了你们人类这样的一套流程,所以模型的选择就很重要,要选择可靠的聪明的模型,要选择合适的模型不同的不行擅长的东西也不一样,就跟你们人类一样每个人都有自己擅长的东西
LangChain提供的模型
LangChain它集成了很多大模型厂商
聊天模型地址:https://docs.langchain.com/oss/python/integrations/chat
嵌入模型地址:https://docs.langchain.com/oss/python/integrations/embeddings
如下图红框是LangChain推荐的聊天模型,我们国内的模型好像只推荐DeepSeek
从上图往下滑就可以看到下图红框,它是所有支持的模型,上图红框里的是LangChain推荐的模型
然后如下图红框在所有模型中就可以看到我们经常使用的千问模型了
点击红框,如下图它会告诉你们人类这个模型的包信息
还有下载方式和使用实例
LangChain支持的嵌入模型
我们使用LangChain调用各种各样的模型也是很方便的,主流的它都提供了
init_chat_model方式调用模型,这个调用方式好像模型不会思考
这种方式有一个坑,就是它需要传递一个供应商,LangChain推荐的模型它才有供应商,不推荐的它是没有的,但是不管国内的还是国外的大模型它都支持openai,所以这种没有供应商的大模型厂家就需要把供应商写成openai,如果使用DeepSeek就直接写deepseek就可以了,这个原因是LangChain它想把所有的调用都封装到 init_chat_model 方法里,这样就能通过统一的方式更换不同的大模型,如果不统一,调用不同的大模型就需要引入不同的包
效果图:下图红框是模型的思考过程,可以看出它是空的
代码
from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 初始化模型 llm = init_chat_model(model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL"), # 这个参数就是模型供应商 model_provider="openai") # 普通对话 result = llm.invoke("你好!我是计算机王") print(result) # 流式输出 # for chunk in llm.stream("请告诉我一个笑话!"): # print(chunk.text, end="", flush=True) # 批次对话-并行调用Agent完成任务 # responses = llm.batch([ # "为什么天空是蓝色的?", # "为什么鸡有翅膀却不能飞?", # "什么是langchain ?" # ]) # for response in responses: # print(response.content)
langchain_openai方式调用模型:它好像也没有思考
效果图:下图红框是模型的思考过程,可以看出它是没有思考的
from langchain_openai import ChatOpenAI from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 初始化模型 llm = ChatOpenAI(model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL") ) # 普通对话 # result = llm.invoke("你好!") # print(result.content) # 流式输出 for chunk in llm.stream("请告诉我一个笑话!"): print(chunk.text, end="", flush=True) # 批次对话-并行调用Agent完成任务 # responses = llm.batch([ # "为什么天空是蓝色的?", # "为什么鸡有翅膀却不能飞?", # "什么是langchain ?" # ]) # for response in responses: # print(response.content)
通过模型厂商提供的库调用,这种方式会开启模型的思考功能,如果LangChain没有提供库就只能舍弃一部分功能了
这里使用千问的库,需要先下载,如下图红框要下载的指令,通过它可以知道要下载的库名字
我们使用的是uv环境,所以就不能使用上图红框的pip命令下载,要使用uv的下载命令,如下,下载完如果还是报错记得清理 PyCharm 的缓存
uv add langchain-qwq效果图:下图红框可以看到有模型的思考过程了 reasoning_content 里的内容就是模型思考的内容
下图红框的 content 是模型最终回复的内容
下图红框是本次消耗的Token情况,input_tokens是人类输入的token数量,output_tokens是大模型根据人类输入的内容消耗的token,这里面包含思考耗费的token,total_tokens是本次消耗的Token总数
代码
from langchain_qwq import ChatQwen from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 使用千问提供的库初始化模型 llm = ChatQwen(model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL") ) # 普通对话 result = llm.invoke("你好!我是计算机王") print(result) # 流式输出 # for chunk in llm.stream("请告诉我一个笑话!"): # print(chunk.text, end="", flush=True) # 批次对话-并行调用Agent完成任务 # responses = llm.batch([ # "为什么天空是蓝色的?", # "为什么鸡有翅膀却不能飞?", # "什么是langchain ?" # ]) # for response in responses: # print(response.content)关闭思考效果图:可以看出它没有思考了,token消耗的也会很少
from langchain_qwq import ChatQwen from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 使用千问提供的库初始化模型 llm = ChatQwen( model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL"), # 值为False表示关闭思考,值为True表示开启思考,默认开启思考 enable_thinking=False ) # 普通对话 result = llm.invoke("你好!我是计算机王") print(result) # 流式输出 # for chunk in llm.stream("请告诉我一个笑话!"): # print(chunk.text, end="", flush=True) # 批次对话-并行调用Agent完成任务 # responses = llm.batch([ # "为什么天空是蓝色的?", # "为什么鸡有翅膀却不能飞?", # "什么是langchain ?" # ]) # for response in responses: # print(response.content)限制思考等级,可以通过下图红框的 thinking_budget 参数来限制,它值是一个数字,这个数字是思考的长度
代码
from langchain_qwq import ChatQwen from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 使用千问提供的库初始化模型 llm = ChatQwen( model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL"), enable_thinking=True, thinking_budget=10 ) # 普通对话 result = llm.invoke("你好!我是计算机王") print(result) # 流式输出 # for chunk in llm.stream("请告诉我一个笑话!"): # print(chunk.text, end="", flush=True) # 批次对话-并行调用Agent完成任务 # responses = llm.batch([ # "为什么天空是蓝色的?", # "为什么鸡有翅膀却不能飞?", # "什么是langchain ?" # ]) # for response in responses: # print(response.content)
本地模型
它需要按照ollama的库,如下图红框ollama,点击下图红框
库名
除了安装库意外还需要安装ollama,安装方式参考第6节
本地向量模型和大语言模型的下载参考,第44节
uv环境安装命令
uv add langchain-ollama还需要安装下方的库,用来提供本地运行环境
uv add langchain-huggingface sentence-transformers torchvision torchaudio peft效果图:
# 需要下载:uv add langchain-huggingface sentence-transformers langchain-ollama torchvision from langchain_ollama import ChatOllama from langchain_huggingface import HuggingFaceEmbeddings # 使用本地ollama模型 llm = ChatOllama( model="deepseek-r1:14b", ) result = llm.invoke("你好,我是计算机王") print(result) # 使用本地嵌入模型 embeddings = HuggingFaceEmbeddings(model_name=r"E:\AiModel\Local_model\BAAI\bge-large-zh-v1___5") query_embedding = embeddings.embed_query("什么是Embeddings句子嵌入?") doc_embeddings = embeddings.embed_documents( [ "LangChain提供了一个标准的Embeddings接口。", ] ) print("Query embedding:", query_embedding) print("Document embeddings:", doc_embeddings)
工具的调用
效果图:
代码:
# 模型进行工具调用 from langchain_qwq import ChatQwen from langchain.tools import tool from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 创建一个工具 @tool def get_user_info(user_name: str) -> str: """根据用户名获取用户详细信息 Args: user_name (str): 用户吗 Returns: 用户详细信息 """ user_info = { "user_name": user_name, "age": 20 } return f"用户信息如下:{user_info}" # 初始化模型 llm = ChatQwen( model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL") ) # 模型绑定工具,返回一个新的模型对象 model_with_tools = llm.bind_tools([get_user_info]) # 模型并不会自己调用工具,只会返回我要调用哪个工具 response = model_with_tools.invoke("我的名字叫张三,帮我查询我的详细信息") for tool_call in response.tool_calls: # 查看模型所做的工具调用 print(f"Tool: {tool_call['name']}") print(f"Args: {tool_call['args']}")
多模态调用
如下图红框,可以看到 qwen3.7-flash 模型是支持文本、图片、视频、音频的传递,就是说这个qwen3.7-flash 模型可以识别文本、图片、视频、音频,这就是多模态
这里的实例是让大模型识别图片,图片内容如下,是一个大熊猫
效果图:识别出来图片内容
代码,传递URL
from langchain_qwq import ChatQwen from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 初始化模型 llm = ChatQwen( model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL") ) # 传递图片的入参 message = { "role": "user", "content": [ {"type": "text", "text": "描述这个图像的内容"}, {"type": "image", "url": "https://bkimg.cdn.bcebos.com/pic/2e2eb9389b504fc2ef3eb893ebdde71191ef6dc6?x-bce-process=image/format,f_auto/quality,Q_70/resize,m_lfit,limit_1,w_536"}, ] } response = llm.invoke([message]) print(response)如下图除了传递URL,还是传递图片的base64