Qwen2.5-VL-7B-Instruct实现VLOOKUP跨表匹配:智能表格处理教程

核心内容摘要

C# 上位机 + YOLO在车载监控场景中实现行车道检测 + 障碍物检测** 的完整工业级实战代码与指南
Steam交易卡片自动化挂卡:3步解决时间成本优化方案

实测FLUX.小红书V2:纯本地推理的惊艳效果展示

智能体中的静态模型静态模型Static Model是智能体中最基础的模型配置方式指在创建智能体时一次性完成模型初始化且在整个智能体执行过程中如工具调用、对话交互模型参数保持不变。

适用于绝大多数常规场景不需要动态切换模型能力的任务如固定用一个模型处理计算、查询等工具调用对模型稳定性要求高的场景避免中途切换模型导致的逻辑断层快速搭建智能体原型简化配置聚焦功能实现。

from langchain.agents import create_agent from langchain_core.messages import HumanMessage,SystemMessage from langchain_ollama import ChatOllama # 初始化大模型 llm ChatOllama( modelqwen3:4b, base_url http://

127.

0.

1:11434, temperature

7, ) # 创建智能体 agent create_agent( model llm, ) messages [ SystemMessage(content你是一个助手你需要根据用户输入的指令进行操作), HumanMessage(content给我出一道小学题目) ] # 执行智能体 res agent.invoke( input {messages:messages} ) # 打印结果 print(res)智能体中的动态模型动态模型Dynamic Model指在智能体运行过程中根据实时上下文如对话长度、任务复杂度、用户需求自动切换模型而非固定使用单一模型。

适用于需要灵活适配不同场景的任务对话初期用轻量模型成本低、速度快复杂对话切换到高级模型能力强简单查询用通用模型专业领域任务如代码生成切换到专项模型成本敏感场景避免“杀鸡用牛刀”仅在必要时启用高价模型。

from langchain_ollama import ChatOllama from langchain.agents import create_agent from langchain.agents.middleware import wrap_model_call, ModeRequest, ModeResponse from langchain_core.tools import tool #

定义两个不同能力的模型本地Ollama模型 light_model ChatOllama( modelqwen3:4b, base_url http://

127.

0.

1:11434, temperature

7, ) advanced_model ChatOllama( modeldeepseek-r1:

5b, base_url http://

127.

0.

1:11434, temperature

7, ) #

定义工具示例简单加法计算 tool def add(a: int, b: int) - int: 计算两个整数的和输入参数仅支持整数类型 return a b # 整理工具列表 tools [add] #

创建动态模型选择中间件核心运行时根据条件切换模型 wrap_model_call def dynamic_model_middleware(request: ModeRequest, handler) - ModeResponse: # 从请求状态中获取对话消息数量默认空列表避免索引错误 message_count len(request.state.get(messages, [])) # 切换逻辑消息数 3 时使用进阶模型否则使用轻量模型 if message_count 3: request.model advanced_model print(f【模型切换提示】已切换到进阶模型当前对话消息数{message_count}) else: request.model light_model print(f【模型使用提示】使用轻量模型当前对话消息数{message_count}) # 继续执行后续请求处理流程 return handler(request) #

创建智能体注入动态模型切换中间件默认指定轻量模型 agent create_agent( modellight_model, # 初始默认模型 toolstools, middleware[dynamic_model_middleware] # 注入自定义中间件实现动态切换 ) #

模拟多轮对话测试验证模型切换功能 if __name__ __main__: print( 开始多轮对话测试 ) for i in range(

: current_num 2 * (i

print(f\n第 {i 1} 轮提问3 加 {current_num} 等于多少) # 构造对话输入传递模拟的对话历史 response agent.invoke( input{ messages: [{role: user, content: f历史问题{i}} for i in range(i

] } ) # 输出智能体回答结果 print(回答, response[messages][-1].content) print(\n 多轮对话测试结束 )智能体中的工具定义工具是智能体与外部世界交互或执行具体任务的核心载体通过定义工具智能体可以突破自身能力限制如无法直接计算、获取实时数据、操作文件等完成复杂任务。

适用于所有需要智能体“动手做事”的场景数据处理类计算数值、解析文本、统计信息信息查询类获取实时天气、查询数据库、调用API接口操作执行类发送邮件、生成文件、控制设备需权限控制。

from langchain.agents import create_agent from langchain_core.tools import tool from langchain_ollama import ChatOllama # 定义工具减法计算简单数学工具 tool def subtract(a: int, b: int) - int: 计算两个整数的差a - b 参数 a被减数整数 b减数整数 返回 差整数 print(f调用减法工具{a} - {b}) return a - b # 定义工具查询城市人口模拟数据查询工具 tool def get_city_population(city: str) - str: 查询指定城市的常住人口模拟数据 参数 city城市名称如北京/上海 返回 人口信息字符串如北京市常住人口2184万 print(f调用查询城市人口工具{city}) # 模拟数据查询实际场景需替换为真实API/数据库调用 population_db { 北京: 约2184万, 上海: 约2487万, 广州: 约1881万 } return f{city}常住人口为{population_db.get(city, 暂未收录)} # 定义工具列表 tools [subtract, get_city_population] # 定义大模型 llm ChatOllama( modelqwen3:4b, base_urlhttp://localhost:11434 ) # 创建智能体 agent create_agent( modelllm, toolstools ) # 测试1调用减法工具 print(测试1调用减法工具400减35等于多少) result1 agent.invoke({ messages: [ {role: user, content: 400减35等于多少} ] }) print(result

print(\n - * 50 \n) # 测试2调用城市人口工具 print(测试2调用城市人口工具上海的常住人口有多少) result2 agent.invoke({ messages: [ {role: user, content: 上海的常住人口有多少} ] }) print(result2[messages][-1].content)

tool装饰器是什么必须使用tool装饰器标记函数LangChain 会自动解析函数的名称、参数、描述生成工具元数据并注册到智能体供大模型动态调用

文档字符串docstring增强工具文档字符串需包含参数含义、参数类型、返回值和使用场景这是智能体判断何时调用工具的关键依据例如get_city_population函数的文档说明 “查询城市人口”智能体在遇到人口相关问题时会自动调用

参数类型声明工具函数必须指定参数类型如a: int、city: str帮助智能体正确传递参数避免类型错误如果参数未指定类型需用typing模块定义如class UserInfo(NamedTuple): name: str; age: int

工具调用与分工工具应专注于单一任务如 “只做人口查询”避免复杂功能耦合如需多步骤操作建议拆分为多个工具避免修改现有工具

安全与权限控制涉及敏感操作如删除文件、调用支付 API的工具需添加权限校验逻辑例如if not has_permission(...):会直接拦截调用

扩展性原则新增工具只需用tool装饰并加入tools列表智能体就会自动识别无需修改智能体核心逻辑实现无缝扩展智能体中的异常处理当智能体调用多个工具时分散在每个工具内部的错误处理会导致代码冗余且难以统一管理错误格式。

通过wrap_tool_call装饰器创建工具调用中间件可集中拦截所有工具的执行异常统一返回格式化错误信息适用于多工具智能体避免重复编写错误处理逻辑需要标准化错误提示的场景如统一向用户返回“请检查输入”的友好提示需在错误发生时执行额外操作的场景如记录错误日志、触发告警。

from langchain.agents import create_agent from langchain_core.middleware import import wrap_tool_call from langchain_core.tools import import tool from langchain_core.messages import import ToolMessage from langchain_ollama import ChatOllama #

定义可能出错的工具除法计算内置异常处理 tool def divide(a: float, b: float) - float: 计算两个数的除法a / b参数为数字 return a / b # 除数为0会直接抛出异常 tools [divide] # 工具列表 #

创建工具异常处理中间件统一处理工具调用错误 def handle_tool_errors(request, handler): 拦截工具调用捕获异常并返回格式化的ToolMessage - request包含工具调用信息如工具名、参数、ID - handler继续执行原工具调用的函数 try: # 尝试执行工具调用 return handler(request) except Exception as e: # 捕获所有异常返回统一格式的错误消息 print(f捕获异常{str(e)}) return ToolMessage( contentf工具调用出错请检查输入是否正确错误详情{str(e)}, tool_call_idrequest.tool_call_id # 关联对应的工具调用ID ) # 配置大模型与智能体注入异常处理中间件 llm ChatOllama( base_urlhttp://localhost:11434, modelqwen3:4b ) agent create_agent( modelllm, toolstools, middleware[handle_tool_errors] # 添加中间件统一处理工具异常 ) # 测试1除数为0触发异常 print(测试1除数为0触发异常) result1 agent.invoke({ messages: [ {role: user, content: 10除以0等于多少} ] }) print(结果, result1[messages][-1].content) print(\n - * 50 \n) # 测试2参数为非数字触发类型错误 print(测试2参数为非数字触发类型错误) result2 agent.invoke({ messages: [ {role: user, content: 10除以三等于多少} ] }) print(结果, result2[messages][-1].content) print(\n - * 50 \n) # 测试3正常计算无异常 print(测试3正常计算无异常) result3 agent.invoke({ messages: [ {role: user, content: 6除以2等于多少} ] }) print(结果, result3[messages][-1].content)静态系统提示词静态系统提示词是在创建智能体时固定设置的指令用于定义智能体的角色、行为准则、回答风格等核心属性且在智能体整个生命周期内保持不变。

适用于需要智能体保持稳定行为模式的场景客服智能体需固定为“友好、耐心、使用口语化表达”代码助手需固定为“精准、简洁、提供注释说明”专业领域助手如法律、医疗需固定为“严谨、引用专业术语、注明信息仅供参考”。

from langchain.agents import create_agent, AgentExecutor from langchain_core.tools import tool from langchain_ollama import ChatOllama #

定义工具加法计算 tool def add(a: int, b: int) - int: 计算两个整数的和a b return a b tools [add] #

初始化模型 llm ChatOllama(modelqwen3:4b) #

创建智能体设置静默系统提示词 agent create_agent( modelllm, toolstools, # 静默系统提示词定义智能体行为准则 system_prompt你是一个计算助手请遵守以下规则\n

只回答计算相关的问题拒绝闲聊如“你好”“今天天气”等\n

运算必须简洁结果直接用数字或短字符串\n

全程使用中文。

) #

测试智能体验证提示词约束 agent_executor AgentExecutor(agentagent, toolstools, verboseFalse) print(测试1计算问题符合提示词) print(agent_executor.invoke({input: 3加5等于多少})[output], \n) # 应用验证动态提示词动态系统提示词是在智能体运行时根据实时上下文如用户角色、任务复杂度、对话阶段自动生成或修改的指令而非固定不变。

适用于需要智能体灵活适配不同场景的任务按用户角色调整对新手用通俗语言对专家用专业术语按任务复杂度调整简单任务简洁回答复杂任务详细拆解按对话阶段调整初期引导用户明确需求后期聚焦问题解决。

核心价值是让智能体的行为更贴合实时场景避免“一刀切”的固定响应模式。

from typing import TypedDict from langchain.agents import create_agent, AgentExecutor from langchain.agents.middleware import dynamic_prompt, ModelRequest from langchain_core.tools import tool from langchain_ollama import ChatOllama #

定义上下文 schema规范传递给中间件的上下文结构 class UserContext(TypedDict): user_role: str # 上下文字段用户角色beginner-新手/expert-专家 #

定义工具解释Python列表 tool def explain_python_list() - str: 返回Python列表的核心定义供智能体参考 return Python列表是可变、有序的元素集合用[]表示支持增删改查操作 tools [explain_python_list] #

创建动态提示词中间件核心基于用户角色生成提示词 dynamic_prompt def role_based_prompt(request: ModelRequest) - str: 根据用户角色动态生成系统提示词 # 从请求中获取上下文用户角色默认值为beginner user_role request.runnable_context.get(user_role, beginner) base_prompt 你是Python技术助手回答基于工具返回的信息且需严谨 # 按角色调整提示词 if user_role expert: base_prompt f{base_prompt}要求使用专业术语补充完整实现逻辑如列表的动态扩容机制简洁明了。

elif user_role beginner: base_prompt f{base_prompt}要求用生活化比喻避免专业术语给出

个简单示例语言通俗。

return base_prompt #

初始化模型与智能体注入中间件和上下文schema llm ChatOllama(modelqwen3:4b) agent create_agent( modelllm, toolstools, middleware[role_based_prompt], # 动态提示词中间件 context_schemaUserContext # 声明上下文结构确保参数合法 ) #

测试智能体传递不同用户角色观察动态提示词效果 agent_executor AgentExecutor(agentagent, toolstools, verboseFalse) # 测试1用户角色为新手beginner print(测试1用户角色为新手beginner) print(问题什么是Python列表) result1 agent_executor.invoke( {input: 什么是Python列表}, context{user_role: beginner} # 传递上下文新手角色 ) print(回答, result1[output], \n) # 测试2用户角色为专家expert print(测试2用户角色为专家expert) print(问题什么是Python列表) result2 agent_executor.invoke( {input: 什么是Python列表}, context{user_role: expert} # 传递上下文专家角色 ) print(回答, result2[output])智能体执行invokeinvoke 是 LangChain 智能体Agent的核心任务触发方法用于向智能体传递输入如用户问题、任务指令并执行流程最终返回结果。

适用于所有需要智能体完成具体任务的场景核心分为三类单次任务执行直接向智能体发起单个请求获取即时结果如“计算 35 ”“查询北京天气”多轮对话交互传递对话历史chat_history 或 messages让智能体基于上下文回应如连续追问“明天呢后天是否下雨”带自定义上下文的任务传递额外参数如用户角色、权限信息让智能体适配特定场景如“以新手身份解释 Python 列表”。

核心价值是统一智能体的任务触发入口无论简单 / 复杂任务、单轮 / 多轮交互均通过 invoke 实现标准化调用。

from langchain.agents import create_agent from langchain_core.tools import tool from langchain_ollama import ChatOllama #

定义基础工具加法计算 tool def add(a: int, b: int) - int: 计算两个整数的和a b return a b tools [add] #

初始化模型与智能体 llm ChatOllama( base_urlhttp://localhost:11434, modelqwen3:4b ) agent create_agent( modelllm, toolstools ) #

invoke 三种核心用法测试 print( 用法1单次任务执行无上下文 ) # 仅传递用户输入适用于单个独立任务 messages [ {role: user, content: 10加20等于多少} ] # invoke 方法的 input 参数为一个字典包含 messages 键值为消息列表重要 result1 agent.invoke({messages: messages}) print(结果, result1, \n) # 用法2带历史对话上下文 print( 用法2带历史对话上下文 ) list1 [ {role: user, content: 10加20等于多少}, {role: assistant, content: 10加20等于30} ] for item in list1: print(f类型{type(item)}内容{item[content]}) # 用法3获取最终回复内容 print(\n 用法3获取最终回复内容 ) final_result result1[messages][-1][content] print(最终结果, final_result)

www.17c-www.17c最新ios版N.6.31.35-绿软基地应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123