dede 获取网站标题网站建设项目招标标书
dede 获取网站标题,网站建设项目招标标书,网络管理软件app,怎么做网络营销推广啊Nanbeige4.1-3B实战案例#xff1a;用600步工具调用构建智能Agent工作流
1. 引言#xff1a;当小模型遇上大智慧
你可能听过很多关于大语言模型的讨论#xff0c;动辄几百亿、上千亿参数#xff0c;听起来很厉害#xff0c;但部署成本高#xff0c;运行起来也费劲。今天…Nanbeige4.1-3B实战案例用600步工具调用构建智能Agent工作流1. 引言当小模型遇上大智慧你可能听过很多关于大语言模型的讨论动辄几百亿、上千亿参数听起来很厉害但部署成本高运行起来也费劲。今天我想跟你聊聊一个不太一样的模型——Nanbeige4.1-3B。这个模型只有30亿参数在动辄百亿千亿的模型世界里它算是个“小个子”。但别小看它这个小个子有个特别厉害的本事支持长达600步的工具调用。这是什么概念呢简单来说就是它能像人类一样把一个复杂的任务拆分成很多小步骤然后一步步去执行中间还能调用各种工具比如搜索、计算、写代码等最终完成任务。这恰恰是构建智能Agent智能体工作流最核心的能力。我最近用它搭建了几个实用的工作流效果让我挺惊喜的。这篇文章我就带你一起看看怎么用这个“小个子”模型玩转智能Agent解决一些实际的问题。2. 为什么选择Nanbeige4.1-3B在开始动手之前我们先搞清楚市面上模型那么多为什么偏偏选它来构建Agent2.1 核心优势专为工具调用而生很多模型都能做对话、写代码但专门为长序列工具调用优化的并不多。Nanbeige4.1-3B在这方面做了深度优化。600步的超长“记忆”这是它最突出的特点。普通的模型对话可能聊几句就忘了前面的内容或者执行几个步骤就乱了。600步意味着它能记住非常长的操作序列适合处理需要多步骤、多工具协作的复杂任务。3B参数的“轻量”优势30亿参数相比动辄70B、100B的模型它对硬件的要求友好得多。在我的测试环境单张RTX 3090上推理速度很快响应延迟很低这让构建实时交互的Agent成为可能。强大的指令遵循能力模型在训练时经过了很好的“对齐”能准确理解你的指令意图并严格按照你设定的格式比如JSON来调用工具减少了“胡言乱语”或格式错误的情况。2.2 它能做什么—— 智能Agent的典型场景基于这些能力我们可以用它来构建哪些工作流呢我举几个例子自动化数据分析助手你告诉它“分析一下上周的销售数据找出增长最快的三个品类并生成一个简要报告”。它会自动调用工具先读取数据文件然后进行计算和排序最后组织语言生成报告。智能客服工单处理用户描述一个技术问题Agent能自动判断问题类型调用知识库搜索解决方案如果解决不了还能按照预设流程生成升级工单。个性化内容创作流水线输入一个主题Agent可以调用搜索引擎收集资料然后根据你的风格要求比如“写一篇技术博客”、“生成一个短视频脚本”来创作内容。代码审查与优化助手提交一段代码Agent能调用代码分析工具检查语法和潜在bug甚至能根据最佳实践给出重构建议。简单说任何需要“思考-决策-行动”循环的任务都是它的用武之地。3. 环境搭建与快速启动理论说再多不如动手跑起来。这部分我们快速把环境搭好让模型先转起来。3.1 基础环境准备确保你的机器有Python和CUDA环境。我这里用Conda来管理比较干净。# 1. 创建并激活一个独立的Python环境 conda create -n nanbeige-agent python3.10 -y conda activate nanbeige-agent # 2. 安装核心依赖 # PyTorch (请根据你的CUDA版本选择这里以CUDA 11.8为例) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # Transformers 和加速库 pip install transformers4.51.0 accelerate0.20.0 # 我们还需要一个方便的Web界面来测试安装Gradio pip install gradio3.2 模型下载与加载模型已经预下载到了/root/ai-models/nanbeige/Nanbeige4___1-3B路径。我们写一个简单的加载脚本验证模型是否能正常工作。创建一个文件叫test_load.pyimport torch from transformers import AutoModelForCausalLM, AutoTokenizer # 指定模型路径 model_path /root/ai-models/nanbeige/Nanbeige4___1-3B print(f正在从 {model_path} 加载模型和分词器...) # 加载分词器需要信任远程代码因为模型可能有自定义结构 tokenizer AutoTokenizer.from_pretrained( model_path, trust_remote_codeTrue ) # 加载模型使用bfloat16精度以节省显存并自动分配到可用设备GPU model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, # 使用bfloat16兼顾精度和速度 device_mapauto, # 自动分配模型层到GPU/CPU trust_remote_codeTrue ) print(模型加载成功) print(f模型所在设备: {model.device}) print(f模型参数规模: {model.num_parameters() / 1e9:.1f}B) # 一个简单的测试对话 test_messages [ {role: user, content: 你好请用一句话介绍下你自己。} ] # 应用聊天模板将对话格式转换为模型能理解的token序列 input_ids tokenizer.apply_chat_template( test_messages, return_tensorspt # 返回PyTorch张量 ).to(model.device) # 移动到模型所在的设备 # 让模型生成回复 with torch.no_grad(): # 推理时不计算梯度节省内存 outputs model.generate( input_ids, max_new_tokens100, # 最多生成100个新token temperature0.7, # 创造性值越低越确定 do_sampleTrue # 启用采样使输出更多样 ) # 解码生成的token得到文本 response tokenizer.decode(outputs[0][len(input_ids[0]):], skip_special_tokensTrue) print(\n--- 模型回复 ---) print(response)运行这个脚本python test_load.py如果一切顺利你会看到模型加载成功的提示并收到一句自我介绍。恭喜你的模型已经就绪了4. 实战案例一构建一个多步骤查询Agent现在我们来点真格的。第一个案例我们构建一个能自动联网搜索并总结信息的Agent。这个Agent的工作流程是理解任务你提出一个需要查询的问题。规划步骤Agent决定需要调用“搜索工具”。执行搜索模拟这里我们用一个函数模拟搜索过程。总结信息Agent阅读“搜索”到的内容并整理成答案回复你。4.1 定义工具首先我们定义一个模拟的搜索工具函数。在实际应用中你可以替换成真正的搜索引擎API如SerperAPI、Google Custom Search等。# tools.py def search_web(query: str): 模拟网页搜索工具。 在实际应用中这里应调用真实的搜索引擎API。 print(f[工具调用] 正在搜索: {query}) # 这里模拟返回一些静态结果 mock_results { 什么是Python的GIL: 全局解释器锁GIL是CPython解释器中的一个机制它确保同一时刻只有一个线程执行Python字节码。这简化了内存管理但也限制了多线程程序的并行性能。, 如何学习深度学习: 学习深度学习可以从理解线性代数、概率论基础开始然后学习Python和PyTorch/TensorFlow框架最后通过实践项目如图像分类、自然语言处理来巩固。, 最近AI有什么新进展: 近期AI领域在多模态大模型、AI智能体Agent、代码生成以及更高效的小规模模型训练方面取得了显著进展。 } # 返回模拟中与查询最相关的结果 for key in mock_results: if query.lower() in key.lower(): return mock_results[key] return f未找到关于 {query} 的明确信息。4.2 构建Agent工作流接下来我们创建主Agent逻辑。核心是让模型学会在需要时“思考”并“调用工具”。# agent_web_searcher.py import torch from transformers import AutoModelForCausalLM, AutoTokenizer import json from tools import search_web # 导入我们定义的搜索工具 class WebSearchAgent: def __init__(self, model_path): self.tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) self.model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue ) # 定义工具列表告诉模型它可以使用哪些工具 self.tools [ { name: search_web, description: 在互联网上搜索信息用于回答需要最新或外部知识的问题。, parameters: { type: object, properties: { query: {type: string, description: 要搜索的关键词或问题。} }, required: [query] } } ] # 系统提示词用于引导模型行为 self.system_prompt f你是一个有帮助的AI助手可以调用工具来帮助用户。 你可以使用的工具如下 {json.dumps(self.tools, indent2, ensure_asciiFalse)} 当你需要调用工具时请严格按照以下JSON格式回应 {{ thought: 你的思考过程解释为什么需要调用工具。, action: 工具名称, action_input: {{query: 搜索关键词}} }} 工具调用完成后你会收到结果。请根据结果生成最终回复给用户。 如果问题不需要工具就能回答请直接回答。 现在开始与用户对话。 def process_query(self, user_query, max_steps5): 处理用户查询支持多轮工具调用。 conversation [ {role: system, content: self.system_prompt}, {role: user, content: user_query} ] for step in range(max_steps): print(f\n 步骤 {step 1} ) # 1. 将对话历史转换为模型输入 input_text self.tokenizer.apply_chat_template( conversation, tokenizeFalse, add_generation_promptTrue ) inputs self.tokenizer(input_text, return_tensorspt).to(self.model.device) # 2. 生成模型响应 with torch.no_grad(): outputs self.model.generate( **inputs, max_new_tokens256, temperature0.2, # 调低温度让工具调用格式更稳定 do_sampleTrue ) response_text self.tokenizer.decode(outputs[0][inputs[input_ids].shape[1]:], skip_special_tokensTrue) print(f模型原始响应:\n{response_text}) # 3. 尝试解析工具调用 try: # 查找JSON格式的工具调用 start_idx response_text.find({) end_idx response_text.rfind(}) 1 if start_idx ! -1 and end_idx ! 0: tool_call_str response_text[start_idx:end_idx] tool_call json.loads(tool_call_str) action tool_call.get(action) action_input tool_call.get(action_input) if action search_web: print(f检测到工具调用: {action}) # 执行工具 tool_result search_web(action_input[query]) print(f工具返回结果: {tool_result}) # 将工具结果加入对话历史 conversation.append({role: assistant, content: response_text}) conversation.append({role: user, content: f工具调用结果: {tool_result}}) # 继续循环让模型基于结果生成最终回复 continue except json.JSONDecodeError: print(响应不是有效的工具调用JSON。) # 4. 如果没有工具调用或解析失败则作为最终回复 conversation.append({role: assistant, content: response_text}) final_answer response_text break # 清理回复移除可能的JSON格式残留 if final_answer.startswith({): try: parsed json.loads(final_answer) final_answer parsed.get(thought, final_answer) \n 基于以上思考我直接回答您的问题。 except: pass return final_answer # 使用Agent if __name__ __main__: agent WebSearchAgent(/root/ai-models/nanbeige/Nanbeige4___1-3B) # 测试查询 queries [ Python的GIL是什么它有什么影响, 告诉我学习深度学习的路线。, 今天天气怎么样 # 这个问题可能触发搜索 ] for q in queries: print(f\n{*50}) print(f用户问题: {q}) print(f{*50}) answer agent.process_query(q) print(f\n最终答案:\n{answer}) print(f{*50}\n)运行这个脚本你会看到Agent的思考过程它先判断是否需要搜索然后“调用”搜索工具最后根据搜索结果生成答案。对于“今天天气怎么样”这种需要实时信息的问题它会尝试搜索对于知识性问题它可能直接利用已有知识回答。5. 实战案例二构建一个自动化数据处理Agent第二个案例更实用我们构建一个能自动读取数据、分析并生成可视化图表的Agent。这在数据分析的日常工作中非常有用。工作流程用户上传一个数据文件如CSV。Agent调用工具读取文件并理解数据结构。用户提出分析要求如“统计销量前五的产品”。Agent调用工具进行数据计算。Agent调用工具生成图表。Agent用文字总结分析结果。5.1 定义数据处理工具# data_tools.py import pandas as pd import matplotlib.pyplot as plt import io import base64 def read_csv_file(file_path: str): 读取CSV文件工具。 print(f[工具调用] 正在读取文件: {file_path}) try: df pd.read_csv(file_path) info { success: True, row_count: len(df), column_count: len(df.columns), columns: df.columns.tolist(), preview: df.head(3).to_string() } return info except Exception as e: return {success: False, error: str(e)} def analyze_data(file_path: str, instruction: str): 分析数据工具。根据指令进行简单分析。 print(f[工具调用] 分析数据指令: {instruction}) try: df pd.read_csv(file_path) result {} if 前五 in instruction or top in instruction.lower(): # 假设有一个sales列 if sales in df.columns: top5 df.nlargest(5, sales)[[product, sales]] result[top_5_products] top5.to_dict(orientrecords) elif amount in df.columns: top5 df.nlargest(5, amount)[[item, amount]] result[top_5_items] top5.to_dict(orientrecords) if 平均 in instruction or average in instruction.lower(): numeric_cols df.select_dtypes(include[number]).columns for col in numeric_cols: result[favg_{col}] df[col].mean() if 总和 in instruction or sum in instruction.lower(): numeric_cols df.select_dtypes(include[number]).columns for col in numeric_cols: result[fsum_{col}] df[col].sum() return {success: True, analysis: result} except Exception as e: return {success: False, error: str(e)} def plot_bar_chart(file_path: str, x_column: str, y_column: str): 生成柱状图工具。返回base64编码的图片。 print(f[工具调用] 生成图表: {x_column} vs {y_column}) try: df pd.read_csv(file_path) plt.figure(figsize(10, 6)) plt.bar(df[x_column].astype(str), df[y_column]) plt.xlabel(x_column) plt.ylabel(y_column) plt.title(f{y_column} by {x_column}) plt.xticks(rotation45) plt.tight_layout() # 将图片保存到内存缓冲区并转换为base64 buf io.BytesIO() plt.savefig(buf, formatpng) plt.close() buf.seek(0) img_base64 base64.b64encode(buf.read()).decode(utf-8) return {success: True, image_base64: img_base64} except Exception as e: return {success: False, error: str(e)}5.2 构建数据分析Agent这个Agent更复杂需要处理多工具协作和状态管理。# agent_data_analyzer.py import torch import json from transformers import AutoModelForCausalLM, AutoTokenizer from data_tools import read_csv_file, analyze_data, plot_bar_chart class DataAnalysisAgent: def __init__(self, model_path): self.tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) self.model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue ) self.current_file None # 记录当前正在分析的文件 self.tools [ { name: read_csv_file, description: 读取一个CSV格式的数据文件了解其结构和内容。, parameters: { type: object, properties: { file_path: {type: string, description: CSV文件的路径。} }, required: [file_path] } }, { name: analyze_data, description: 根据指令对已加载的数据文件进行分析如计算总和、平均值、排序等。, parameters: { type: object, properties: { file_path: {type: string, description: CSV文件的路径。}, instruction: {type: string, description: 分析指令例如‘计算销售总额’、‘找出销量前五的产品’。} }, required: [file_path, instruction] } }, { name: plot_bar_chart, description: 根据指定的列生成柱状图。, parameters: { type: object, properties: { file_path: {type: string, description: CSV文件的路径。}, x_column: {type: string, description: 作为X轴的列名。}, y_column: {type: string, description: 作为Y轴的列名。} }, required: [file_path, x_column, y_column] } } ] self.system_prompt f你是一个专业的数据分析助手。用户会给你数据文件和分析请求。 你可以使用以下工具 {json.dumps(self.tools, indent2, ensure_asciiFalse)} 请严格按照以下JSON格式调用工具 {{ thought: 解释你的思考。, action: 工具名, action_input: {{参数名: 参数值}} }} 一次只调用一个工具。工具返回结果后我会告诉你结果然后你决定下一步。 如果用户的问题不需要工具或所有工具步骤已完成请给出最终的文字回答。 现在开始。 self.conversation [{role: system, content: self.system_prompt}] def reset(self): 重置对话状态。 self.conversation [{role: system, content: self.system_prompt}] self.current_file None def run_agent(self, user_input, data_file_pathNone): 运行Agent处理用户输入。 if data_file_path: self.current_file data_file_path # 自动先读取文件 file_info read_csv_file(data_file_path) self.conversation.append({role: user, content: f数据文件路径是{data_file_path}}) self.conversation.append({role: user, content: f文件信息{json.dumps(file_info, ensure_asciiFalse)}。现在请回答{user_input}}) else: self.conversation.append({role: user, content: user_input}) max_turns 8 for turn in range(max_turns): print(f\n--- 第 {turn1} 轮交互 ---) # 生成模型响应 input_text self.tokenizer.apply_chat_template( self.conversation, tokenizeFalse, add_generation_promptTrue ) inputs self.tokenizer(input_text, return_tensorspt).to(self.model.device) with torch.no_grad(): outputs self.model.generate( **inputs, max_new_tokens300, temperature0.3, do_sampleTrue ) raw_response self.tokenizer.decode(outputs[0][inputs[input_ids].shape[1]:], skip_special_tokensTrue) print(f模型响应: {raw_response}) # 解析工具调用 tool_called False try: start raw_response.find({) end raw_response.rfind(}) 1 if start ! -1 and end ! 0: json_str raw_response[start:end] action_data json.loads(json_str) action action_data.get(action) action_input action_data.get(action_input, {}) # 根据工具名调用对应的函数 if action read_csv_file: result read_csv_file(action_input[file_path]) tool_result f文件读取结果: {json.dumps(result, ensure_asciiFalse)} elif action analyze_data: result analyze_data(action_input[file_path], action_input[instruction]) tool_result f数据分析结果: {json.dumps(result, ensure_asciiFalse)} elif action plot_bar_chart: result plot_bar_chart(action_input[file_path], action_input[x_column], action_input[y_column]) if result[success]: # 在实际应用中这里可以保存图片或返回给前端显示 tool_result f图表已生成Base64图像数据长度{len(result[image_base64])}。 else: tool_result f图表生成失败: {result[error]} else: tool_result f未知工具: {action} print(f工具调用结果: {tool_result}) # 将模型响应和工具结果加入历史 self.conversation.append({role: assistant, content: raw_response}) self.conversation.append({role: user, content: tool_result}) tool_called True except json.JSONDecodeError: print(响应不是有效的JSON视为最终回答。) if not tool_called: # 没有工具调用作为最终回答 self.conversation.append({role: assistant, content: raw_response}) final_answer raw_response # 简单清理移除可能残留的JSON标记 if final_answer.startswith({): try: parsed json.loads(final_answer) final_answer parsed.get(thought, 分析完成。) except: pass return final_answer return 已达到最大交互轮数分析可能未完全完成。 # 模拟使用 if __name__ __main__: agent DataAnalysisAgent(/root/ai-models/nanbeige/Nanbeige4___1-3B) # 假设我们有一个销售数据CSV文件 ‘sales_data.csv’ # 文件内容模拟 # product,sales,region # Product_A,1500,North # Product_B,2200,South # Product_C,1800,East # Product_D,3000,North # Product_E,1200,West print(场景分析销售数据) agent.reset() answer agent.run_agent( user_input请帮我找出销量最高的两个产品并计算总销售额。, data_file_pathsales_data.csv # 假设文件存在 ) print(f\n最终分析结果:\n{answer})这个Agent展示了如何串联多个工具。Nanbeige4.1-3B的600步长工具调用能力在这里派上了用场它可以规划一个完整的分析流程先读文件然后分析如果需要还能生成图表最后总结。整个过程可以包含很多个步骤而模型能很好地保持上下文连贯性。6. 进阶技巧与优化建议通过上面的案例你应该已经掌握了基本方法。这里再分享几个让Agent更稳定、更强大的进阶技巧。6.1 设计更好的系统提示词Prompt系统提示词是Agent的“大脑”设计得好坏直接影响效果。明确角色和规则一开始就告诉模型“你是一个数据分析助手”和“必须用JSON格式调用工具”。提供清晰的工具描述工具的名称、描述、参数都要写清楚让模型准确理解每个工具的用途。设定输出格式范例在提示词里直接给出一个完美的工具调用JSON例子模型会模仿得更好。分步引导对于复杂任务可以在提示词里暗示步骤比如“首先你需要读取文件了解结构然后根据用户请求进行分析...”。6.2 处理模型的“犹豫”和错误小模型有时会“犹豫不决”或者生成格式错误的JSON。降低Temperature在工具调用阶段将temperature参数调低如0.2减少随机性让输出更稳定、更符合格式。加入格式验证和重试代码里要有try...except来捕获JSON解析错误。如果解析失败可以把错误信息反馈给模型让它重试。可以设置一个小的重试循环比如3次。后处理清洗对模型的最终输出进行简单清洗移除可能残留的JSON标记或特殊符号。6.3 结合LangChain等框架虽然我们从头构建了Agent逻辑来理解原理但在实际生产中使用成熟的框架会更高效。LangChain它提供了完整的Agent、Tool、Chain抽象内置了大量工具能极大地简化开发。Nanbeige4.1-3B可以通过HuggingFace接口轻松接入LangChain。Transformers AgentsHugging Face官方也推出了Agents框架理念类似可以关注。一个简单的LangChain集成思路# 伪代码示例 from langchain.agents import initialize_agent, AgentType from langchain.tools import Tool from langchain_huggingface import HuggingFacePipeline # 1. 将Nanbeige模型包装为LangChain的LLM llm HuggingFacePipeline(pipelineyour_nanbeige_pipeline) # 2. 定义工具 tools [...] # 3. 初始化Agent agent initialize_agent(tools, llm, agentAgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verboseTrue) # 4. 运行 agent.run(分析一下这个数据文件...)6.4 性能与部署考量显存占用3B模型在bfloat16下约需6GB显存。对于复杂的多轮Agent交互注意监控显存使用。推理速度在RTX 3090上生成速度通常很快。如果追求极致延迟可以考虑量化如GPTQ、AWQ来进一步压缩模型。服务化部署可以使用FastAPI或Gradio将你的Agent封装成HTTP API或Web界面方便团队其他人使用。项目自带的webui.py和 Supervisor配置就是一个很好的起点。7. 总结通过这两个实战案例我们看到了Nanbeige4.1-3B这个“小身材”模型在构建智能Agent工作流上的“大能量”。它的核心优势——600步长工具调用支持——让它能够可靠地执行复杂的多步骤任务。我们来回顾一下关键点为什么选它轻量3B、高效、且专门为长序列工具调用优化是构建低成本、高性能Agent的理想选择。如何构建核心是定义好工具函数然后通过精心设计的系统提示词引导模型在需要时以结构化格式如JSON调用这些工具并根据结果决定下一步。能做什么从自动信息查询到智能数据分析任何需要按步骤执行、并能抽象成工具调用的任务都可以尝试用Agent来自动化。如何做得更好优化提示词、处理模型输出错误、结合成熟框架如LangChain并考虑最终的部署和服务化。AI Agent正在成为让大模型能力真正落地到具体业务的关键一环。Nanbeige4.1-3B以其在工具调用上的特长为我们提供了一个非常务实且高效的起点。你不妨也动手试试用它来自动化你工作中那些重复、多步骤的任务或许会有意想不到的收获。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。