一个由自然语言控制的智能网页浏览代理。

语言是人类发出和接收指令最自然的界面。与其编写容易因变更而失效的定制自动化或爬虫代码,创建和添加代理应该像写简单的英语一样简单。
pip install browserpilotOPENAI_API_KEY 设置为您自己的 API 密钥。使用方式相当简单(见下文)。
from browserpilot.agents.gpt_selenium_agent import GPTSeleniumAgent
instructions = """访问 Google.com
找到所有的文本区域。
找到第一个可见的文本区域。
点击第一个可见的文本区域。
输入"buffalo buffalo buffalo buffalo buffalo"并按下回车。
等待 2 秒。
找到所有指向维基百科的锚点元素。
点击第一个。
等待 10 秒。"""
agent = GPTSeleniumAgent(instructions, "/path/to/chromedriver")
agent.run()
更具挑战性(但也更有趣)的部分是编写自然语言指令。
如果您熟悉 Selenium 的工作原理和一般编程,会很有帮助。这是因为本项目使用 GPT-3 将自然语言翻译成代码,因此您应该尽可能精确。从这个角度看,它更像是使用 Copilot 编写代码,而不是与朋友交谈;例如,将事物称为 input 或 textarea(而不是"文本框"、"搜索框"),或者"写着'登录'的按钮"而不是"登录按钮"。有时,它也无法识别某些重要的特定词汇,因此最好将它们拆分成单独的行。与其说"找到所有可见的文本区域",不如说"找到所有文本区域",然后"找到第一个可见的文本区域"。
您可以查看 prompts/examples 中的一些示例来开始。
通过将指令包裹在 BEGIN_FUNCTION func_name 和 END_FUNCTION 中来创建"函数",然后通过以 RUN_FUNCTION 或 INJECT_FUNCTION 开头的行来调用它们。下面是一个示例:
BEGIN_FUNCTION search_buffalo
访问 Google.com
找到所有的文本区域。
找到第一个可见的文本区域。
点击第一个可见的文本区域。
输入"buffalo buffalo buffalo buffalo buffalo"并按下回车。
等待 2 秒。
获取页面上所有包含"buffalo"一词的锚点。
点击第一个链接。
END_FUNCTION
RUN_FUNCTION search_buffalo
等待 10 秒。
您也可以选择创建一个包含指令列表的 yaml 或 json 文件。通常,它需要有一个 instructions 字段,以及一个可选的 compiled 字段,其中包含处理后的代码。
参见 buffalo 维基百科示例。
您可以向 GPTSeleniumAgent 的构造函数传递一个 instruction_output_file 参数,它会输出一个包含 GPT-3 编译后指令的 yaml 文件,以避免重复支付 API 费用。
我设想有两种贡献方式。
prompts/ 中!在某个时候,我会制定文件夹命名约定和提交代码评估(安全性、准确性等)的协议。这对于不太熟悉编码的人来说是一个特别有吸引力的选择。InstructionCompiler 的基础指令中扩展能力列表,以及 (b) 在 GPTSeleniumAgent 中编写相应的方法。本仓库的灵感来源于 Yihui He、Adept.ai 和 Nat Friedman 的工作。特别是,使用的基本抽象和指令构建于 Yihui 的黑客马拉松代码之上。预处理 HTML 并使用 GPT-3 智能挑选元素的想法来自 Nat。
GPTSeleniumAgent 中的方法一一对应。截至目前,这些操作包括:env.driver,Selenium 网络驱动。env.find_elements(by='id', value=None) 查找并返回元素列表。env.find_element(by='id', value=None) 与 env.find_elements() 类似,但只返回第一个元素。env.find_nearest(e, xpath) 可用于定位另一个元素附近的元素。env.send_keys(element, text) 向元素发送 text。env.get(url) 访问 url。env.click(element) 点击元素。env.wait(seconds) 等待 seconds 秒。env.scroll(direction, iframe=None) 滚动页面。如果给定了 iframe 则切换到该框架。direction 可以是 "up"、"down"、"left" 或 "right"。env.get_llm_response(text) 向 AI 询问关于字符串 text 的问题。env.retrieve_information(prompt) 根据提示返回页面中的信息字符串。使用 prompt="Summarize:" 进行摘要。通过"retrieve"、"find in the page"或类似命令调用。env.ask_llm_to_find_element(description) 要求 AI 查找与描述匹配的元素。env.query_memory(prompt) 使用提示要求 AI 查询其(嵌入索引)记忆中的已浏览网页。通过"Query memory"调用。env.save(text, filename) 将字符串 text 保存到文件 filename。env.get_text_from_page() 返回页面中的自由文本。InstructionCompiler 将用户输入解析为语义连贯的操作块。Memory,使其能够综合理解所见内容。0.2.51
- 感谢 @rapatel0,您现在可以通过 Selenium Grid 远程运行 BrowserPilot。
0.2.42 - 0.2.44
- examples.py 和依赖项的小改动。
- 为大型 Llama Index 升级进行重构。
0.2.38 - 0.2.41
- 将 enable_memory 改为 memory_file,以便更好地控制内存命名。允许用户加载内存。
- 简化 get_text_from_page。
0.2.26 - 0.2.37
- 下定决心,将默认模型切换为 gpt-3.5-turbo。成本将大大降低!
- 同时修复了重试机制。之前实际上没有执行重试操作!
- 为 GPT-3.5 稍微调整了指令。
- 令人担忧的是,gpt-3.5-turbo 不断尝试导入模块。我手动移除了尝试导入模块的行。
- 兼容新的 Llama Index 更新。
0.2.14 - 0.2.25
- 添加选项以避免网站检测到机器人。
- 增加更多 OpenAI API 错误处理。
- 改进堆栈跟踪提示和其他一些提示。
- 添加"在视口中显示"的能力。
- 使 from browserpilot.agents import <agent> 成为可能。
- 使 find_element 和 find_elements 仅搜索显示的元素。
- 运行完成后保存内存。
- 添加滚动到顶部和底部的选项。
0.2.10 - 0.2.13
- 为 OpenAI 异常添加更多错误处理。
- 将所有嵌入查询改为使用 ChatGPT。
- 摆脱 nltk 依赖!可喜可贺。
- 扩展向 LLM 询问网页问题的最大令牌窗口。
- 修复 Memory 模块中尝试在 OpenAI API 密钥初始化之前访问它的问题。稍微修改提示。
- ❗️ 启用 ChatGPT 与 GPT Index 一起使用,以便我们可以使用 GPT3.5-turbo 查询嵌入。
0.2.7 - 0.2.9
- 在默认模型上摇摆不定。ChatGPT 在编写代码方面效果不佳,因为它对返回的内容过于自由发挥。
- 此外,我尝试稍微压缩了提示,因为它变得有点长。
0.2.4 - 0.2.6
- 为代理添加记忆(仍处于实验阶段且效果不佳)。添加截图元素的能力。
- 围绕版本控制和提示注入的错误修复。
0.2.3
- 将 chrome_options 移到更合理的位置。保持 yaml 文件整洁,你懂的?
0.2.2
- ChatGPT 支持。
0.2.1
- 支持通过字典加载指令。
0.2.0
- 🎬 一个 Studio CLI,帮助迭代测试提示!
- JSON 加载。
- 基本的 iframe 支持。
<0.2.0
- GPTSeleniumAgent 应该能够加载提示和缓存的成功运行(以 yaml 文件形式)。InstructionCompiler 应该能够将指令保存到 yaml。
- 💭 为代理添加摘要能力。
- 演示/测试需要它请求 LLM 综合在线读取内容的场景。
- 🚨 如果能找到一种方法将 HTML 页面的内容输入到 GPT-3 上下文窗口中,并让它可靠地从中挑选出特定元素,那就太好了!
本软件包使用 exec 在 Python 中运行来自 OpenAI API 的代码输出。这被认为是不安全的做法。因此,在使用本软件包时应格外小心。标准免责声明如下。
本软件按"原样"提供,不附带任何明示或暗示的担保,包括但不限于对适销性、特定用途适用性和非侵权性的担保。在任何情况下,作者或版权持有人均不对因使用本软件或与本软件的使用或其他方式相关的任何索赔、损害或其他责任承担责任,无论是在合同诉讼、侵权诉讼还是其他诉讼中。