作为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.content

    print(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 = None

            if "icon"in searchResult:

                webIcon = searchResult["icon"]

            link = searchResult["link"]

            media = None

            if "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}"

            else:

                searchContent = f"{title} - {media}"

            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 网络搜索助手——网页搜索),略有修改。

本文示例完整源码参见源文件:

https://gitcode.com/gtyan/ISBN9787111782179/blob/main/Ch3/FunctionCallingWebSearch.py

AI网络搜索的更多相关文章

  1. 自动网络搜索(NAS)在语义分割上的应用(二)

    前言: 本文将介绍如何基于ProxylessNAS搜索semantic segmentation模型,最终搜索得到的模型结构可在CPU上达到36 fps的测试结果,展示自动网络搜索(NAS)在语义分割 ...

  2. 自动网络搜索(NAS)在语义分割上的应用(一)

    [摘要]本文简单介绍了NAS的发展现况和在语义分割中的应用,并且详细解读了两篇流行的work:DARTS和Auto-DeepLab. 自动网络搜索 多数神经网络结构都是基于一些成熟的backbone, ...

  3. 7.HBase In Action 第一章-HBase简介(1.2.1 典型的网络搜索问题:Bigtable的起原)

    Search is the act of locating information you care about: for example, searching for pages in a text ...

  4. 最值得一看的几条简单的谷歌 Google 搜索技巧,瞬间提升你的网络搜索能力

    可能你和我一样,几乎每天都必须与搜索引擎打交道,不过很多时候,你辛辛苦苦搜了半天也没找到合适的资料,然而“高手们”上来一眨眼功夫就能命中目标了.这并不是别人运气好,而是搜索引擎其实是有很多技巧可以帮助 ...

  5. 2013 ACM网络搜索与数据挖掘国际会议

    ACM网络搜索与数据挖掘国际会议" title="2013 ACM网络搜索与数据挖掘国际会议"> 编者按:ACM网络搜索与数据挖掘国际会议(6th ACM Conf ...

  6. AI 智能搜索 开源hanlp实现

    AI智能搜索 通过网络资源可知有很多种开源方式实现智能搜索,其中hanlp在GitHub中响应居高 参考链接: https://www.hanlp.com/ Java版:https://github. ...

  7. 干货 | 20多门AI网络课程资源(附链接+PDF)

    现如今,在火爆的人工智能领域,面临的最窘迫的问题是越来越庞大的产业规模和国家每年约500万的相关人才需求的矛盾.广阔的发展前景.巨大的人才缺口和令人心动的行业薪资,让越来越多的年轻人选择了进入这一行业 ...

  8. [MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载

    >目录< >——————————————————————< 1.建立工程  1.建立一个MFC工程,命名为Tao_Music 2.选择为基本对话框 3.包含Windows So ...

  9. 海康—SADP激活(设备网络搜索)

    海康sadp搜索工具(SADPTool)用于从网络上搜索同一网段内的所有在线设备.可以修改设备的缺省密码,修改网络IP地址及端口号 ,子网掩码及网关地址,IPV6地址网关地址,HTTP端口号和设备序列 ...

  10. 基于层级表达的高效网络搜索方法 | ICLR 2018

    论文基于层级表达提出高效的进化算法来进行神经网络结构搜索,通过层层堆叠来构建强大的卷积结构.论文的搜索方法简单,从实验结果看来,达到很不错的准确率,值得学习   来源:[晓飞的算法工程笔记] 公众号 ...

随机推荐

  1. SpringMVC处理请求源码分析

    一.先从Servlet案例说起 1.编写Servlet代码 2.配置web.xml(可选) 二.从DispatcherServlet说起 有Servlet基础的同学应该都知道,前端的每一个请求都会由一 ...

  2. 在线带壳屏幕截图工具推荐:MockUPhone

    简介 MockUPhone是一款免费的在线工具,用于生成带壳屏幕截图.这款工具主要面向开发者.设计师以及产品经理等人群,他们可以利用MockUPhone将UI设计或屏幕截图展示在各种不同类型的设备模型 ...

  3. github项目收集

    web模块 Nginx 监控模块vts: https://github.com/vozlt/nginx-module-vts

  4. Vue3+Ant-design项目启用ts/typescript

    Ant-design官方文档提供了js和ts两种案例,按照文档给项目install ant-design后写了个组件编译时发现只要加上`<script lang="ts"&g ...

  5. vue属性/子属性监听watch的几种方法

    特殊字符法 特殊字符+deep法 直接deep法 常规法 直接用如下代码示例吧: data(){ return { goBackHeader:'添加排班', scheduleForm:{ schedu ...

  6. 获取IP地址避免XFF攻击(使用nginx)

    //以下代码可以获取到客户端IP,但是可能会有XFF攻击,伪造IP地址 request.getHeader("x-forwarded-for"); 解决办法 //从Nginx中X- ...

  7. python-docx styles(样式)的用法

    doc=Document()#创建一个空白文档 p=doc.add_paragraph()#给文档增加一个段落 p.paragraph_format.space_before=Pt(0)#设置段落 段 ...

  8. java代码发起POST请求,并封装条件

    一.场景 不同的系统采用调用,这里我们是定时任务调用其他系统的接口获取数据并返回处理 二.代码 技术点: 发起Post请求 封装接口所需条件<key,vlaue> 将返回的{"c ...

  9. vue3 学习-初识体验-常见指令v-for和v-model

    继续通过小案例来体验一些常用的指令, 以经典的todolist进行展示. 首先呢通过 v-for 指令进行dom循环. v-for 通常是在循环dom的编写的同时遍历数据进行填充. <!DOCT ...

  10. C++项目属性配置Tips

    1.项目属性->VC++目录->包含目录 & 库目录 这里的"包含目录"."库目录"编辑之后是全局的: 2.项目属性->C/C++-& ...