ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

搜索自动化智能体建设的步骤

搜索自动化智能体建设的步骤 本文内容仅供校术原理讲解严禁用于未经投权的商业抓取。 手动筛选海量就业信息、反复修改自己的就业搜索要求、追踪进度等烦琐任务让大家应接不暇同时还容易遗漏优质机会。如果我们能够构建一个智能体来自动化这个过程将会怎样本文将从需求分析到系统实现从功能验证到效果评估探索智能体应用开发的完整过程。 这里将介绍一种强大的解决方案利用人工智能和浏览器自动化技术大幅简化你的搜索就业信息流程。我们将深入探讨一个基于browser-use库构建的Python脚本打造一个可自动搜索、分析、记录就业信息并辅助上传简历的智能体。这个智能体能够根据你的指令浏览网站、提取关键信息甚至与网页元素进行交互而这一切都由大语言模型驱动。主要目标如下自动化搜索和筛选数据分析相关职位。智能提取职位信息和技术要求。自动上传简历并填写申请表单。生成技术栈思维导图和求职分析报告。提高求职效率减少重复性工作。 技术框架 browser-use是本项目的核心组件它是一个专为智能体浏览器交互而设计的Python库。根据其GitHub页面的介绍该库通过集成大语言模型来实现智能化的网页操作。其核心特性如下。智能网页理解基于视觉和文本双重分析准确理解网页结构和内容语义。自然语言交互支持使用自然语言指令直接控制浏览器操作降低使用门槛。多模态感知融合视觉信息和文本内容实现更准确的页面元素识别和操作决策。动态适应性具备处理不同网站布局和交互模式的能力适应性强。智能容错内置异常处理和重试机制提高任务执行的稳定性和成功率。 除了核心的browser-use库该智能体还集成了以下主要组件。 LangChain:大语言模型集成框架负责对话管理和任务编排。 Google Gemini API:提供强大的自然语言理解和成能力。 PyPDF2:PDF文档处理库用于解析简历文件内容。 Pydantic:数据验证和序列化框架确保数据类型安全。 Playwright:底层浏览器控制引擎提供跨平台浏览器操作。 2.动作设计用户智能体的能力模块 controller.action(...)装饰器用于将Python函数暴露为browser-use智能体可以使用的工具。这些动作构成了智能体的核心能力。 class Job(BaseModel): title:str #职位名称 link:str #职位链接 company:str #公司名称 fit_score:float #与个人资料的匹配度评分脚本中定义但未完全实现评分逻辑 location: str | None None #工作地点 salary:str | None None #薪资范围 #动作1保存与读取职位信息 controller.action( save jobs to file with a score how well it fits to my profile, #动作描述供大语言模型理解 param_modelJob #指定参数模型 ) def save_jobs (job: Job): #将收集到的职位信息保存到jobs.csv with open(jobs.csv,a,newline,encodingutf-8) as f: writer csv.writer(f) writer.writerow([ job.title, job.company, job.link, job.salary, job.location ]) return Saved job to file #返回给 agent的执行结果信息 controller.action(Read jobs from file) #从文件读取已保存职位 def read jobs(): with open(jobs.csv) as f: # 从jobs.csv读取 return f.read() #动作2:读取简历内容 controller.action (Read my cv for context to fill forms) #读取简历内容以供填写表单 def read_cv(): #将PDF简历读取成文字内容供模型记忆与填写表单用 pdf PdfReader(CV) text for page in pdf.pages: text page.extract_text() or logger.info(f已读取简历包含{len(text)}个字符) #ActionResult的include in memoryTrue使简历内容可供agent后续步骤使用 return ActionResult (extracted_contenttext, include_in_memoryTrue) #动作3上传简历 controller.action( #动作描述更新以匹配新内容 (Upload cv to element call this function to upload if element is notfound, try with different index of the same upload element), ) async def upload_cv(index: int, browser: BrowserContext): #异步函数模拟用户上传简历 path str(CV.absolute()) dom_el await browser.get_dom_element_by_index(index) #通过索引获取DOM元素 if dom_el is None: return ActionResult(errorf在索引{index}未找到元素) #获取文件,上传DOM元素 file_upload_dom_el dom_el.get_file_upload_element() if file_upload_dom_el is None: logger.info(f在索引{index}未找到文件上传元素) return ActionResult(errorf在索引{index}未找到文件上传元素) file_upload_el await browser.get_locate_element ( file_upload_dom_el ) #定位元素 if file_upload_el is None: logger.info(f在索引{index}未找到可定位的文件上传元素) return ActionResult( errorf在索引{index}未找到可定位的文件上传元素 ) try: await file_upload_el.set_input_files(path) #设置输入文件(上传) msgf成功上传文件{path}到索引{index} logger.info(msg) return ActionResult (extracted_contentmsg) except Exception as e: logger.debug(fset_input_files 时发生错误(str(e)) return ActionResult(errorf上传文件到索引{index}失败) #动作4上传个人头像支持上传头像 controller.action( Upload profile picture to element, #上传个人头像到指定元素 ) async def upload_profile_picture(index: int, browser: BrowserContext): path os.path.join(os.getcwd(), profile_picture.png) #假设图片名称固定 if not os.path.exists(path): return ActionResult(errorf图片文件未找到{path}, is_doneTrue) valid_extensions [.jpg, .jpeg, .png, .gif, .bmp, .webp] _, ext os.path.splitext (path.lower()) if ext not in valid_extensions: return ActionResult( errorf无效的图片文件扩展名{ext}.必须是(valid_extensions)之一, is_doneTrue, ) logger.warning( 动作 upload_profile_picture 调用了 upload_file, 但此脚本中未定义该动作。若无通用的upload_file动作” 那么此部分可能无法按预期工作。” ) return await controller.execute_action( upload_file, {index: index, file_path: path} ) 此部分详细介绍了智能体的核心能力模块包括保存和读取职位信息读取简历内容以及上传简历和头像。 3.主任务入口与执行逻辑 这是配置和运行智能体的核心部分定义了任务目标与行动计划。 async def main(): #检查已分析的职位数量 total_applications 0 if os.path.exists (APPLICATION_STATS_FILE): try: with open(APPLICATION_STATS_FILE, r, encodingutf-8) as f: stats json.load(f) total_applications stats.get(total_applications,0) except Exception as e: logger.error(f读取“申请/分析”统计文件时出错{e)) logger.info(f当前已分析数据分析职位数量{total_applications}/10000) if total_applications 10000: logger.info(已达到目标分析数量(10000)任务完成) return #基础任务描述(ground_task)-定义任务目标与行动计划 ground_task ( 你是一个专业的AI求职助手专门为刚毕业的计算机相关硕士研究生提供求职支持。” 我是一名计算机相关硕士毕业生目标是在杭州地区寻找金融行业的相关职位。” 请帮我搜索并分析100个相关职位并创建技术栈思维导图。 \n\n以下是详细的指导原则\n 1.招聘网站搜索策略 -在 LinkedIn、 Indeec、 Glassdoor等主流招聘网站上搜索职位 -操作步骤:首先刷新网页,在搜索框中输入关键词,然后点击搜索按钮 -推荐搜索关键词合规分析师、KYC专员、客服专员、数据分析师” \n 2.职位信息提取要求 ”对于每个职位描述请提取以下完整信息 -职位名称 ”-公司名称 -工作地点(远程/现场/混合模式) -所需技能和技术要求 -经验要求 ”-职责描述 -薪资范围(如有明确标注) -职位链接” \n 3,目标地区和行业筛选” ”-优先地区杭州主要目标” ”-次选地区长三角其他城市” ”-目标行业证券、银行、支付等金融服务业” ”-目标岗位合规、KYC、客服等相关职位” \n 4.职位筛选标准” ”-薪资范围15000~20000人民币不追求过高薪资” ”-公司规模:优先考虑中小型公司(竞争相对较小)“ ”-经验要求3年左右工作经验的职位” \n 5.技术栈分析重点 特别关注并提取以下技术要求 -编程语言Python、JavaScript、SQL等 -AI/ML框架: TensorFlow、 PyTorch、 LangChain等 -API集成: OpenAI API、 claude API等 -云服务平台AWS、Azure、Google Cloud Platform -DevOps/MLOps工具 -数据库技术: MySQI、 PostgresQI、 MongoDB等 -Web开发框架: React、Vue、 Django等 \n 6.数据整理和分析 ”-将收集到的信息整理成结构化数据格式 ”-准备创建技术栈思维导图的基础数据 ”-分析不同职位之间的技术要求差异 -识别核心技能与可选技能 ”-记录所有找到的职位信息避免重复分析” \n 7.执行策略 ”-如果遇到任何技术障碍请灵活调整搜索策略 ”-保持搜索的系统性和全面性” f”-目标分析至少100个相关职位描述 f-当前进度已分析{total_applications}个职位 f-剩余目标还需分析{10000-total_applications}个职位 ) #账户信息(account_profile) account_profile \n8.账户登录和个人信息 ”-如果网站需要登录则优先使用Google账户登录” -LinkedIn个人资料链接[已隐藏] -联系邮箱[邮箱地址]example.com ”-用户姓名[用户姓名]” -联系电话[电话号码]” ”-所在地区[地理位置]” ”-简历文件将resume_template.pdf作为简历附件上传” \n ) #记忆指令(memory)-”提取职位名称、公司名称、技术要求等内容” memory_instructions (# Renamed to avoid conflict with memory module \n9.信息提取和记忆要求” ”对于每个职位描述请系统性地提取并保存以下信息” ”1.基本信息职位名称、公司名称、工作地点” ”2.技术要求所需技能和技术栈详细列出每一项” ”3.职业要求经验要求和具体职责描述” 4.薪酬信息:薪资范围(如有明确标注) ”5.申请渠道职位链接和申请方式” ”6.数据格式将这些信息整理成结构化格式” ”7.中文总结用中文总结每个职位的主要技术要求和核心职责” \n ) #行动指令( action) -在 LinkedIn、 Indeed等平台搜索关键词,采集数据 action_instructions (# Renamed to avoid conflict with memory module \n10.具体执行策略 搜索执行步骤 1.多平台搜索在不同招聘网站上搜索相关职位” 推荐搜索关键词包括” -数据分析师 -合规分析师” -KYC专员 -客服等专员” -AI助手开发工程师” -风险控制专员” 2.职位浏览对于每个职位点击查看详细描述” 注意仅浏览和收集信息暂不申请职位” 3.信息采集系统性地提取职位相关信息” \n 数据整理要求 1.技术栈分类将收集到的技术栈信息按类别划分” -编程语言类(Python、JavaScript、SQL等) -框架和库类(React、Django、TensorFlow等) -API和服务类( OpenAI API、云服务等) -工具和平台类(Git、Docker、Kubernetes等) 2.数据验证确保收集信息的准确性和完整性” 3.去重处理避免重复收集相同职位信息” \n 异常处理策略“ -如果遇到页面变更和元素识别问题则放弃当前页面” -返回搜索结果页面继续处理下一个职位” -保持程序持续运行如果任务未完成则重新执行” -必要时重新打开网页使用新的搜索关键词“ \n #反思指令(reflection) reflection_instructions (# Renamed \n11.错误处理和反思机制“ ”失败恢复策略“ ”-如果任务执行失败,则立即重新开始整个流程” ”-重新打开网页,重新输入搜索关键词” ”-不从之前的断点继续执行确保流程的完整性” \n” ”质量控制要求” ”-定期检查收集数据的质量和完整性” ”-验证职位信息的准确性和时效性” ”-确保技术栈提取的全面性和准确性 \n” ”持续改进机制” ”-根据搜索结果调整关键词策略” ”-优化信息提取的准确性和效率” ”-不断完善异常处理和错误恢复机制” \n
返回列表