ARTICLE DETAIL

资讯详情

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

109.Agent-LangChain核心组件-在线模型调用(多模态调用、工具调用、厂商提供库、langchain_openai、init_chat_model)和本地模型调用(ollama)

109.Agent-LangChain核心组件-在线模型调用(多模态调用、工具调用、厂商提供库、langchain_openai、init_chat_model)和本地模型调用(ollama) 摘要本文围绕 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(modelqwen3.7-flash, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlos.getenv(DASHSCOPE_BASE_URL), # 这个参数就是模型供应商 model_provideropenai) # 普通对话 result llm.invoke(你好我是计算机王) print(result) # 流式输出 # for chunk in llm.stream(请告诉我一个笑话): # print(chunk.text, end, flushTrue) # 批次对话-并行调用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(modelqwen3.7-flash, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlos.getenv(DASHSCOPE_BASE_URL) ) # 普通对话 # result llm.invoke(你好) # print(result.content) # 流式输出 for chunk in llm.stream(请告诉我一个笑话): print(chunk.text, end, flushTrue) # 批次对话-并行调用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这里面包含思考耗费的tokentotal_tokens是本次消耗的Token总数代码from langchain_qwq import ChatQwen from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 使用千问提供的库初始化模型 llm ChatQwen(modelqwen3.7-flash, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlos.getenv(DASHSCOPE_BASE_URL) ) # 普通对话 result llm.invoke(你好我是计算机王) print(result) # 流式输出 # for chunk in llm.stream(请告诉我一个笑话): # print(chunk.text, end, flushTrue) # 批次对话-并行调用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( modelqwen3.7-flash, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlos.getenv(DASHSCOPE_BASE_URL), # 值为False表示关闭思考值为True表示开启思考默认开启思考 enable_thinkingFalse ) # 普通对话 result llm.invoke(你好我是计算机王) print(result) # 流式输出 # for chunk in llm.stream(请告诉我一个笑话): # print(chunk.text, end, flushTrue) # 批次对话-并行调用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( modelqwen3.7-flash, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlos.getenv(DASHSCOPE_BASE_URL), enable_thinkingTrue, thinking_budget10 ) # 普通对话 result llm.invoke(你好我是计算机王) print(result) # 流式输出 # for chunk in llm.stream(请告诉我一个笑话): # print(chunk.text, end, flushTrue) # 批次对话-并行调用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( modeldeepseek-r1:14b, ) result llm.invoke(你好我是计算机王) print(result) # 使用本地嵌入模型 embeddings HuggingFaceEmbeddings(model_namerE:\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( modelqwen3.7-flash, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlos.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(fTool: {tool_call[name]}) print(fArgs: {tool_call[args]})多模态调用如下图红框可以看到 qwen3.7-flash 模型是支持文本、图片、视频、音频的传递就是说这个qwen3.7-flash 模型可以识别文本、图片、视频、音频这就是多模态这里的实例是让大模型识别图片图片内容如下是一个大熊猫效果图识别出来图片内容代码传递URLfrom langchain_qwq import ChatQwen from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 初始化模型 llm ChatQwen( modelqwen3.7-flash, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlos.getenv(DASHSCOPE_BASE_URL) ) # 传递图片的入参 message { role: user, content: [ {type: text, text: 描述这个图像的内容}, {type: image, url: https://bkimg.cdn.bcebos.com/pic/2e2eb9389b504fc2ef3eb893ebdde71191ef6dc6?x-bce-processimage/format,f_auto/quality,Q_70/resize,m_lfit,limit_1,w_536}, ] } response llm.invoke([message]) print(response)如下图除了传递URL还是传递图片的base64
返回列表