转载自: 如何解决类ChatGPT生成的时效性问题:基于duckduckgo_search+GLM-6B路线的一个简单实验分析

在昨天CCF举办的《大语言模型时代的知识工程 | 4月4日TF97》中,老刘做了《浅谈大模型与知识图谱的结合:近期的几点方向探索与心得总结》为主题的演讲。‍

其中,知识图谱如何借助外部搜索引擎系统来提升大模型生成的时效性性能是知识图谱如何应用于大模型的一个典型例子。‍‍

一般的,外部搜索系统在解决时效性上有明显的优势,这个可为实时搜索提供丰富的上下文,微软最近推出的new Bing形态让人耳目一新,它在接入chatgpt后,还能够找到最新的数据开源,以解决时效性问题,并给出链 接,虽然回答中事实性存在错误,但通过链接可以进行人工核查,以解决事实性错误问题。

例如,引入实体链接,增强实时搜索相关性,提升query命中率,引入搜索结果,丰富上下文,以此作为输入,增强生成准确性。

因此,本着实践与理论相结合的原则,我们来做下实验,介绍搜索引擎基座:duckduckgo_search,将duckduckgo_search实时结果接入GLM6B进行生成,并供大家一起参考。

整个实现思路,很朴素,但核心就两个半,一个是底层大模型,另一个是实时搜索。还有半个,是对应的prompt。

一、搜索引擎基座:duckduckgo_search

DuckDuckGo是一个互联网搜寻引擎,DuckDuckGo强调在传统搜寻引擎的基础上引入各大Web 2.0站点 的内容。其办站哲学主张维护使用者的隐私权,并承诺不监控、不记录使用者的搜寻内容,其提供ddg_suggestions直接获取词语联想、ddg_translate直接中英翻译、duckduckgo_search直接搜索网页、ddg_news直接搜索新闻等多个功能。

地址:https://github.com/deedy5/duckduckgo_search

1、安装

pip install -U duckduckgo_search  

2、ddg_suggestions直接获取词语联想

>>> from duckduckgo_search import ddg_suggestions  
>>> ddg_suggestions("马克龙")  
[{'phrase': '马克龙穿运动鞋现身伦敦被指不和谐'},   
{'phrase': '马克龙赢得总统选举 发表胜选演讲'},  
{'phrase': '马克龙竞选拍照钱想报销被拒'},   
{'phrase': '马克龙希望德尚继续执教国家队'},   
{'phrase': '马克龙被兴奋庆祝的球员晾在一边'},   
{'phrase': '马克龙将在g20峰会后致电普京'},  
{'phrase': '马克龙晒姆巴佩吉鲁比赛照'},  
{'phrase': '马克龙支持将堕胎权写入法国宪法'}]  


3、ddg_translate直接中英翻译

>>> from duckduckgo_search import ddg_translate  
>>> ddg_translate("中国有多少人口", to='en')  
[{'detected\_language': 'zh-Hans', 'translated': 'How much population is China', 'original': '中国有多少人口'}]  

4、duckduckgo_search直接搜索网页

>>> from duckduckgo_search import ddg  
>>> r = ddg("马克龙、冯德莱恩访华", max_results=5)  
>>> for page in r:  
...     print(page)  
...   
{'title': '马克龙已抵达!此次和冯德莱恩一同访华,三大看点引关注 ...',  
'href': 'https://new.qq.com/rain/a/20230405A05NNX00',   
'body': '应国家主席习近平邀请,马克龙将于4月5日至7日对中国进行国事访问。 这是马克龙就任法国总统后第三次到访中国,也是他第二任总统任期内首次访华。 图片来源:央视新闻截图 据了解,法国总统马克龙与欧盟委员会主席冯德莱恩4月5日至7日访问中国。'}  

{'title': '蓝厅观察丨马克龙 冯德莱恩一同访华 三大看点引关注|马克龙 ...',   
'href': 'https://news.sina.com.cn/c/2023-04-05/doc-imypimne9332490.shtml',  
'body': '法国总统马克龙与欧盟委员会主席冯德莱恩4月5日至7日访问中国。外界注意到,近期欧洲领导人纷纷来华,其中包括德国总理朔尔茨、欧洲理事会 ...'}  
{'title': '马克龙、冯德莱恩今日访华,中欧关系"再确认"有何意义|欧盟 ...',   
'href': 'https://news.sina.com.cn/c/2023-04-05/doc-imypimne9316243.shtml',  
'body': '欧盟对华政策的"再平衡" 马克龙和冯德莱恩的访问将最近一段时间中欧之间的高层互动推向了一个小高潮。此前德国总理朔尔茨、西班牙首相 ...'}  
{'title': '马克龙、冯德莱恩同期访华,罕见外交安排有何看点?\_腾讯新闻',   
'href': 'https://new.qq.com/rain/a/20230404A09OO000',  
'body': '另外,经中欧双方商定,欧盟委员会主席冯德莱恩也将于同期访华。 作为世界两大力量、两大市场、两大文明,中欧之间的互动格外令外界关注。 有专家指出,此次欧洲大国元首和欧盟主要机构领导人同时开启中国之行,一定程度上打破了外交惯例,是较为罕见的外交安排。'}  
{'title': '法国总统马克龙、欧盟委员会主席冯德莱恩将访华 中方介绍 ...',  
'href': 'https://www.chinanews.com.cn/gn/2023/04-03/9983460.shtml',  
'body': '当天另有记者提问:中方发布了欧盟委员会主席冯德莱恩将访华的消息。中方如何看待当前中欧关系?对此访有何期待? 毛宁:今年是中国和欧盟建立全面战略伙伴关系20周年。中欧关系健康稳定发展符合双方共同利益,有利于世界和平稳定。'}  

>>>   


5、ddg_news直接搜索新闻

>>> from duckduckgo_search import ddg_news  
>>> ddg_news("张继科事件", safesearch='Off', time='d', max_results=5)  
[  
{'date': '2023-04-05T08:31:00', 'title': '跨境赌博是否违法?张继科事件可能还会牵扯出新犯罪案件', 'body': '刷屏的张继科事件可能还有后续。近日,《中央政法委长安剑》公众号发文评论"张继科事件"时提出三点要查清:有没有违法犯罪、有没有人造谣诽谤、有没有人浑水摸鱼。 "债主"是否凭私密视频敲诈勒索涉事女星、张继科是否构成敲诈勒索共犯等话题,这几天已有法律界人士进行了详细分析。值得注意的是,还有媒体曝出:张继科疑似在境外参赌时,曾与多位大陆明星同框。 第一,如果仅仅是赶赴当地赌场参与赌博活动,只要赌博行为符合', 'url': 'https://news.southcn.com/node\_cde6f9580c/0631a300f0.shtml', 'image': 'https://nfassetoss.southcn.com/\_\_asset/a05caa1145/b28799b782.jpg', 'source': '南方网'},  
{'date': '2023-04-05T07:50:00', 'title': '张继科事件曝光后,景甜人气不跌反升,磨炼让她浴火重生', 'body': '今年4月的第一场闹剧,来自"奥运冠军"张继科。有记者爆料,张继科因赌博欠钱,拿前女友景甜的私密视频抵债。债主以此勒索景甜,被判刑7年,目前仍在服刑。 张继科否认后,记者又曝光了有他签名的借款合同。还有更多证据指出,他曾多次涉赌。虽然目前真相尚未有定论,但多家品牌都已删除张继科代言的相关内容,安踏更是直接宣布终止与他的所有合作,多位大V也都在网络表态。 作为案情女主角,连续多日,景甜反反复复被看客拉', 'url': 'https://new.qq.com/rain/a/20230405A039V200', 'image': 'https://inews.gtimg.com/om\_bt/O5P0jzPW8JwyKwILjzast4dZe1TrIr-R\_tuQVcLS-jH2QAA/1000', 'source': '腾讯网'},   
{'date': '2023-04-05T06:02:00', 'title': '张继科事件后续:是否涉违法、诽谤、浑水摸鱼,这三件事要查清楚', 'body': '下场人士越来越多,网友又翻找出娱乐八卦号曾经的相关爆料(比如聊天记录、漫画、经常去金边的行程等等),张继科事件越来越大,如滚雪球一般,登顶热搜第一。 运动员也是一门职业,和你和我和他都一样,都是赖以生存的职业,我们赞美运动员精神,是赞美他们的拼搏,和赞美每一个平凡的普通人在岗位上兢兢业业是一样的。', 'url': 'https://new.qq.com/rain/a/20230404A0BC0V00', 'image': 'https://inews.gtimg.com/news\_bt/O3r0T8HAfV8V676qvvB6DZuI7wtoYGMlx7gixg2HUgIu0AA/1000', 'source': '腾讯网'},  
{'date': '2023-04-04T16:23:00', 'title': '张继科涉赌事件曝光!内容惊人,身败名裂之路一触即发!', 'body': '在国乒队员中享有盛誉的张继科,日前卷入赌博丑闻,引起了网民们的广泛关注。据悉,这位被誉为乒乓球界神童的选手已经在多个赌场留下了大笔赌资,并且还涉嫌违反国家法律。面对这一严重指控,他的未来前途堪忧,不少人已经开始担心他是否能够承受住巨大的压力,继续在赛场上保持卓越的表现。 据知情人士透露,张继科在北京和上海多家高档赌场内,经常和一些赌徒进行牌局。他所下注的金额非常惊人 ,据说曾经一晚上输掉过数百万元', 'url': 'https://www.sohu.com/a/662997572\_121305925', 'image': None, 'source': '搜狐'},   
{'date': '2023-04-04T16:22:00', 'title': '如何评价张继科事件?', 'body': '张继科事件是指近期围绕体育明星张继科拿前女友景甜的私密视频抵债的传闻,引发了社会和舆论的广泛关注。这一事件不仅涉及到张继科和景甜的个人隐私和名誉,还牵涉到赌博、敲诈勒索等严重的法律问题。因为事件还在进行中,不知后续走向如何,我仅就当下反映出的几个社会问题进行评价: 1. 张继科事件暴露了网络暴力和隐私泄露的严重性。据媒体报道,张继科的前女友景甜的私密视频共有三段,其中一段被张继科给了债主S先生,S', 'url': 'https://www.sohu.com/a/662997396\_121309243', 'image': 'https://p7.itc.cn/images01/20230405/ce627d5380c540d1b34dcace68e05f7e.png', 'source': '搜狐'}]  


二、将duckduckgo_search实时结果接入GLM6B进行生成

实时性,一直是大家对chatgpt这类应用发问较多的问题,而通过借助搜索引擎的结果,我们可以在此基础上,通过搜索的结果进行简单拼接、摘要、截断等方式,快速获得一个较好的结果。

1、实现思想

我们可以基于glm6b来搭建一个服务,直接将该服务的接口作为chatgpt生成答案的平替。ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。

结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。

地址:https://github.com/THUDM/ChatGLM-6B

思路很简单:首先,我们给定一个query,调用duckduckgo_search,得到实时结果后,调用glm6b的生成服务,得到最终答案。

整个实现思路,很朴素,但核心就两个半,一个是底层大模型,另一个是实时搜索。还有半个,是对应的prompt。

2、chatglm-6b搭建服务

#!/usr/bin/env python  
# -\*- coding: UTF-8 -\*-  
import os  
import json  
from flask import Flask, request  
from transformers import AutoModel, AutoTokenizer  

os.environ["CUDA\_VISIBLE\_DEVICES"] = "3"  
tokenizer = AutoTokenizer.from_pretrained(r"chatglm-6b", trust_remote_code=True,  
                                          revision="main")  
model = AutoModel.from_pretrained(r"chatglm-6b", trust_remote_code=True,  
                                  revision="main").half().quantize(4).cuda()  
model = model.cuda()  
model = model.eval()  
app = Flask(import_name=__name__)  

def predict(input_string, history):  
    if history is None:  
        history = []  
    try:  
        response, history = model.chat(tokenizer, input_string, history)  
        return {"msg": "success", "code": 200, "response": response}  
    except Exception as error:  
        return {"msg": "error", "code": 500, "response": error}  

@app.route("/chat\_with\_history", methods=["POST", "GET"])  
def chat_with_history():  
    data = json.loads(request.data)  
    input_text = data['input\_text']  
    history = data.get("history", None)  
    if history is not None:  
        history = json.loads(history)  
    return predict(input_text, history)  

if __name__ == '\_\_main\_\_':  
    app.run(port=12345, debug=True, host='0.0.0.0')  # 如果是0.0.0.0,则可以被外网访问  



3、使用duckduckgo_search输出结果,完成实时搜索

我们以实时的百度热搜,进行时效性检测,下面是具体热搜榜单:

下面是具体的结果,效果看起来还不错,本质上是一个MRC任务:


************************************************************  
enter an query to search:马克龙在什么时候来北京了最近  
query: 马克龙在什么时候来北京了最近  
answer: 马克龙于 2023 年 4 月 5 日至 7 日对中国进行国事访问。  

************************************************************  
enter an query to search:谁最近停售了张继科肖像产品  
query: 谁最近停售了张继科肖像产品  
answer: 蝴蝶乒乓球用品公司最近停售了张继科肖像产品。  

************************************************************  
enter an query to search:特朗普认罪了么,最高会判几年  
query: 特朗普认罪了么,最高会判几年  
answer: 特朗普没有认罪,并且这些指控可能会导致他被判处136年的监禁。  

************************************************************  
enter an query to search:张继科最近犯了啥事  
query: 张继科最近犯了啥事  
answer: 张继科最近犯了一些法律事件,其中包括恋爱期间劈腿、涉赌、泄露他人隐私视频以及欠下巨额债务,其中债主拿着他的前女友的私密视频去抵债,景甜对此表示愤怒并告了这位债主,这位债主目前还在服刑中。  

************************************************************  
enter an query to search:北京最新天气  
query: 北京最新天气  
answer: 根据最新的天气预报,北京最新天气为多云转晴,最高气温为12°C,最低气温为3°C,风力较小,只有2、3级。  

************************************************************  
enter an query to search:今天几号  
query: 今天几号  
answer: 今天是 2023 年 4 月 4 日,是农历闰二月十四,同时也是阳历的星期四。  

************************************************************  
enter an query to search:当前黄金价格多少  
query: 当前黄金价格多少  
answer: 根据提供的信息,今天是2023年4月4日,中国上海黄金交易所的黄金价格是439.6元人民币/克。这是裸黄金价格,商场的黄金首饰价格会在此基础上加上加工费等。按当前的汇率计算,1盎司黄金的价格约为1990.3美元。因此,当前黄金价格是439.6元人民币/克,1盎司黄金的价格约为1990.3美元。  

************************************************************  
enter an query to search:马克龙访华,有哪三点值得关注  
query: 马克龙访华,有哪三点值得关注  
answer: 马克龙访华,值得关注的三点包括:  
1. 中法合作新成果:这是马克龙首次访华,也是中法两国元首继去年G20巴厘岛峰会后再一次面对面对话。双方将继续就共同关心的国际和地区问题进行沟通和协商,推动中法合作不断迈上新台阶。  
2. 经贸务实合作:马克龙此次访华将重点探讨双方合作的未来规划和经贸务实合作,包括贸易、投资、知识产权保护等领域。双方还将继续深化中法物流合作,促进数字经济等领域合作。  
3. 应对全球挑战:马克龙此前表示,应对全球挑战是中法两国共同使命。他此次访华将重点探讨应对气候变化、难民问题、恐怖主义等全球挑战,以及如何在多边框架内应对全球性问题。双方还将继续就非洲发展、国际合作等问题进行沟通和协商。  

总结

本着实践与理论相结合的原则,我们进行了实验,并介绍了搜索引擎基座:duckduckgo_search,将duckduckgo_search实时结果接入GLM6B进行生成。

整个实现思路,很朴素,但核心就两个半,一个是底层大模型,另一个是实时搜索。还有半个,是对应的prompt。

这两个都是壁垒,底层大模型大规模使用,一旦商用会涉及版权问题,后者则严重依赖搜索引擎,过度访问,会直接引起ip封禁,效果也受限于搜索引擎的结果,这些都是需要考虑的问题。

实际上,越到后面,我们越会发现,基础模型研发十分重要,并且潜力无限。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

参考文献

1、https://github.com/deedy5/duckduckgo_search

2、https://github.com/THUDM/ChatGLM-6B

关于我们

老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

就职于360人工智能研究院、曾就职于中国科学院软件研究所。

老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。

对于想加入更优质的知识图谱、事件图谱实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。