世界杯视频直播网站,网站建设的文字用什么字体较好,服装订单接单网站,越秀网站建设优化在大模型与智能体日常使用场景层出不穷的今天#xff0c;作为一名不断学习的信息化数字化从业者#xff0c;我们可以实践一下AI Agent基本开发流程#xff0c;理论联系实践#xff0c;以加深我们对AI Agent的了解。
Chaiys同学基于一个实际业务场景详细描述了AI Agent的开…在大模型与智能体日常使用场景层出不穷的今天作为一名不断学习的信息化数字化从业者我们可以实践一下AI Agent基本开发流程理论联系实践以加深我们对AI Agent的了解。Chaiys同学基于一个实际业务场景详细描述了AI Agent的开发实践案例可以用于熟悉RAG、工具调用、ReAct等概念可以体验LangChain和QwenAgent等AI Agent主流开发框架。一、、开发实践基于QwenAgent框架前文中我们使用LangChain框架实现了我们的智能体。下面让我们使用Qwen-Agent实现一版ReAct体验下流程具体的业务场景中需要根据需求调研后决定具体使用哪种方式。1.1. 什么是QwenAgentLangChain一个开源框架专为构建与大语言模型LLMs相关的应用设计通过集成多个API、数据源和工具助力开发者高效构建智能应用。它更像是AI应用开发的“行业标杆”和“基础设施”提供了模块化设计Chains、Agents、Memory、多模型兼容OpenAI、HuggingFace等以及强大的工具调用能力。Qwen-Agent由阿里巴巴团队优化的Agent框架特别针对中文场景和通义千问Qwen系列模型进行了深度优化。它更侧重于具体模型的落地应用尤其是在处理长文本、复杂推理和多轮对话方面表现出色。Qwen-Agent 开发框架支持 ReAct 范式Qwen-Agent 提供了 ReActChat 类来支持 ReAct 推理范式。这允许智能体像人类一样进行思考Reasoning、行动Taking Action例如调用工具和观察Observing 结果并循环此过程直至任务完成 。工作原理ReActChat 类继承自 FnCallAgent 类其内部通过 while 循环来管理多轮的工具调用和推理过程 。开发者通常不需要干预这个循环的具体次数。如何使用你只需要定义好必要的工具Tools并将它们分配给智能体。智能体会根据你的查询和系统指令自行决定是否需要以及如何通过 ReAct 循环来调用这些工具。关于迭代次数在 Qwen-Agent 的上下文中我们通常说的“迭代”指的是 ReAct 循环中模型调用工具并进行推理的轮次。自动控制这个迭代次数通常不需要开发者手动配置。它主要由底层的大语言模型LLM根据当前任务的复杂性、可用工具以及历史上下文来动态决定。模型会自主判断何时拥有了足够的信息来给出最终答案从而终止循环 。 2. 与训练迭代的区别需要注意的是这不同于模型训练阶段的超参“迭代次数”iterations/epochs。训练迭代指的是整个训练数据集被完整地用于更新模型参数的次数这在模型微调时需要配置 。但在 Qwen-Agent 框架中你通常直接使用预训练好的模型因此不涉及对此类训练迭代次数的配置。实用建议控制循环虽然不需要直接设置迭代次数但你可以通过优化提示词Prompt、工具描述的清晰度和准确性来引导模型更高效地进行推理和工具调用间接影响循环轮次接下来我们直接使用QwenAgent框架实现ReAct智能体模式。1.2.代码实践具体开发实现如下(agent_service_qwen.py)import sysimport jsonfrom qwen_agent.agents import Assistantfrom qwen_agent.tools import BaseToolfrom api_service import QueryService, SemanticServce, AnalysisService# 初始化服务queryService QueryService()semanticService SemanticServce()analysisService AnalysisService()# 自定义工具类classMatchMetadataTool(BaseTool): name match_metadata description 根据输入文本语义匹配表结构每次返回一个最相关的表结构。对于需要多表查询的问题需要多次调用此工具。 defcall(self, params, **kwargs) - str: table semanticService.hybrid_search(params, 1) returnf{[t[table_info] for t in table]}classExecuteSQLTool(BaseTool): name execute_sql description 执行SQL查询并返回结果。输入应为标准SQL语句。注意可能需要执行多个SQL查询来获取不同表中的数据。 defcall(self, params, **kwargs) - str: ifisinstance(params, str): jsonObj json.loads(params) ifsqlin jsonObj: params jsonObj[sql] ifqueryin jsonObj: params jsonObj[query] ifisinstance(params, dict): ifsqlin params: params params[sql] ifqueryin params: params params[query] if params.endswith(;): params params[:-1] return json.dumps(queryService.query_with_column(params))# 创建Agent实例agent Assistant( nameai_agent_assistant, llm{ model: qwen3:32b, model_server: http://localhost:11434/v1, }, system_message 你是一个数据分析助手负责帮助用户查询数据库信息。 请特别注意用户的问题可能需要从多个表中查询数据。 1. 首先确定需要查询哪些数据 2. 使用match_metadata工具分别匹配包含这些数据的表结构 3. 对每个表生成相应的SQL查询语句 4. 执行查询并汇总结果 5. 最后计算并给出答案 请确保逐步执行不要跳过任何步骤。 , function_list[MatchMetadataTool(), ExecuteSQLTool()],)defchat(user_query): print(执行方法chat) try: # 运行Agent messages [{role: user, content: user_query}] response_generator agent.run(messagesmessages) # 处理生成器响应 full_response start 0 end 0 for response in response_generator: # 检查响应类型并适当处理 ifisinstance(response, list): # 如果是列表提取内容 for item in response: ifisinstance(item, dict) andcontentin item: full_response item[content] end full_response.__len__() elifisinstance(item, str): full_response item end full_response.__len__() elifisinstance(response, dict) andcontentin response: full_response response[content] end full_response.__len__() elifisinstance(response, str): full_response response end full_response.__len__() print(f{full_response[start:end]}, end) start end print(f最终结果: {full_response}) return full_response except Exception as e: print(f执行过程中出错: {str(e)}) # 这里可以添加重试或更详细的错误处理逻辑 returnf错误: {str(e)}if __name__ __main__: args sys.argv[1:] ifnot args: print(请提供参数init或者chatuser_query) elif args[0] init: print(开始执行方法init) # 这里可以添加初始化逻辑 elif args[0] chat: print(fuser_query{args[1]}) chat(args[1]) else: print(f未知参数: {args[0]})依旧是和LangChain实现的ReAct同样的工具和提示词只是这次我们使用QwenAgent框架实现。1.3.测试结果多数据源RAG检索问题2016年考生人数和录取人数分别有多少运行python agent_service_qwen.py chat ‘2016年考生人数和录取人数分别有多少’,输出如下think好的用户问的是2016年的考生人数和录取人数。首先我需要确定这两个数据分别存储在哪个表里。可能有一个表记录考生信息另一个表记录录取情况。我需要先调用match_metadata工具来找到相关的表结构。先查考生人数输入“考生人数”看看匹配哪个表。假设返回的是enrollment表里面有year和candidates字段。然后查录取人数输入“录取人数”可能对应admissions表里面有year和admitted字段。接下来需要分别对这两个表执行SQL查询筛选出year为2016年的数据。执行第一个SQLSELECT candidates FROM enrollment WHERE year 2016; 得到考生人数。再执行第二个SQLSELECT admitted FROM admissions WHERE year 2016; 得到录取人数。然后把结果汇总给出两个数值。需要确保两个表的年份字段都是2016并且字段名正确。如果有多个表可能涉及可能需要进一步确认但这里假设两次匹配都正确。最后计算结果并呈现给用户。/think调用大模型llama2向量化{query:考生人数}自然语言混合检索字段成功匹配到的元数据信息[{表名:college_entrance_examination,表备注:考生人数与复读人数信息表包含字段高考年份(主键)、考生人数(万人)、复读人数(万人)考生人数是指参加高考的学生的数量复读人数是指参加高考的复读学生的数量,字段列表:[{字段名:examination_year,字段类型:int,字段备注:高考年份},{字段名:candidates_count,字段类型:decimal(10,2),字段备注:考生人数(万人)},{字段名:retake_count,字段类型:decimal(10,2),字段备注:复读人数(万人)}]}]好的用户的问题是关于2016年的考生人数和录取人数。首先我需要确认这两个数据分别存储在哪些表中。之前用户提到过“考生人数”我调用match_metadata工具后得到了一个表college_entrance_examination里面包含考生人数和复读人数但没有录取人数。这说明录取人数可能在另一个表里。接下来我需要再次调用match_metadata工具这次查询“录取人数”。输入关键词后应该会有对应的表结构返回比如可能有一个表叫college_admission包含录取人数字段。假设返回的表结构中有字段admission_count那么接下来需要分别对这两个表生成SQL查询语句。对于college_entrance_examination表SQL语句会是SELECT candidates_count FROM college_entrance_examination WHERE examination_year 2016; 这样可以得到2016年的考生人数。然后针对录取人数所在的表假设是college_admissionSQL语句可能是SELECT admission_count FROM college_admission WHERE admission_year 2016; 执行这两个查询后将结果汇总就能得到用户需要的两个数据。需要注意的是确保两个表的年份字段名称和类型正确避免因为字段名不同或数据类型不匹配导致查询错误。此外如果存在多个相关表需要确认哪一个包含正确的数据可能需要进一步的信息验证。最后将查询结果整理后用清晰的方式呈现给用户确保数据的准确性和可读性。/think调用大模型llama2向量化{query:录取人数}自然语言混合检索字段成功匹配到的元数据信息[{表名:college_entrance_admission,表备注:录取人数与普通高校数信息表包含字段录取年份(主键)、录取人数(万人)、招生高校数、本科录取人数(万人)、专科录取人数(万人)录取人数是指录取或者招收、招录的学生的数量,字段列表:[{字段名:admission_year,字段类型:int,字段备注:录取年份},{字段名:admission_count,字段类型:decimal(10,2),字段备注:录取人数(万人)},{字段名:university_count,字段类型:int,字段备注:招生高校数},{字段名:undergraduate_admission_count,字段类型:decimal(10,2),字段备注:本科录取人数(万人)},{字段名:specialty_admission_count,字段类型:decimal(10,2),字段备注:专科录取人数(万人)}]}]好用户需要知道2016年的考生人数和录取人数。首先我需要确定这两个数据分别存储在哪个表里。先处理考生人数。用户的问题中提到“考生人数”之前调用match_metadata工具时已经找到了对应的表college_entrance_examination。这个表的字段有examination_year、candidates_count和retake_count。所以考生人数应该从这个表中查询条件是examination_year等于2016。然后是录取人数。用户的问题里提到“录取人数”通过之前的工具调用发现了表college_entrance_admission。这个表里有admission_year和admission_count所以录取人数需要从这里查询同样条件是admission_year等于2016。接下来需要生成对应的SQL查询语句。对于考生人数SQL应该是SELECT candidates_count FROM college_entrance_examination WHERE examination_year 2016。而录取人数的SQL应该是SELECT admission_count FROM college_entrance_admission WHERE admission_year 2016。执行这两个查询后会得到两个结果可能都是小数因为字段类型是decimal。然后需要将这两个数字组合起来用万人单位并且四舍五入到合适的小数位数可能保留两位小数。比如如果查询结果分别是872.21万人和749.61万人那么最终答案就是考生人数872.21万人录取人数749.61万人。需要确认年份是否对应确保两个表的年份字段都正确匹配2016年。最后将结果用中文清晰地呈现给用户说明分别的数据并注明单位。/think执行SQLSELECT candidates_count FROM college_entrance_examination WHERE examination_year 2016[{candidates_count:940.0}]好的我需要回答用户关于2016年考生人数和录取人数的问题。首先用户已经通过两次match_metadata调用分别获取了考生人数所在的表college_entrance_examination和录取人数所在的表college_entrance_admission。接下来用户执行了第一个SQL查询从college_entrance_examination表中获取了2016年的考生人数结果是940.0万人。现在需要处理录取人数的部分。根据第二个match_metadata的结果录取人数在college_entrance_admission表的admission_count字段中且年份字段是admission_year。因此我需要构造另一个SQL查询从college_entrance_admission表中选择admission_count其中admission_year等于2016。执行这个查询后将得到录取人数的数据。最后把两个结果合并给出用户需要的答案。/think执行SQLSELECT admission_count FROM college_entrance_admission WHERE admission_year 2016[{admission_count:772.0}]好的用户问的是2016年的考生人数和录取人数分别是多少。我需要先找到这两个数据分别存放在哪个表里。首先用户的问题涉及到“考生人数”所以我调用了match_metadata工具参数是“考生人数”。返回的结果是college_entrance_examination表里面有考生人数的信息字段是candidates_count单位是万人。接着用户又问到“录取人数”于是再次调用match_metadata工具参数是“录取人数”得到的是college_entrance_admission表对应的字段是admission_count同样单位是万人。接下来我需要从这两个表中查询2016年的数据。先执行第一个SQL查询从college_entrance_examination表中选出examination_year等于2016年的考生人数结果得到940.0万人。然后执行第二个SQL查询从college_entrance_admission表中选出admission_year等于2016年的录取人数结果是772.0万人。确认两个结果都是2016年的数据后将这两个数值汇总得到最终答案2016年考生人数是940万人录取人数是772万人。需要确保单位正确并且数据没有错误。这里的数据看起来合理没有异常值所以可以确定答案正确。/think2016年的考生人数和录取人数分别为- **考生人数**940万人 - **录取人数**772万人 数据来源- 考生人数来自《考生人数与复读人数信息表》college_entrance_examination的 candidates_count 字段- 录取人数来自《录取人数与普通高校数信息表》college_entrance_admission的 admission_count 字段最终结果: think好的用户问的是2016年的考生人数和录取人数分别是多少。我需要先找到这两个数据分别存放在哪个表里。首先用户的问题涉及到“考生人数”所以我调用了match_metadata工具参数是“考生人数”。返回的结果是college_entrance_examination表里面有考生人数的信息字段是candidates_count单位是万人。接着用户又问到“录取人数”于是再次调用match_metadata工具参数是“录取人数”得到的是college_entrance_admission表对应的字段是admission_count同样单位是万人。接下来我需要从这两个表中查询2016年的数据。先执行第一个SQL查询从college_entrance_examination表中选出examination_year等于2016年的考生人数结果得到940.0万人。然后执行第二个SQL查询从college_entrance_admission表中选出admission_year等于2016年的录取人数结果是772.0万人。确认两个结果都是2016年的数据后将这两个数值汇总得到最终答案2016年考生人数是940万人录取人数是772万人。需要确保单位正确并且数据没有错误。这里的数据看起来合理没有异常值所以可以确定答案正确。/think2016年的考生人数和录取人数分别为- **考生人数**940万人 - **录取人数**772万人 数据来源- 考生人数来自《考生人数与复读人数信息表》college_entrance_examination的 candidates_count 字段- 录取人数来自《录取人数与普通高校数信息表》college_entrance_admission的 admission_count 字段QwenAgent框架也是和第三章的LangChain框架ReAct流程一样通过推理、观察、思考、行动完成了多数据源复杂问题的回答。把复杂问题拆分为简单问题、然后利用我们制定好的流程查出数据汇总输出二、展望本文AI Agent的实践过程中我们了解了es8作为外接知识库检索的基本使用方式(RAG)语义检索、数据查询、大模型分析的基本流程。了解了LangChain和QwenAgent框架的使用。进一步实践方向场景优化加入部分心仪的高校数据每个高校的每个专业在每个省份的招生情况丰富Agent知识提供更多更好的服务检索优化本文只使用了ES8内部向量类型支持的基本KNN检索利用余弦相似度计算分词计算混合得分后返回后续可以尝试其他高级检索方式。ReAct优化本文我们的ReAct实践只使用了LangChain框架的AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION模式可以实践其他模式效果流程优化本文我们的ReAct工具只有语义检索与数据查询两个没有涉及复杂计算加入高校信息需要做分段同环比计算需要加入新的流程使用新的工具流程比较简单作为学习使用场景丰富后可以进一步优化流程其他开发模式本文所列三种开发实践都是基于代码的模式还可以尝试用Dify、Coze Studio这类低代码工具来配置智能体。三、附录3.1. 开发环境核心工具与运行时 (Core Tools Runtimes)工具名称推荐版本说明操作系统macOS 15.6.1MacBook pro m1 max 32GBDocker Desktop28.3.2本地Docker环境Python3.9python实现我们的AI AgentIDE/编辑器VS Code / PyCharm开发工具项目依赖与服务 (Project Dependencies Services)服务名称版本端口说明Ollama0.11.611434大模型运行环境运行deepseek-r1:32b、qwen3:32b、llama2MySQL8.4.63306本地docker部署‘业务知识库’ElasticSearch8.19.09200本地docker部署支持向量存储、检索3.2. ES8检索为什么使用ES8ElasticSearch是一个开源的分布式搜索和分析引擎主要用于海量文本检索与分析使用 JSON 格式存储数据能通过简单的 REST API 进行交互便于集成。7.x之前的版本支持text(全文检索字段支持分词)、keyword(精确值字段适合过滤、聚合)、numeric、binary、date等传统的基本的数据类型字段。7.x之后引入dense_vector(向量类型存储浮点数密集向量如BERT、Word2Vec、Sentence Transformers 生成的向量维度dims必须提前定义声明无法修改)。从8.16版本之后新增对位类型bit0或1和字节类型byte以字节向量的支持通过element_type参数指定。默认float(4字节32位浮点数)。数据量较大时可指定byte或bit牺牲精度以节省存储空间。支持的量化类型7.3-7.4新增多种向量相似度计算方式如L2范数即欧几里得距离、点积、余弦相似度、最大内积适用于负值向量等。8.0正式支持近似KNN搜索API基于HNSW算法显著提升大规模向量检索效率存储成本大幅下降的同时保持较高的检索准确率。8.16扩展支持位(bit)和字节(byte)向量类型优化存储和计算效率示例{mappings:{ properties:{ my_vector:{// 字段名称 type:dense_vector, dims:768,// 和向量化使用的大模型的维度保持一致不一致插入与检索存在异常 index:true,// true时支持KNN搜索 element_type:byte,// int8一字节 index_options:{ type:int8_hnsw// int8 量化 HNSW 算法必须配置element_typebyte使用 } } }}}基于以上优点。对于Mysql的表结构我们需要将表字段存储到ES8做向量化对于用户输入的自然语言先进行语义检索匹配索引设计如下{ mappings:{ properties:{ table_info:{type:keyword}, nomic_embedding:{ type:dense_vector, dims:4096, index: True, similarity:cosine, } }}}table_info存储表结构信息nomic_embedding存储表备注向量化信息指定相似度检索算法为cosine余弦相似度。3.3. LangChain 常见 AgentType本文我们使用LangChain的AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION实现ReAct代理模式主要含义如下部分含义STRUCTURED_CHAT支持结构化输入如 JSON 格式的聊天式 Agent能处理复杂参数ZERO_SHOT不依赖于之前的记忆或历史步骤每一步都独立推理无“计划”缓存REACT使用 **ReAct 框架**Reason Act即“思考 → 决策 → 执行 → 观察”循环DESCRIPTION工具通过其特点✅ 支持多工具调用✅ 支持带参数的复杂工具如 SQL 查询带条件✅ 使用自然语言 结构化格式如 JSON进行工具调用✅ 适合需要 多步推理 参数传递 的场景如先语义解析再查数据库✅ 每次决策基于当前上下文重新推理zero-shot不依赖预定义流程其他类型AgentType说明是否支持多工具是否支持结构化输入是否支持 ReAct适用场景ZERO_SHOT_REACT_DESCRIPTION基础 ReAct Agent文本形式调用工具✅❌仅字符串✅简单工具链如计算器搜索STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION支持结构化参数的 ReAct Agent✅✅JSON 等✅复杂工具调用带参数CONVERSATIONAL_REACT_DESCRIPTION支持对话记忆的 ReAct Agent适合聊天机器人✅❌✅客服、对话式助手SELF_ASK_WITH_SEARCH使用“自问自答”机制 中间子问题分解✅有限❌❌复杂逻辑推理如维基搜索REACT_DOCSTORE基于文档存储的 ReAct如查找文档✅❌✅文档检索系统OPENAI_FUNCTIONS使用 OpenAI 的✅✅✅GPT-3.5-turbo / GPT-4 推荐OPENAI_MULTI_FUNCTIONS支持一次调用多个函数OpenAI 扩展✅✅✅高效批量工具调用本文说明本文因为太长所以分成三篇文章这是最后一篇后续酌情再针对本场景增加Dify等实现具体业务场景和其他两种方式参见之前文章。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】