AI网络搜索

作为AI应用程序开发人员在了解函数调用(Function Calling)特性调用本地函数时可能注意到列表型参数tools中每一个元素都携带有一个type值。而在大多数函数调用示例程序中,这个type值一直被设定为“function”,这意味着它还可能存在其他合法且有效的取值。本文的示例程序将尝试把这个值设定为“web_search”,顾名思义,此时这个工具应当是网页搜索器。

模型在训练过程中汲取海量语料数据,从而构建其深厚的知识储备。但是,这些用于训练的语料往往具有时效性,它们所反映的信息和知识是特定时间点的产物。随着时间的推移,新的信息、知识和观念层出不穷。因此,模型所掌握的内容逐渐变得陈旧,对于新出现的概念、事件和趋势,其了解程度可能会变得有限,甚至一无所知。

在需要获取较新资讯的场景中,为确保模型输出内容的时效性和准确性,应用程序有必要为其补充新鲜的信息。使用网页搜索器正是解决这个问题的一种高效且实用的手段。网页搜索器本质上就是利用网页搜索引擎快速抓取互联网上的最新信息,包括新闻报道、学术论文、社交媒体动态等,使用它能够为模型提供较新的资讯或模型所不知道的信息,使得模型的回复更具时效性和有效性。这样,基于生成式人工智能模型开发的应用程序就能够更好地理解和适应不断变化的信息世界。

网页搜索器从互联网上检索到相关信息后,模型会对这些信息进行整合,并将最终整合完成的内容反馈给应用程序。

网页搜索器的设定较为简单,在参数tools中添加一个type为“web_search”的工具,并将该工具的enable值设定为True以启用网络搜索功能即可。如果期望网页搜索器不仅提供整合完成的内容,还同时提供相关信息来源网页的详细信息(标题、URL、媒体名称等),则需要通过将web_search工具的search_result值设定为True。

基于以上说明,代码中参数tools的值设定如下:

def get_completion(messages, model="glm-4-plus"):response = client.chat.completions.create(model=model,messages=messages,temperature=0.01,  tool_choice="auto", tools=[{"type": "web_search","web_search": {"enable": True,"search_result": True,}}],)print(f"\nget_completion:{response}")return response

通过使用web_search工具检索到相关网页后,网页内容会被自动整合处理,这个过程应用程序无需进行任何额外操作,可以像与模型进行普通对话的程序一样,自然地继续进行后续的代码编写工作即可。当前示例程序被设计为在输出模型回复文本的末尾同时列出web_search工具所检索到的具体网页信息,以便必要时用户可以直接点击来源网页链接跳转到相应网页查看原文,因此应用程序要做更多的工作。

如前所述,使用web_search工具时,如果需要获得信息来源,需要将search_result设定为True,此时模型返回信息中将包含一个名为web_search的对象,它包含本次运行检索到的所有网页信息。示例程序通过对它进行遍历,并使用其中的标题、媒体名称及URL组合成超链接供用户点击查阅。

以下代码实现上述输出整合内容后再列出资讯来源的设想。

    response = get_completion(messages)content = response.choices[0].message.contentprint(f"\n综合结果:{content}\n")if (hasattr(response, "web_search") and response.web_search is not None):content = f"{content}\n\n*以下是消息来源:*\n"# 取得检索到的网页信息for searchResult in response.web_search:print(f"\nsearchResult=\n{searchResult}\n")webContent = searchResult["content"]webIcon = Noneif "icon"in searchResult:webIcon = searchResult["icon"]link = searchResult["link"]media = Noneif "media" in searchResult:media = searchResult["media"]title = searchResult["title"]print(f"\nwebConten={webContent}\nwebIcon={webIcon}\nlink={link}\nmedia={media}\ntitle={title}")if media is None:searchContent = f"[{title}]({link})"else:searchContent = f"[{title} - {media}]({link})"content = f"{content}\n{searchContent}\n"# 保存并显示已经完成的回复append_and_show("assistant", content) print(f"\n===END===\n")

此外,基于本示例程序的主要功能与目的,也需要设定消息列表中system消息的预设信息,以便模型知道应用程序意图。

    messages = [{"role": "system", "content": """你是一个具备网络访问能力的信息小助手,你应当先分析用户消息中的关键主题,然后优先使用网检索相关信息,然后根据搜索的结果给出回答。"""},{"role": "user", "content": prompt}]

至此,网络搜索助手主体代码部分完成,运行完成的网络搜索助手,输入相应提示词,可以看到模型输出综合整理后的信息及其相关资讯来源。如下图所示。

需要特别说明的是,上述示例程序基于智谱AI成功运行,但并非所有生成式人工智能模型都提供web_search工具供用户使用。在使用不支持web_search工具的模型时,可以采用函数调用方法自行实现这一功能。具体做法是将网络搜索功能封装在本地函数中,当模型识别出需要进行网络检索的需求时,通过调用这个封装函数在应用程序端执行检索操作,再将检索结果提交给模型,用于进一步分析和整理概括,并最终生成所需的搜索结果整合信息。事实上,各大搜索引擎都提供使用API进行搜索的能力,也有多个第三方检索平台或软件包对网络搜索提供API支持。采用通过第三方检索平台的方式获得网络搜索能力的示例将单独发文介绍,本文不再赘述。

使用上述本地函数调用方式获得的网络搜索能力不仅能实现本节示例程序网络搜索助手的功能,还可以根据具体应用场景对搜索过程进行优化和定制。而且由于搜索逻辑封装在本地函数,可以灵活地调整搜索引擎、设定查询参数,甚至必要时可对搜索结果数据进行预处理,进而提高搜索的有效性和准确性。

在具体实践中,需要网络搜索功能时,设计师与开发人员应当考虑当前所选用的模型服务平台是否提供web_search工具以及应用程序未来更换模型平台的可能性两个因素。同时从程序实现角度而言,如果平台兼容性优先,则应当尽量避免使用特定平台的特定功能;如果快速实现和功能效果优先,则应当尽量采用平台已提供的功能。最终需要综合多个因素完成设计决策。

本文摘录自《生成式AI应用开发实战:基于智谱AI和DeepSeek》第三章第四节(3.4 网络搜索助手——网页搜索),略有修改。

本书简介:新书《生成式AI应用开发实战》上市发售_生成式ai工具实战教材-CSDN博客 

本文示例完整源码参见源文件:  https://gitcode.com/gtyan/ISBN9787111782179/blob/main/Ch3/FunctionCallingWebSearch.py

光头颜说IThttps://gtyan.com/archives/category/ai

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88963.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

39.Sentinel微服务流量控制组件

雪崩问题 微服务调用链路中某个服务故障,引起整个链路中的所有微服务都不可用。 解决方案 1.超时处理:设置一个超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止的等待。(只能起到缓解作用,并不能从根本上解决问题) 2.舱壁模式:限定每个业务能使用的线程…

基于hadoop的竞赛网站日志数据分析与可视化(下)

【基于hadoop的竞赛网站日志数据分析与可视化(上)】讲解了如何用hadoop对数据进行初步处理,本篇主要讲解用python对结果数据进行可视化分析。 ------------------------------------------------------------------------------------------…

Python爬虫打怪升级:数据获取疑难全解析

一、引言 **​​​ 在大数据时代,数据就是价值的源泉。而 Python 爬虫,作为数据获取的得力助手,凭借 Python 简洁的语法和丰富强大的库,在众多领域发挥着重要作用。无论是电商领域的价格监测、市场调研中的数据收集,还是学术研究里的文献获取,Python 爬虫都能大显身手。…

基于R语言的极值统计学及其在相关领域中的实践技术应用

极值统计学就是专门研究自然界和人类社会中很少发生,然而发生之后有着巨大影响的极端现象的统计建模及分析方法;在水文、气象、环境、生态、保险和金融等领域都有着广泛的应用。一:独立假设下的极值统计建模 1.广义极值模型. 2.极小值的处理.…

前端面试十一之TS

TS 是 TypeScript 的缩写,是一种由微软开发的开源编程语言,它是 JavaScript 的一个超集,为 JavaScript 添加了类型系统和对 ES6 的支持。以下是关于 TypeScript 的详细介绍:一、特点类型系统:TypeScript 引入了类型注解…

Excel快捷键

Excel快捷键可以快速提高使用Excel的效率,下面将Excel快捷键进行整理汇总以备不时之需 标注颜色的为需要经常使用并可以显著提高效率的快捷键 Ctrl相关快捷键【Ctrl】【1】 显示【单元格格式】设置窗口,可以设置选中的格式【Ctrl】【2】 应用或取消加粗…

Windows 10/11安装WSL、Ubuntu、Docker Desktop

WSL,Windows Subsystem for Linux,是微软开发的轻量级虚拟机环境,允许用户在 Windows上运行完整的Linux内核和用户空间,适用于Windows的Linux子系统。能实现: 运行原生的Linux命令和程序(如apt&#xff0c…

React之旅-06 Ref

当你想让一个组件“记住”一些信息,但又不想这些信息触发新的渲染时,你可以使用 ref。使用 Ref 前,需要导入useRef,代码如下:import { useRef } from react;在您的组件内部,调用 useRef 并将您想要引用的初…

stm32-Modbus主机移植程序理解以及实战

目录一、背景二、代码理解(一)main()函数例程代码功能遇到的问题解决方式分析(二)eMBMasterPoll( void )函数例程代码1. 变量声明2. 协议栈状态检查3. 获取事件4. 事件处理(switch-case)4.1 EV_MASTER_READ…

c++判断文件或目录是否存在

#include<sys/stat.h>#include<fstream>#include<string>#include<stdio.h>#include<stdlib.h>#include<vector>#include<io.h>#include<iostream>bool IsFileGood(string strFileName, book bFile){if(bFile) \\文件{ifstrea…

Java设计模式之行为型模式(命令模式)

一、核心定义与设计思想 命令模式通过对象化请求&#xff0c;将操作的具体实现细节封装在命令对象中&#xff0c;使得调用者&#xff08;Invoker&#xff09;无需直接依赖接收者&#xff08;Receiver&#xff09;&#xff0c;仅需通过命令对象间接调用。这种设计支持以下能力&a…

大数据领域开山鼻祖组件Hadoop核心架构设计

一、Hadoop的整体架构 Hadoop是一个专为大数据设计的架构解决方案&#xff0c;历经多年开发演进&#xff0c;已逐渐发展成为一个庞大且复杂的系统。其内部工作机制融合了分布式理论与具体工程开发的精髓&#xff0c;构成了一个整体架构。 Hadoop最朴素的原理在于&#xff0c;它…

OneCode3.0 VFS分布式文件管理API速查手册

&#x1f4da; 前言&#xff1a;OneCode 3.0微内核引擎架构解析 在云原生与分布式系统日益普及的今天&#xff0c;文件管理系统面临着前所未有的挑战——海量数据存储、跨节点协同、多租户隔离以及弹性扩展等需求推动着传统文件系统向分布式架构演进。OneCode 3.0作为新一代企业…

UI前端与数字孪生结合实践探索:智慧物流的仓储自动化管理系统

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;传统仓储的 “效率黑洞” 与数字孪生的破局当仓库管理员在数万平的库房中…

使用layui的前端框架过程中,无法加载css和js怎么办?

这使用layui的前端框架过程中&#xff0c;无法加载css和js怎么办&#xff1f;里写自定义目录标题已经按要求下载并解压到指定位置了&#xff0c;但是感觉就是无法加载文件后台提示如下&#xff1a;那就我清理缓存当再次观察html页面时&#xff0c;发现页面最开始有两个< htm…

gitlab+TortoiseGit克隆生成ppk方式

1、第一步 2、第二步3、第三步4、第四步&#xff0c;如何使用这个ppk就可以了

VSCode中使用容器及容器编排docker-compose

前面笔者写了一篇博文&#xff1a;使用容器编排对go项目进行部署、调试&#xff0c;介绍了在Goland中如何使用容器&#xff0c;由于Goland的容器配置是可视化的&#xff0c;使用起来非常方便&#xff0c;VSCode中也有一个容器插件&#xff0c;但是笔者一直未使用过&#xff0c;…

深度学习入门:让神经网络变得“深不可测“⚡(二)

深度学习入门&#xff1a;让神经网络变得"深不可测" &#x1f9e0;⚡ 系列课程第二弹&#xff1a;深度学习的奇妙世界 前言&#xff1a;从浅到深的华丽转身 哈喽&#xff0c;各位AI探险家&#xff01;&#x1f44b; 欢迎回到我们的"让机器变聪明"系列课…

硅基计划2.0 学习总结 捌 异常与常用工具类

文章目录一、异常1. 防御性编程2. throw关键字3. throws关键字4. 捕获5. finally关键字二、自定义异常类三、常用工具类1. Date以及相关的类1. 创建时间&#xff08;基本弃用&#xff09;2. 捕获系统时间3. 获取当前年月日时分秒4. 日期加减5. 根据字符串创建日期6. 根据当前时…

2025-7-14-C++ 学习 排序(2)

文章目录2025-7-14-C 学习 排序&#xff08;2&#xff09;P1059 [NOIP 2006 普及组] 明明的随机数题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1说明/提示提交代码P1093 [NOIP 2007 普及组] 奖学金题目背景题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1输入…