【SearchGPT】复刻GPT实时网页搜索&浏览功能

文章介绍了如何增强GPT-4的能力,使其能够通过SerperAPI进行实时网络搜索,获取最新信息,提升模型的时效性和相关性。开发者分享了如何集成BingAPI、爬取网页内容、语义搜索以及匹配引用来源的详细步骤。

0. 引言

GPT的知识库涉及领域丰富、涵盖范围广泛,但是一直有一定的实效滞后,例如最新的GPT-4知识更新截止于2023年4月。为了跨越这个限制,今年OpenAI相继为GPT-Plus的用户开放了接入网页搜索的插件,和GPT-4自主根据需求决定搜索网络信息的功能。例如,我们可以问GPT一些根据知识库无法回答的问题,例如波士顿明天的天气怎么样:

GPT执行搜索后的回答:

自此,GPT可以根据具体问题的需要来联网获取最新信息,增强模型对实时数据检索的相关性和时效性。这篇文章就是对GPT内置的这个功能的一个实现,并且比网页端 GPT 自带的网络浏览功能更加迅速。

你也可以把它视为一个对 new BingBard 的最小化的后端实现,一种搜索搜索引擎和AI问答的高度结合。

完整的代码可以查看:GitHub: SearchGPT如果喜欢的话欢迎给这个仓库点一个⭐️。

1. 主要功能

  • 1. 通过 Serper (Google API) 快速实时的网络搜索

  • 2. 根据输入自动调整网络搜索和回答语言

  • 3. 从多个网页中多线程提取主体内容,以降低embedding中token数量的花费

  • 4. 通过 OpenAI Embedding 和 ChromaDB 实现相关语义的搜索

  • 5. 大模型根据参考的网络信息生成回答

  • 6. 支持自定义模型AI的角色输出格式的要求

  • 7. 将大语言模型回答中带引用的句子源网站的标题、摘要和链接进行匹配

2. 总体架构

​​​​​​​

3. 运行效果

De

<think>我们有一个批处理脚本,其中包含一个if-else结构,用于判断某个路径是否存在,并根据判断结果执行不同的fastboot命令。 具体代码为: if exist "%~dp0image\P25A_GL" ( @echo zhenguo P25A_GL fastboot %* flash gpt %~dp0images\P25A_GL\Gpt_entry_ufs.bin || @echo "Flash gpt error" && pause && exit /B 1 ) else ( @echo zhenguo ELSE fastboot %* flash gpt %~dp0images\Gpt_entry_ufs.bin || @echo "Flash gpt error" && pause && exit /B 1 ) 解释如下: 1. `if exist "%~dp0image\P25A_GL"`:检查当前批处理文件所在目录(%~dp0)下的子目录`image\P25A_GL`是否存在。 - `%~dp0`:批处理文件中表示当前批处理文件所在目录的路径,并以反斜杠结尾。 - 所以,`%~dp0image\P25A_GL`就是当前批处理文件所在目录下的`image\P25A_GL`文件夹。 2. 如果该目录存在,则执行括号内的语句: - `@echo zhenguo P25A_GL`:打印文本“zhenguo P25A_GL”(可能是调试信息或标识特定分支) - `fastboot %* flash gpt %~dp0images\P25A_GL\Gpt_entry_ufs.bin`:执行fastboot命令,使用参数`%*`(表示传入批处理的所有参数),然后`flash gpt`后面跟着一个bin文件的路径(注意:这里路径是`images`而不是`image`,可能是笔误?或者有两个不同的目录?) - 注意:这里第一个分支使用的是`%~dp0images\P25A_GL\Gpt_entry_ufs.bin`,而第二个分支使用的是`%~dp0images\Gpt_entry_ufs.bin` - 如果fastboot命令执行失败(即返回非0错误码),则执行后面的错误处理: - `||`:表示如果上一条命令失败,则执行后面的命令。 - 后面的命令是:`@echo "Flash gpt error" && pause && exit /B 1` - 这里用`&&`连接,表示前面的命令成功才执行后面的,但因为我们是在错误处理,所以实际上当fastboot失败后,会执行: 1. 打印错误信息"Flash gpt error" 2. 暂停(pause),等待用户按任意键继续 3. 退出当前批处理,返回错误码1(/B表示退出当前批处理脚本,而不退出命令行窗口) 3. 如果该目录不存在,则执行else分支: - `@echo zhenguo ELSE`:打印文本“zhenguo ELSE” - 执行命令:`fastboot %* flash gpt %~dp0images\Gpt_entry_ufs.bin` - 注意,这里没有`P25A_GL`子目录,而是直接使用`images\Gpt_entry_ufs.bin` - 同样,如果命令失败,则执行同样的错误处理(打印错误、暂停、退出)。 需要注意的点: - 路径中的`image`和`images`:在if条件中检查的是`image\P25A_GL`,而执行fastboot时使用的是`images\...`。这可能是两个不同的目录。如果`image`目录存在但`images`目录不存在,那么即使进入了第一个分支,也会因为bin文件不存在而失败。同样,第二个分支也是使用`images`目录。所以这里的`image`(单数)和`images`(复数)可能是两个不同的目录,或者是一个笔误? 因此,该脚本的逻辑是: - 如果当前批处理文件所在目录下的`image\P25A_GL`文件夹存在,则使用`images\P25A_GL\Gpt_entry_ufs.bin`文件刷写gpt分区。 - 否则,使用`images\Gpt_entry_ufs.bin`文件刷写gpt分区。 - 刷写过程中如果出错,则打印错误信息,暂停并退出。 这个脚本可能是为了适配两种不同的设备(比如一种设备需要特定的GPT文件,而另一种使用默认的)而设计的。 根据以上分析,我们可以总结如下: 代码含义: - 该批处理脚本根据是否存在特定目录(%~dp0image\P25A_GL)来选择不同的GPT刷写文件,然后使用fastboot工具刷入设备的gpt分区。如果刷写失败,则中断脚本并提示错误。 注意事项: - 路径中使用了`image`和`images`,需要确保这两个目录都存在且包含正确的文件,否则即使目录判断正确,也可能因为文件路径错误而失败。 生成相关问题: - 批处理中`%~dp0`的含义是什么? - 如何理解fastboot命令中的`%*`? - 批处理中`||`和`&&`运算符的作用? - 为什么在if条件中检查`image\P25A_GL`而实际使用的bin文件在`images\...`路径下? - 如何确保批处理脚本在遇到错误时退出? - 批处理脚本如何判断一个目录是否存在? 下面按照要求生成回答。 </think>### 批处理脚本分析 以下是对您提供的批处理代码的逐层解析: #### 1. 路径判断逻辑 ```batch if exist "%~dp0image\P25A_GL" ( ... ) else ( ... ) ``` - `%~dp0`:表示当前批处理文件所在目录的完整路径 - **条件判断**:检查当前脚本目录下的 `image\P25A_GL` 文件夹是否存在 - **路径示例**: 若脚本位于 `C:\flash_tool\`,则检查路径为: $ \text{C:\flash_tool\image\P25A_GL} $ #### 2. 路径存在时执行的分支(if块) ```batch @echo zhenguo P25A_GL fastboot %* flash gpt %~dp0images\P25A_GL\Gpt_entry_ufs.bin || @echo "Flash gpt error" && pause && exit /B 1 ``` - **执行流程**: 1. 输出提示信息 `zhenguo P25A_GL` 2. 执行刷写命令: $ \text{fastboot [参数] flash gpt [路径]\images\P25A_GL\Gpt_entry_ufs.bin} $ 3. 错误处理链: - 若刷写失败(`||`),输出错误信息 - 暂停等待用户响应(`pause`) - 退出脚本并返回错误码 1(`exit /B 1`) #### 3. 路径不存在时执行的分支(else块) ```batch @echo zhenguo ELSE fastboot %* flash gpt %~dp0images\Gpt_entry_ufs.bin || @echo "Flash gpt error" && pause && exit /B 1 ``` - **执行流程**: 1. 输出提示信息 `zhenguo ELSE` 2. 执行备用刷写命令: $ \text{fastboot [参数] flash gpt [路径]\images\Gpt_entry_ufs.bin} $ 3. 相同的错误处理链 ### 关键语法解析 | 语法 | 作用 | |--------------|----------------------------------------------------------------------| | `%~dp0` | 获取当前脚本所在目录路径 | | `%*` | 传递调用脚本时输入的所有参数 | | `||` | 逻辑"或"运算符,前命令失败时执行后续命令 | | `&&` | 逻辑"与"运算符,前命令成功时执行后续命令 | | `exit /B 1` | 退出脚本并返回错误码1(`/B`表示不关闭CMD窗口) | ### 脚本设计意图 此脚本实现**智能设备刷写流程**: 1. **动态路径选择**:根据设备特定目录(P25A_GL)是否存在选择刷写文件 2. **错误防御机制**:确保刷写失败时立即停止并提示错误 3. **参数透明传递**:通过 `%*` 保留所有原始参数 4. **用户交互**:错误时暂停等待用户确认后再退出 ### 潜在优化建议 ```batch :: 优化方案:集中错误处理 set binFile=%~dp0images\Gpt_entry_ufs.bin if exist "%~dp0image\P25A_GL" ( set binFile=%~dp0images\P25A_GL\Gpt_entry_ufs.bin ) fastboot %* flash gpt %binFile% if errorlevel 1 ( echo 刷写GPT分区失败: %binFile% pause exit /B 1 ) ``` ### 相关问题 1. **`%~dp0` 在Windows批处理中有哪些变体?如何获取文件扩展名?**[^2] 2. **fastboot的flash命令支持哪些分区类型?如何验证刷写结果?** 3. **批处理中 `&&` 和 `||` 的优先级规则是什么?如何避免逻辑链错误?**[^3] 4. **如何实现批处理脚本的多级错误处理?不同错误码的最佳实践?** 5. **Windows批处理中如何安全处理带空格的路径?**[^1] [^1]: 关于路径处理的更多细节,可参考批处理变量扩展文档 [^2]: `%~dp0` 属于批处理的参数扩展语法,详见Windows命令参考手册 [^3]: 逻辑运算符优先级问题在实际脚本调试中常见,需特别注意执行顺序
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值