From 47ef080b673b43fbbb96e02a8e10bfaf93b55c18 Mon Sep 17 00:00:00 2001 From: qingzhong1 Date: Mon, 25 Dec 2023 12:48:23 +0000 Subject: [PATCH] update cookbook --- ...unctionalAgentWithRetrieval_baizhong.ipynb | 369 ++++++++++++++ ...tionalAgentWithRetrieval_lamma_index.ipynb | 364 ++++++++++++++ ...nctionalAgentWithRetrieval_langchain.ipynb | 458 ++++++++++++++++++ 3 files changed, 1191 insertions(+) create mode 100644 erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_baizhong.ipynb create mode 100644 erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_lamma_index.ipynb create mode 100644 erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_langchain.ipynb diff --git a/erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_baizhong.ipynb b/erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_baizhong.ipynb new file mode 100644 index 000000000..aebfdc77f --- /dev/null +++ b/erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_baizhong.ipynb @@ -0,0 +1,369 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 简介\n", + "\n", + "这是一款名为‘FunctionalAgentWithRetrieval检索增强小助手’的演示应用,展示了如何结合BaizhongSearch和ERNIEBot的functional agent来回答用户的专业知识问题。首先,应用通过BaizhongSearch在知识库中检索相关内容,然后评估检索内容与问题的相关度。如果内容与问题高度相关,大模型将采用检索增强方式回答问题;否则,大模型将调用工具列表中的工具回答用户的问题。这种设计不仅扩展了大模型的专业领域知识,还保持了其在领域知识之外的通用对话能力\n", + "\n", + "构建流程如下:" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1. 导入第三方库\n", + "\n", + "主要是在导入一些必要的Python库和模块,以便实现functionalagentwithretrievaltool的功能。\n", + "+ erniebot: 这是导入erniebot模块的语句,erniebot可能是一个包含ERNIE Bot实现的主要代码库。\n", + "+ ERNIEBot: 实现ERNIE Bot的主要类,包含了实现对话功能的主要逻辑。\n", + "+ BaizhongSearch:实现百中的检索功能" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "import erniebot_agent\n", + "from erniebot_agent.agents import FunctionalAgentWithRetrieval\n", + "from erniebot_agent.retrieval import BaizhongSearch\n", + "from erniebot_agent.memory.whole_memory import WholeMemory\n", + "from erniebot_agent.chat_models.erniebot import ERNIEBot\n", + "from erniebot_agent.tools.calculator_tool import CalculatorTool\n", + "import erniebot" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. 预处理\n", + "\n", + "## 2.1 配置百中检索\n", + "这里使用aistudio的access_token、knowledge_base_name、knowledge_base_id, 申请地址请参考[accessToken](https://aistudio.baidu.com/index/accessToken)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "baizhong_search = BaizhongSearch(\n", + " access_token=\"your access token\",\n", + " knowledge_base_name='test',\n", + " knowledge_base_id='495735236530245',\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "以下代码是使用百中检索进行搜索的一个例子,流程大致如下:\n", + "1. 调用BaizhongSearch对象的search函数,并传入查询字符串\"城市管理执法主管部门的职责是什么?\"。\n", + "2. 将搜索结果以格式化的形式进行打印,这里使用了pprint模块进行美化打印。最终的结果存储在变量res中。" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'content': '住房和城乡建设部规章城市管理执法办法(2017 年 1 月 24 日中华人民共和国住房和城乡建设部令第34 号公布 自 2017 '\n", + " '年 5 月 1 日起施行)第一章 总 则第一条 '\n", + " '为了规范城市管理执法工作,提高执法和服务水平,维护城市管理秩序,保护公民、法人和其他组织的合法权益,根据行政处罚法、行政强制法等法律法规的规定,制定本办法。第二条 '\n", + " '城市、县人民政府所在地镇建成区内的城市管理执法活动以及执法监督活动,适用本办法。本办法所称城市管理执法,是指城市管理执法主管部门在城市管理领域根据法律法规规章规定履行行政处罚、行政强制等行政执法职责的行为。- '\n", + " '1 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第三条 '\n", + " '城市管理执法应当遵循以人为本、依法治理、源头治理、权责一致、协调创新的原则,坚持严格规范公正文明执法。第四条 '\n", + " '国务院住房城乡建设主管部门负责全国城市管理执法的指导监督协调工作。各省、自治区人民政府住房城乡建设主管部门负责本行政区域内城市管理执法的指导监督考核协调工作。城市、县人民政府城市管理执法主管部门负责本行政区域内的城市管理执法工作。第五条 '\n", + " '城市管理执法主管部门应当推动建立城市管理协调机制,协调有关部门做好城市管理执法工作。第六条 '\n", + " '城市管理执法主管部门应当加强城市管理法律法规规章的宣传普及工作,增强全民守法意识,共同维护城市管理秩序。第七条 '\n", + " '城市管理执法主管部门应当积极为公众监督城市管理执法活动提供条件。- 2 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第二章 执法范围第八条 '\n", + " '城市管理执法的行政处罚权范围依照法律法规和国务院有关规定确定,包括住房城乡建设领域法律法规规章规定的行政处罚权,以及环境保护管理、工商管理、交通管理、水务管理、食品药品监管方面与城市管理相关部分的行政处罚权。第九条 '\n", + " '需要集中行使的城市管理执法事项,应当同时具备下列条件:(一)与城市管理密切相关;(二)与群众生产生活密切相关、多头执法扰民问题突出;(三)执法频率高、专业技术要求适宜;(四)确实需要集中行使的。第十条 '\n", + " '城市管理执法主管部门依法相对集中行使行政处罚权的,可以实施法律法规规定的与行政处罚权相关的行政强制措施。- 3 '\n", + " '-X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第十一条 城市管理执法事项范围确定后,应当向社会公开。第十二条 '\n", + " '城市管理执法主管部门集中行使原由其他部门行使的行政处罚权的,应当与其他部门明确职责权限和工作机制。第三章 执法主体第十三条 '\n", + " '城市管理执法主管部门按照权责清晰、事权统一、精简效能的原则设置执法队伍。第十四条 '\n", + " '直辖市、设区的市城市管理执法推行市级执法或者区级执法。直辖市、设区的市的城市管理执法事项,市辖区人民政府城市管理执法主管部门能够承担的,可以实行区级执法。直辖市、设区的市人民政府城市管理执法主管部门可以承担跨区域和重大复杂违法案件的查处。- '\n", + " '4 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第十五条 '\n", + " '市辖区人民政府城市管理执法主管部门可以向街道派出执法机构。直辖市、设区的市人民政府城市管理执法主管部门可以向市辖区或者街道派出执法机构。派出机构以设立该派出机构的城市管理执法主管部门的名义,在所辖区域范围内履行城市管理执法职责。第十六条 '\n", + " '城市管理执法主管部门应当依据国家相关标准,提出确定城市管理执法人员数量的合理意见,并按程序报同级编制主管部门审批。第十七条 '\n", + " '城市管理执法人员应当持证上岗。',\n", + " 'id': '495735246643269',\n", + " 'score': 0.3607402443885803,\n", + " 'title': '城市管理执法办法.pdf'},\n", + " {'content': '城市管理执法主管部门应当定期开展执法人员的培训和考核。第十八条 '\n", + " '城市管理执法主管部门可以配置城市管理执法协管人员,配合执法人员从事执法辅助事务。协管人员从事执法辅助事务产生的法律后果,由本级城市管理执法主管部门承担。- '\n", + " '5 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章城市管理执法主管部门应当严格协管人员的招录程序、资格条件,规范执法辅助行为,建立退出机制。第十九条 '\n", + " '城市管理执法人员依法开展执法活动和协管人员依法开展执法辅助事务,受法律保护。第四章 执法保障第二十条 '\n", + " '城市管理执法主管部门应当按照规定配置执法执勤用车以及调查取证设施、通讯设施等装备配备,并规范管理。第二十一条 '\n", + " '城市管理执法制式服装、标志标识应当全国统一,由国务院住房城乡建设主管部门制定式样和标准。第二十二条 '\n", + " '城市管理执法应当保障必要的工作经费。工作经费按规定已列入同级财政预算,城市管理执法主管部门不得以罚没收入作为经费来源。- 6 '\n", + " '-X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第二十三条 '\n", + " '城市管理领域应当建立数字化城市管理平台,实现城市管理的信息采集、指挥调度、督察督办、公众参与等功能,并逐步实现与有关部门信息平台的共享。城市管理领域应当整合城市管理相关电话服务平台,建立统一的城市管理服务热线。第二十四条 '\n", + " '城市管理执法需要实施鉴定、检验、检测的,城市管理执法主管部门可以开展鉴定、检验、检测,或者按照有关规定委托第三方实施。第五章 '\n", + " '执法规范第二十五条 城市管理执法主管部门依照法定程序开展执法活动,应当保障当事人依法享有的陈述、申辩、听证等权利。第二十六条 '\n", + " '城市管理执法主管部门开展执法活动,应当根据违法行为的性质和危害后果依法给予相应的行政处罚。对违法行为轻微的,可以采取教育、劝诫、疏导等方式予以纠正。- '\n", + " '7 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第二十七条 '\n", + " '城市管理执法人员开展执法活动,可以依法采取以下措施:(一)以勘验、拍照、录音、摄像等方式进行现场取证;(二)在现场设置警示标志;(三)询问案件当事人、证人等;(四)查阅、调取、复制有关文件资料等;(五)法律、法规规定的其他措施。第二十八条 '\n", + " '城市管理执法主管部门应当依法、全面、客观收集相关证据,规范建立城市管理执法档案并完整保存。城市管理执法主管部门应当运用执法记录仪、视频监控等技术,实现执法活动全过程记录。第二十九条 '\n", + " '城市管理执法主管部门对查封、扣押的物品,应当妥善保管,不得使用、截留、损毁或者擅自处置。查封、扣押的物品属非法物品的,移送有关部门处理。- '\n", + " '8 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第三十条 '\n", + " '城市管理执法主管部门不得对罚款、没收违法所得设定任务和目标。罚款、没收违法所得的款项,应当按照规定全额上缴。第三十一条 '\n", + " '城市管理执法主管部门应当确定法制审核机构,配备一定比例符合条件的法制审核人员,对重大执法决定在执法主体、管辖权限、执法程序、事实认定、法律适用等方面进行法制审核。第三十二条 '\n", + " '城市管理执法主管部门开展执法活动,应当使用统一格式的行政执法文书。第三十三条 '\n", + " '行政执法文书的送达,依照民事诉讼法等法律规定执行。当事人提供送达地址或者同意电子送达的,可以按照其提供的地址或者传真、电子邮件送达。采取直接、留置、邮寄、委托、转交等方式无法送达的,可以通过报纸、门户网站等方式公告送达。- '\n", + " '9 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章',\n", + " 'id': '495735246643270',\n", + " 'score': 0.28457343578338623,\n", + " 'title': '城市管理执法办法.pdf'},\n", + " {'content': '第三十四条 '\n", + " '城市管理执法主管部门应当通过门户网站、办事窗口等渠道或者场所,公开行政执法职责、权限、依据、监督方式等行政执法信息。第六章 '\n", + " '协作与配合第三十五条 '\n", + " '城市管理执法主管部门应当与有关部门建立行政执法信息互通共享机制,及时通报行政执法信息和相关行政管理信息。第三十六条 '\n", + " '城市管理执法主管部门可以对城市管理执法事项实行网格化管理。第三十七条 '\n", + " '城市管理执法主管部门在执法活动中发现依法应当由其他部门查处的违法行为,应当及时告知或者移送有关部门。第七章 执法监督- 10 '\n", + " '-X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第三十八条 '\n", + " '城市管理执法主管部门应当向社会公布投诉、举报电话及其他监督方式。城市管理执法主管部门应当为投诉人、举报人保密。第三十九条 '\n", + " '城市管理执法主管部门违反本办法规定,有下列行为之一的,由上级城市管理执法主管部门或者有关部门责令改正,通报批评;情节严重的,对直接负责的主管人员和其他直接责任人员依法给予处分。(一)没有法定依据实施行政处罚的;(二)违反法定程序实施行政处罚的;(三)以罚款、没收违法所得作为经费来源的;(四)使用、截留、损毁或者擅自处置查封、扣押物品的;(五)其他违反法律法规和本办法规定的。第四十条 '\n", + " '非城市管理执法人员着城市管理执法制式服装的,城市管理执法主管部门应当予以纠正,依法追究法律责任。- 11 '\n", + " '-X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第八章 附 则第四十一条 本办法第二条第一款规定范围以外的城市管理执法工作,参照本办法执行。第四十二条 '\n", + " '本办法自 2017 年 5 月 1 日起施行。1992 年 6月 3 日发布的《城建监察规定》(建设部令第 20 '\n", + " '号)同时废止。- 12 -X住房和城乡建设部发布',\n", + " 'id': '495735246643271',\n", + " 'score': 0.2785114049911499,\n", + " 'title': '城市管理执法办法.pdf'},\n", + " {'content': '住房和城乡建设部规章城市设计管理办法(2017 年 3 月 14 日中华人民共和国住房和城乡建设部令第35 号公布 自 2017 '\n", + " '年 6 月 1 日起施行)第一条 '\n", + " '为提高城市建设水平,塑造城市风貌特色,推进城市设计工作,完善城市规划建设管理,依据《中华人民共和国城乡规划法》等法律法规,制定本办法。第二条 '\n", + " '城市、县人民政府所在地建制镇开展城市设计管理工作,适用本办法。第三条 '\n", + " '城市设计是落实城市规划、指导建筑设计、塑造城市特色风貌的有效手段,贯穿于城市规划建设管理全过程。通过城市设计,从整体平面和立体空间上统筹城市建筑布局、协调城市景观风貌,体现地域特征、民族特色和时代风貌。第四条 '\n", + " '开展城市设计,应当符合城市(县人民政府所在地建制镇)总体规划和相关标准;尊重城市发展规律,坚持以人为本,保护自然环境,传承历史文化,塑造城市特色,优化城市形- '\n", + " '1 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章态,节约集约用地,创造宜居公共空间;根据经济社会发展水平、资源条件和管理需要,因地制宜,逐步推进。第五条 '\n", + " '国务院城乡规划主管部门负责指导和监督全国城市设计工作。省、自治区城乡规划主管部门负责指导和监督本行政区域内城市设计工作。城市、县人民政府城乡规划主管部门负责本行政区域内城市设计的监督管理。第六条 '\n", + " '城市、县人民政府城乡规划主管部门,应当充分利用新技术开展城市设计工作。有条件的地方可以建立城市设计管理辅助决策系统,并将城市设计要求纳入城市规划管理信息平台。第七条 '\n", + " '城市设计分为总体城市设计和重点地区城市设计。第八条 '\n", + " '总体城市设计应当确定城市风貌特色,保护自然山水格局,优化城市形态格局,明确公共空间体系,并可与城市(县人民政府所在地建制镇)总体规划一并报批。- '\n", + " '2 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第九条 '\n", + " '下列区域应当编制重点地区城市设计:(一)城市核心区和中心地区;(二)体现城市历史风貌的地区;(三)新城新区;(四)重要街道,包括商业街;(五)滨水地区,包括沿河、沿海、沿湖地带;(六)山前地区;(七)其他能够集中体现和塑造城市文化、风貌特色,具有特殊价值的地区。第十条 '\n", + " '重点地区城市设计应当塑造城市风貌特色,注重与山水自然的共生关系,协调市政工程,组织城市公共空间功能,注重建筑空间尺度,提出建筑高度、体量、风格、色彩等控制要求。- '\n", + " '3 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第十一条 '\n", + " '历史文化街区和历史风貌保护相关控制地区开展城市设计,应当根据相关保护规划和要求,整体安排空间格局,保护延续历史文化,明确新建建筑和改扩建建筑的控制要求。重要街道、街区开展城市设计,应当根据居民生活和城市公共活动需要,统筹交通组织,合理布置交通设施、市政设施、街道家具,拓展步行活动和绿化空间,提升街道特色和活力。第十二条 '\n", + " '城市设计重点地区范围以外地区,可以根据当地实际条件,依据总体城市设计,单独或者结合控制性详细规划等开展城市设计,明确建筑特色、公共空间和景观风貌等方面的要求。第十三条 '\n", + " '编制城市设计时,组织编制机关应当通过座谈、论证、网络等多种形式及渠道,广泛征求专家和公众意见。审批前应依法进行公示,公示时间不少于 '\n", + " '30 日。城市设计成果应当自批准之日起 20 个工作日内,通过政府信息网站以及当地主要新闻媒体予以公布。第十四条 '\n", + " '重点地区城市设计的内容和要求应当纳入控制性详细规划,并落实到控制性详细规划的相关指标中。- 4 -X',\n", + " 'id': '495735259373637',\n", + " 'score': 0.0519241988658905,\n", + " 'title': '城市设计管理办法.pdf'},\n", + " {'content': '住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章重点地区的控制性详细规划未体现城市设计内容和要求的,应当及时修改完善。第十五条 '\n", + " '单体建筑设计和景观、市政工程方案设计应当符合城市设计要求。第十六条 '\n", + " '以出让方式提供国有土地使用权,以及在城市、县人民政府所在地建制镇规划区内的大型公共建筑项目,应当将城市设计要求纳入规划条件。第十七条 '\n", + " '城市、县人民政府城乡规划主管部门负责组织编制本行政区域内总体城市设计、重点地区的城市设计,并报本级人民政府审批。第十八条 '\n", + " '城市、县人民政府城乡规划主管部门组织编制城市设计所需的经费,应列入城乡规划的编制经费预算。第十九条 '\n", + " '城市、县人民政府城乡规划主管部门开展城乡规划监督检查时,应当加强监督检查城市设计工作情况。国务院和省、自治区人民政府城乡规划主管部门应当定期对各地的城市设计工作和风貌管理情况进行检查。- '\n", + " '5 -X住房和城乡建设部发布\\x0c'\n", + " '住房和城乡建设部规章第二十条 '\n", + " '城市、县人民政府城乡规划主管部门进行建筑设计方案审查和规划核实时,应当审核城市设计要求落实情况。第二十一条 '\n", + " '城市、县人民政府城乡规划主管部门开展城市规划实施评估时,应当同时评估城市设计工作实施情况。第二十二条 '\n", + " '城市设计的技术管理规定由国务院城乡规划主管部门另行制定。第二十三条 '\n", + " '各地可根据本办法,按照实际情况,制定实施细则和技术导则。第二十四条 '\n", + " '县人民政府所在地以外的镇可以参照本办法开展城市设计工作。第二十五条 本办法自 2017 年 6 月 1 日起施行。- 6 '\n", + " '-X住房和城乡建设部发布',\n", + " 'id': '495735259373638',\n", + " 'score': 0.05096665024757385,\n", + " 'title': '城市设计管理办法.pdf'}]\n" + ] + } + ], + "source": [ + "res = baizhong_search.search(query=\"城市管理执法主管部门的职责是什么?\")\n", + "from pprint import pprint\n", + "pprint(res)\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2 配置 ERNIE BOT API\n", + "\n", + "这里使用aistudio的Access_token, 申请地址请参考[accessToken](https://aistudio.baidu.com/index/accessToken)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "erniebot.api_type = \"aistudio\"\n", + "aistudio_access_token = \"your access token\"\n", + "erniebot.access_token = aistudio_access_token" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3. Tool 构建\n" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "calculator_tool=CalculatorTool()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. FunctionalAgentwithRetrieval" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "# 创建一个ERNIEBot实例,使用\"ernie-4.0\"模型。\n", + "llm = ERNIEBot(model=\"ernie-4.0\")\n", + "# 创建一个WholeMemory实例。这可能是一个用于存储对话历史和上下文信息的类,有助于模型理解和持续对话。\n", + "memory = WholeMemory()\n", + "# 创建一个FunctionalAgent实例。这个代理将使用上面创建的ERNIEBot模型和WholeMemory,同时传入了一个名为tool的工具。\n", + "agent=FunctionalAgentWithRetrieval(\n", + " llm=llm,\n", + " tools=[calculator_tool],\n", + " memory=memory,\n", + " knowledge_base=baizhong_search,\n", + " threshold=0.2)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4.1 检索示例" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'role': 'user', 'content': '检索结果:\\n\\n 第1个段落: 住房和城乡建设部规章城市管理执法办法(2017 年 1 月 24 日中华人民共和国住房和城乡建设部令第34 号公布 自 2017 年 5 月 1 日起施行)第一章 总 则第一条 为了规范城市管理执法工作,提高执法和服务水平,维护城市管理秩序,保护公民、法人和其他组织的合法权益,根据行政处罚法、行政强制法等法律法规的规定,制定本办法。第二条 城市、县人民政府所在地镇建成区内的城市管理执法活动以及执法监督活动,适用本办法。本办法所称城市管理执法,是指城市管理执法主管部门在城市管理领域根据法律法规规章规定履行行政处罚、行政强制等行政执法职责的行为。- 1 -X住房和城乡建设部发布\\x0c住房和城乡建设部规章第三条 城市管理执法应当遵循以人为本、依法治理、源头治理、权责一致、协调创新的原则,坚持严格规范公正文明执法。第四条 国务院住房城乡建设主管部门负责全国城市管理执法的指导监督协调工作。各省、自治区人民政府住房城乡建设主管部门负责本行政区域内城市管理执法的指导监督考核协调工作。城市、县人民政府城市管理执法主管部门负责本行政区域内的城市管理执法工作。第五条 城市管理执法主管部门应当推动建立城市管理协调机制,协调有关部门做好城市管理执法工作。第六条 城市管理执法主管部门应当加强城市管理法律法规规章的宣传普及工作,增强全民守法意识,共同维护城市管理秩序。第七条 城市管理执法主管部门应当积极为公众监督城市管理执法活动提供条件。- 2 -X住房和城乡建设部发布\\x0c住房和城乡建设部规章第二章 执法范围第八条 城市管理执法的行政处罚权范围依照法律法规和国务院有关规定确定,包括住房城乡建设领域法律法规规章规定的行政处罚权,以及环境保护管理、工商管理、交通管理、水务管理、食品药品监管方面与城市管理相关部分的行政处罚权。第九条 需要集中行使的城市管理执法事项,应当同时具备下列条件:(一)与城市管理密切相关;(二)与群众生产生活密切相关、多头执法扰民问题突出;(三)执法频率高、专业技术要求适宜;(四)确实需要集中行使的。第十条 城市管理执法主管部门依法相对集中行使行政处罚权的,可以实施法律法规规定的与行政处罚权相关的行政强制措施。- 3 -X住房和城乡建设部发布\\x0c住房和城乡建设部规章第十一条 城市管理执法事项范围确定后,应当向社会公开。第十二条 城市管理执法主管部门集中行使原由其他部门行使的行政处罚权的,应当与其他部门明确职责权限和工作机制。第三章 执法主体第十三条 城市管理执法主管部门按照权责清晰、事权统一、精简效能的原则设置执法队伍。第十四条 直辖市、设区的市城市管理执法推行市级执法或者区级执法。直辖市、设区的市的城市管理执法事项,市辖区人民政府城市管理执法主管部门能够承担的,可以实行区级执法。直辖市、设区的市人民政府城市管理执法主管部门可以承担跨区域和重大复杂违法案件的查处。- 4 -X住房和城乡建设部发布\\x0c住房和城乡建设部规章第十五条 市辖区人民政府城市管理执法主管部门可以向街道派出执法机构。直辖市、设区的市人民政府城市管理执法主管部门可以向市辖区或者街道派出执法机构。派出机构以设立该派出机构的城市管理执法主管部门的名义,在所辖区域范围内履行城市管理执法职责。第十六条 城市管理执法主管部门应当依据国家相关标准,提出确定城市管理执法人员数量的合理意见,并按程序报同级编制主管部门审批。第十七条 城市管理执法人员应当持证上岗。\\n\\n检索语句: 城乡建设部规章中,城市管理执法第三章,第十三条是什么?\\n请根据以上检索结果回答检索语句的问题'}\n", + "{'role': 'assistant', 'content': '城乡建设部规章中,城市管理执法第三章是执法主体,该章第十三条是城市管理执法主管部门按照权责清晰、事权统一、精简效能的原则设置执法队伍。', 'function_call': None, 'search_info': {'results': [{'index': 1, 'url': '', 'title': '城市管理执法办法.pdf'}]}}\n" + ] + } + ], + "source": [ + "response=await agent._async_run('城乡建设部规章中,城市管理执法第三章,第十三条是什么?')\n", + "messages = response.chat_history\n", + "for item in messages:\n", + " print(item.to_dict())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4.2 调用tool示例" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'role': 'user', 'content': '11-2='}\n", + "{'role': 'assistant', 'content': '', 'function_call': {'name': 'CalculatorTool', 'thoughts': \"用户想知道11减2等于多少,我可以使用CalculatorTool工具来计算公式,其中`math_formula`字段的内容为:'11-2'。\", 'arguments': '{\"math_formula\":\"11-2\"}'}, 'search_info': None}\n", + "{'role': 'function', 'name': 'CalculatorTool', 'content': '{\"formula_result\": 9}'}\n", + "{'role': 'assistant', 'content': '根据你的请求,11减2的结果为:9。如果你还有其他问题,请随时告诉我。', 'function_call': None, 'search_info': None}\n" + ] + } + ], + "source": [ + "response=await agent._async_run('11-2=')\n", + "messages = response.chat_history\n", + "for item in messages:\n", + " print(item.to_dict())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "python310", + "language": "python", + "name": "py310" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_lamma_index.ipynb b/erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_lamma_index.ipynb new file mode 100644 index 000000000..135f6655a --- /dev/null +++ b/erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_lamma_index.ipynb @@ -0,0 +1,364 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 简介\n", + "\n", + "这是一款名为‘FunctionalAgentWithRetrieval检索增强小助手’的演示应用,展示了如何结合llama_index的工具和ERNIEBot的functional agent来回答用户的专业知识问题。首先,应用通过构建FaissSearch在知识库中检索相关内容,然后评估检索内容与问题的相关度。如果内容与问题高度相关,大模型将采用检索增强方式回答问题;否则,大模型将调用工具列表中的工具回答用户的问题。这种设计不仅扩展了大模型的专业领域知识,还保持了其在领域知识之外的通用对话能力\n", + "\n", + "构建流程如下:" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1. 导入第三方库\n", + "\n", + "主要是在导入一些必要的Python库和模块,以便实现FunctionAgentWithRetrival的功能。\n", + "+ os: Python的标准库,用于与操作系统进行交互,如读写文件、管理路径等。\n", + "+ faiss: 用于向量存储的模块,可能是用于存储和检索经过嵌入处理的文本或图像的向量表示。\n", + "+ \n", + "+ ErnieEmbeddings: 用于文本嵌入的工具,将文本转换为可以在模型中使用的向量表示。\n", + "+ FunctionalAgent: 这个类实现function calling功能的Agent的类,如问答、对话等。\n", + "+ WholeMemory: 用于存储和管理代理的记忆的类。\n", + "+ ERNIEBot: 实现ERNIE Bot的主要类,包含了实现对话功能的主要逻辑。\n", + "+ AIMessage, HumanMessage, Message: 用于实现消息传递和处理的类,如机器人和人类之间的消息交互。\n", + "+ erniebot: 这是导入erniebot模块的语句,erniebot可能是一个包含ERNIE Bot实现的主要代码库。\n", + "+ cosine_similarity" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"OPENAI_API_KEY\"] = \" \"\n", + "from erniebot_agent.agents.functional_agent_with_retrieval import FunctionalAgentWithRetrieval\n", + "from erniebot_agent.memory.whole_memory import WholeMemory\n", + "from erniebot_agent.chat_models.erniebot import ERNIEBot\n", + "from erniebot_agent.tools.calculator_tool import CalculatorTool\n", + "from erniebot_agent.extensions.langchain.embeddings import ErnieEmbeddings\n", + "import erniebot\n", + "import faiss\n", + "from llama_index import (\n", + " SimpleDirectoryReader,\n", + " load_index_from_storage,\n", + " VectorStoreIndex,\n", + " StorageContext,\n", + ")\n", + "from llama_index.vector_stores.faiss import FaissVectorStore\n", + "from llama_index import ServiceContext" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. 预处理\n", + "\n", + "## 2.1 下载数据集" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-12-25 12:34:19-- https://paddlenlp.bj.bcebos.com/datasets/examples/construction_regulations.tar\n", + "Resolving paddlenlp.bj.bcebos.com (paddlenlp.bj.bcebos.com)... 36.110.192.178, 2409:8c04:1001:1002:0:ff:b001:368a\n", + "Connecting to paddlenlp.bj.bcebos.com (paddlenlp.bj.bcebos.com)|36.110.192.178|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 1239040 (1.2M) [application/x-tar]\n", + "Saving to: ‘construction_regulations.tar’\n", + "\n", + "construction_regula 100%[===================>] 1.18M 6.00MB/s in 0.2s \n", + "\n", + "2023-12-25 12:34:21 (6.00 MB/s) - ‘construction_regulations.tar’ saved [1239040/1239040]\n", + "\n", + "construction_regulations/\n", + "construction_regulations/城市管理执法办法.pdf\n", + "construction_regulations/建筑工程设计招标投标管理办法.pdf\n", + "construction_regulations/建筑业企业资质管理规定.pdf\n", + "construction_regulations/城市照明管理规定.pdf\n", + "construction_regulations/城市设计管理办法.pdf\n", + "construction_regulations/建筑工程施工发包与承包计价管理办法.pdf\n", + "construction_regulations/市政公用设施抗灾设防管理规定.pdf\n" + ] + } + ], + "source": [ + "! wget https://paddlenlp.bj.bcebos.com/datasets/examples/construction_regulations.tar\n", + "! tar xvf construction_regulations.tar" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2 配置 ERNIE BOT API\n", + "\n", + "这里使用aistudio的Access_token, 申请地址请参考[accessToken](https://aistudio.baidu.com/index/accessToken)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "erniebot.api_type = \"aistudio\"\n", + "aistudio_access_token = \"4ce50e3378f418d271c480c8ddfa818537071dbe\"\n", + "erniebot.access_token = aistudio_access_token" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3 构建FaissSearch_lama" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "class FaissSearch_llama:\n", + " def __init__(\n", + " self,\n", + " faiss_index,\n", + " documents,\n", + " embed_model,\n", + " ):\n", + " self.vector_store = FaissVectorStore(faiss_index=faiss_index)\n", + " storage_context = StorageContext.from_defaults(vector_store=self.vector_store)\n", + " self.service_context = ServiceContext.from_defaults(embed_model=embed_model)\n", + " self.index = VectorStoreIndex.from_documents(\n", + " documents, storage_context=storage_context,show_progress=True,\n", + " service_context=self.service_context,)\n", + " self.index.storage_context.persist()\n", + " def search(self,query,topk=10,**kwargs):\n", + " storage_context = StorageContext.from_defaults(\n", + " vector_store=self.vector_store, persist_dir=\"./storage\")\n", + " index = load_index_from_storage(storage_context=storage_context,service_context=self.service_context,top_k=topk)\n", + " retriever = self.index.as_retriever()\n", + " nodes = retriever.retrieve(query)\n", + " retrieval_results = []\n", + " for doc in nodes:\n", + " retrieval_results.append(\n", + " {\n", + " \"content\": doc.node.text,\n", + " \"score\": doc.score,\n", + " \"title\": doc.node.metadata['file_name']\n", + " }\n", + " )\n", + " return retrieval_results" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3.FunctionalAgentWithRetrieval\n", + "## 3.1 建索引库\n", + "\n", + "这段代码主要功能是用于创建或加载一个FAISS索引来进行文档相似度匹配。首先,创建一个ErnieEmbeddings对象,用于生成文档的嵌入向量。aistudio_access_token是访问AI Studio的令牌,chunk_size是用于嵌入的文档块的数量" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "embed_model = ErnieEmbeddings(aistudio_access_token=aistudio_access_token, chunk_size=16)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "接下来利用ErnieEmbeddings来抽取向量构建索引。d是ernie-embedding的向量抽取维度。" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "d = 384\n", + "faiss_index = faiss.IndexFlatL2(d)\n", + "documents = SimpleDirectoryReader(\"construction_regulations\").load_data()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "以下代码是使用FaissSearc_llama进行搜索的一个例子,流程大致如下:\n", + "1. 创建FaissSearch_llama对象,传入embed_model、documents、faiss_index。\n", + "2. 使用调用FaissSearch_llama对象的search函数,并传入查询字符串\"城市管理执法主管部门的职责是什么?\"。\n", + "3. 将搜索结果以格式化的形式进行打印,这里使用了pprint模块进行美化打印。最终的结果存储在变量res中。" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/root/qingzhong/anas/envs/py310_openai/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "Parsing nodes: 100%|███████████████████████████████████████████████████████████████| 82/82 [00:00<00:00, 957.43it/s]\n", + "Generating embeddings: 12%|██████▊ | 10/82 [00:00<00:04, 17.79it/s]Retrying requests: Attempt 1 ended with: \n", + "Generating embeddings: 24%|█████████████▋ | 20/82 [00:02<00:08, 7.24it/s]Retrying requests: Attempt 1 ended with: \n", + "Generating embeddings: 37%|████████████████████▍ | 30/82 [00:04<00:08, 6.15it/s]Retrying requests: Attempt 1 ended with: \n", + "Generating embeddings: 49%|███████████████████████████▎ | 40/82 [00:06<00:07, 5.39it/s]Retrying requests: Attempt 1 ended with: \n", + "Generating embeddings: 61%|██████████████████████████████████▏ | 50/82 [00:08<00:06, 5.21it/s]Retrying requests: Attempt 1 ended with: \n", + "Generating embeddings: 73%|████████████████████████████████████████▉ | 60/82 [00:10<00:04, 4.93it/s]Retrying requests: Attempt 1 ended with: \n", + "Generating embeddings: 85%|███████████████████████████████████████████████▊ | 70/82 [00:12<00:02, 5.00it/s]Retrying requests: Attempt 1 ended with: \n", + "Generating embeddings: 98%|██████████████████████████████████████████████████████▋ | 80/82 [00:14<00:00, 4.90it/s]Retrying requests: Attempt 1 ended with: \n", + "Generating embeddings: 100%|████████████████████████████████████████████████████████| 82/82 [00:16<00:00, 4.94it/s]\n", + "Retrying requests: Attempt 1 ended with: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'content': '住房和城乡建设部规章 \\n'\n", + " ' X住房和城乡建设部发布 \\n'\n", + " '- 11 - 第三十八条 城市管理执法主管部门应当向社会公布投诉、举报电话及其他监督方式。 '\n", + " '城市管理执法主管部门应当为投诉人、举报人保密。 第三十九条 城市管理执法主管部门违反本办法规定, 有下列行为之一的, '\n", + " '由上级城市管理执法主管部门或者有关部门责令改正,通报批评;情节严重的,对直接负责的主管人员和其他直接责任人员依法给予处分。 '\n", + " '(一)没有法定依据实施行政处罚的; (二)违反法定程序实施行政处罚的; (三)以罚款、没收违法所得作为经费来源的; '\n", + " '(四)使用、截留、损毁或者擅自处置查封、扣押物品的; (五)其他违反法律法规和本办法规定的。 第四十条 '\n", + " '非城市管理执法人员着城市管理执法制式服装的,城市管理执法主管部门应当予以纠正,依法追究法律责任。',\n", + " 'score': 0.8667174577713013,\n", + " 'title': '城市管理执法办法.pdf'},\n", + " {'content': '住房和城乡建设部规章 \\n'\n", + " ' X住房和城乡建设部发布 \\n'\n", + " '- 10 - 第三十四条 城市管理执法主管部门应当通过门户网站、 '\n", + " '办事窗口等渠道或者场所,公开行政执法职责、权限、依据、监督方式等行政执法信息。 第六章 协作与配合 第三十五条 '\n", + " '城市管理执法主管部门应当与有关部门建立行政执法信息互通共享机制, 及时通报行政执法信息和相关行政管理信息。 第三十六条 '\n", + " '城市管理执法主管部门可以对城市管理执法事项实行网格化管理。 第三十七条 '\n", + " '城市管理执法主管部门在执法活动中发现依法应当由其他部门查处的违法行为, 应当及时告知或者移送有关部门。 第七章 执法监督',\n", + " 'score': 0.8759953379631042,\n", + " 'title': '城市管理执法办法.pdf'}]\n" + ] + } + ], + "source": [ + "faiss_search=FaissSearch_llama(embed_model=embed_model,documents=documents,faiss_index=faiss_index)\n", + "query='城市管理执法主管部门的职责是什么?'\n", + "res=faiss_search.search(query)\n", + "from pprint import pprint\n", + "pprint(res)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.2 构建FunctionalAgentWithRetrieval\n", + "FunctionalAgentWithRetrieval可以是否进行检索增强回答用户问题,以下是其示例。" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# 创建一个ERNIEBot实例,使用\"ernie-4.0\"模型。\n", + "llm = ERNIEBot(model=\"ernie-4.0\")\n", + "# 创建一个WholeMemory实例。这可能是一个用于存储对话历史和上下文信息的类,有助于模型理解和持续对话。\n", + "memory = WholeMemory()\n", + "# 创建一个CalculatorTool实例。这是一个计算器工具。\n", + "calculator_tool=CalculatorTool()\n", + "# 创建一个FunctionalAgentWithRetrieval实例。这个代理将使用上面创建的ERNIEBot模型、WholeMemory和faiss_search,同时传入了一个名为calculator_tool的工具。\n", + "agent=FunctionalAgentWithRetrieval(\n", + " llm=llm,\n", + " tools=[calculator_tool],\n", + " memory=memory,\n", + " knowledge_base=faiss_search)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'role': 'user', 'content': '检索结果:\\n\\n 第1个段落: 住房和城乡建设部规章 \\n X住房和城乡建设部发布 \\n- 9 - 第三十条 城市管理执法主管部门不得对罚款、 没收违法所得设定任务和目标。 罚款、没收违法所得的款项,应当按照规定全额上缴。 第三十一条 城市管理执法主管部门应当确定法制审核机构,配备一定比例符合条件的法制审核人员,对重大执法决定在执法主体、管辖权限、执法程序、事实认定、法律适用等方面进行法制审核。 第三十二条 城市管理执法主管部门开展执法活动, 应当使用统一格式的行政执法文书。 第三十三条 行政执法文书的送达, 依照民事诉讼法等法律规定执行。 当事人提供送达地址或者同意电子送达的, 可以按照其提供的地址或者传真、电子邮件送达。 采取直接、留置、邮寄、委托、转交等方式无法送达的,可以通过报纸、门户网站等方式公告送达。\\n\\n 第2个段落: 住房和城乡建设部规章 \\n X住房和城乡建设部发布 \\n- 4 - 第十一条 城市管理执法事项范围确定后,应当向社会公开。 第十二条 城市管理执法主管部门集中行使原由其他部门行使的行政处罚权的,应当与其他部门明确职责权限和工作机制。 第三章 执法主体 第十三条 城市管理执法主管部门按照权责清晰、事权统一、精简效能的原则设置执法队伍。 第十四条 直辖市、 设区的市城市管理执法推行市级执法或者区级执法。 直辖市、设区的市的城市管理执法事项,市辖区人民政府城市管理执法主管部门能够承担的,可以实行区级执法。 直辖市、 设区的市人民政府城市管理执法主管部门可以承担跨区域和重大复杂违法案件的查处。\\n\\n检索语句: 城乡建设部规章中,城市管理执法第三章,第十三条是什么?\\n请根据以上检索结果回答检索语句的问题'}\n", + "{'role': 'assistant', 'content': '根据以上检索结果,城乡建设部规章中,城市管理执法第三章是执法主体,该章节的第十三条是:城市管理执法主管部门按照权责清晰、事权统一、精简效能的原则设置执法队伍。', 'function_call': None, 'search_info': {'results': [{'index': 1, 'url': '', 'title': '城市管理执法办法.pdf'}, {'index': 2, 'url': '', 'title': '城市管理执法办法.pdf'}]}}\n" + ] + } + ], + "source": [ + "# 定义一个查询字符串,这个查询是关于\"城乡建设部规章中,城市管理执法第三章,第十三条\"的内容。\n", + "query = \"城乡建设部规章中,城市管理执法第三章,第十三条是什么?\"\n", + "# 使用agent的async_run方法来异步执行查询。由于这是异步操作,因此需要使用'await'关键字。\n", + "response = await agent.async_run(query)\n", + "messages = response.chat_history\n", + "for item in messages:\n", + " print(item.to_dict())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openai", + "language": "python", + "name": "py310_openai" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_langchain.ipynb b/erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_langchain.ipynb new file mode 100644 index 000000000..4c209e576 --- /dev/null +++ b/erniebot-agent/examples/cookbook/FunctionalAgentWithRetrieval_langchain.ipynb @@ -0,0 +1,458 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 简介\n", + "\n", + "这是一款名为‘FunctionalAgentWithRetrieval检索增强小助手’的演示应用,展示了如何结合LangChain的工具和ERNIEBot的functional agent来回答用户的专业知识问题。首先,应用通过构建FaissSearch在知识库中检索相关内容,然后评估检索内容与问题的相关度。如果内容与问题高度相关,大模型将采用检索增强方式回答问题;否则,大模型将调用工具列表中的工具回答用户的问题。这种设计不仅扩展了大模型的专业领域知识,还保持了其在领域知识之外的通用对话能力\n", + "\n", + "构建流程如下:" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1. 导入第三方库\n", + "\n", + "主要是在导入一些必要的Python库和模块,以便实现FunctionAgentWithRetrival的功能。\n", + "+ os: Python的标准库,用于与操作系统进行交互,如读写文件、管理路径等。\n", + "+ Optional, List, Type, Dict: 这些是Python类型提示(typing模块的一部分),用于增强代码的可读性和可维护性,同时也方便开发者进行静态类型检查。\n", + "+ BaseModel, Field: 这些都是来自Pydantic库的类,用于数据验证和设定数据模型。Field通常用于设定模型的字段。\n", + "+ SpacyTextSplitter: 一个文本分割工具,用于将文本分割为更小的部分,如句子或短语。\n", + "+ FAISS: 用于向量存储的模块,可能是用于存储和检索经过嵌入处理的文本或图像的向量表示。\n", + "+ PyPDFDirectoryLoader: 用于从PDF文件中加载数据的工具。\n", + "+ ErnieEmbeddings: 用于文本嵌入的工具,将文本转换为可以在模型中使用的向量表示。\n", + "+ FunctionalAgent: 这个类实现function calling功能的Agent的类,如问答、对话等。\n", + "+ WholeMemory: 用于存储和管理代理的记忆的类。\n", + "+ ERNIEBot: 实现ERNIE Bot的主要类,包含了实现对话功能的主要逻辑。\n", + "+ AIMessage, HumanMessage, Message: 用于实现消息传递和处理的类,如机器人和人类之间的消息交互。\n", + "+ erniebot: 这是导入erniebot模块的语句,erniebot可能是一个包含ERNIE Bot实现的主要代码库。\n", + "+ cosine_similarity" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "import os\n", + "from erniebot_agent.agents.functional_agent_with_retrieval import FunctionalAgentWithRetrieval\n", + "from erniebot_agent.memory.whole_memory import WholeMemory\n", + "from erniebot_agent.chat_models.erniebot import ERNIEBot\n", + "from erniebot_agent.tools.calculator_tool import CalculatorTool\n", + "import erniebot\n", + "from langchain.text_splitter import SpacyTextSplitter\n", + "from langchain.vectorstores import FAISS\n", + "from langchain.document_loaders import PyPDFDirectoryLoader\n", + "from erniebot_agent.extensions.langchain.embeddings import ErnieEmbeddings\n", + "from erniebot_agent.tools.base import Tool, ToolParameterView\n", + "from sklearn.metrics.pairwise import cosine_similarity" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. 预处理\n", + "\n", + "## 2.1 下载数据集" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-12-25 07:14:37-- https://paddlenlp.bj.bcebos.com/datasets/examples/construction_regulations.tar\n", + "Resolving paddlenlp.bj.bcebos.com (paddlenlp.bj.bcebos.com)... 36.110.192.178, 2409:8c04:1001:1002:0:ff:b001:368a\n", + "Connecting to paddlenlp.bj.bcebos.com (paddlenlp.bj.bcebos.com)|36.110.192.178|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 1239040 (1.2M) [application/x-tar]\n", + "Saving to: ‘construction_regulations.tar’\n", + "\n", + "construction_regula 100%[===================>] 1.18M 1.16MB/s in 1.0s \n", + "\n", + "2023-12-25 07:14:38 (1.16 MB/s) - ‘construction_regulations.tar’ saved [1239040/1239040]\n", + "\n", + "construction_regulations/\n", + "construction_regulations/城市管理执法办法.pdf\n", + "construction_regulations/建筑工程设计招标投标管理办法.pdf\n", + "construction_regulations/建筑业企业资质管理规定.pdf\n", + "construction_regulations/城市照明管理规定.pdf\n", + "construction_regulations/城市设计管理办法.pdf\n", + "construction_regulations/建筑工程施工发包与承包计价管理办法.pdf\n", + "construction_regulations/市政公用设施抗灾设防管理规定.pdf\n" + ] + } + ], + "source": [ + "! wget https://paddlenlp.bj.bcebos.com/datasets/examples/construction_regulations.tar\n", + "! tar xvf construction_regulations.tar" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2 配置 ERNIE BOT API\n", + "\n", + "这里使用aistudio的Access_token, 申请地址请参考[accessToken](https://aistudio.baidu.com/index/accessToken)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], + "source": [ + "erniebot.api_type = \"aistudio\"\n", + "aistudio_access_token = \"your access token\"\n", + "erniebot.access_token = aistudio_access_token" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3 构建FaissSearch\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class FaissSearch:\n", + " def __init__(self, db):\n", + " self.db = db\n", + "\n", + " def search(self, query: str, top_k:int = 10,**kwargs):\n", + " docs = self.db.similarity_search(query,top_k)\n", + " para_result = embeddings.embed_documents([i.page_content for i in docs])\n", + " query_result = embeddings.embed_query(query) \n", + " similarities = cosine_similarity([query_result], para_result).reshape((-1,))\n", + " retrieval_results = []\n", + " for index,doc in enumerate(docs):\n", + " retrieval_results.append(\n", + " {\n", + " \"content\": doc.page_content,\n", + " \"score\": similarities[index],\n", + " \"title\": doc.metadata['source']\n", + " }\n", + " )\n", + " return retrieval_results" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3.FunctionalAgentWithRetrieval\n", + "## 3.1 建索引库\n", + "\n", + "这段代码主要功能是用于创建或加载一个FAISS索引来进行文档相似度匹配。首先,创建一个ErnieEmbeddings对象,用于生成文档的嵌入向量。aistudio_access_token是访问AI Studio的令牌,chunk_size是用于嵌入的文档块的数量。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "embeddings = ErnieEmbeddings(aistudio_access_token=aistudio_access_token, chunk_size=16)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "接下来利用ErnieEmbeddings来抽取向量构建索引。\n", + "+ 如果FAISS索引文件已经存在,就使用FAISS.load_local方法加载这个索引,这个索引文件的名字就是定义的faiss_name。\n", + "+ 如果FAISS索引不存在,则需要建索引。\n", + " + 第一步,使用PyPDFDirectoryLoader来从\"construction_regulations\"这个文件夹中加载PDF文档。\n", + " + 第二步,使用SpacyTextSplitter来将加载的文档分割成更小的部分,以便于生成嵌入向量。这个分割器主要用于中文文本,因为这里使用的pipeline是'zh_core_web_sm',如果是初次运行,需要安装spacy并运行`python -m spacy download zh_core_web_sm`来下载中文分句模型。\n", + " + 第三步,通过分割后的文档创建一个新的FAISS索引,并将这个索引保存为之前定义的faiss_name。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Created a chunk of size 408, which is longer than the specified 320\n", + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n" + ] + } + ], + "source": [ + "embeddings = ErnieEmbeddings(aistudio_access_token=aistudio_access_token, chunk_size=16)\n", + "faiss_name = \"faiss_index\"\n", + "if os.path.exists(faiss_name):\n", + " db = FAISS.load_local(faiss_name, embeddings)\n", + "else:\n", + " loader = PyPDFDirectoryLoader(\"construction_regulations\")\n", + " documents = loader.load()\n", + " text_splitter = SpacyTextSplitter(pipeline=\"zh_core_web_sm\", chunk_size=320, chunk_overlap=0)\n", + " docs = text_splitter.split_documents(documents)\n", + " db = FAISS.from_documents(docs, embeddings)\n", + " db.save_local(faiss_name)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "以下代码是使用FaissSearc进行搜索的一个例子,流程大致如下:\n", + "1. 创建FaissSearch对象,并传入数据库对象db。\n", + "2. 使用调用FaissSearch对象的search函数,并传入查询字符串\"城市管理执法主管部门的职责是什么?\"。\n", + "3. 将搜索结果以格式化的形式进行打印,这里使用了pprint模块进行美化打印。最终的结果存储在变量res中。" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'content': '第十条 城市管理执法主管部门依法相对集中行使行政处罚权的, 可以实施法律法规规定的与行政处罚权相关的行政强制措施。',\n", + " 'score': 0.6833730421296541,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'},\n", + " {'content': '第六条 城市管理执法主管部门应当加强城市管理法律法规规章的宣传普及工作,增强全民守法意识,共同维护城市管理秩序。\\n'\n", + " '\\n'\n", + " ' \\n'\n", + " '\\n'\n", + " '第七条 城市管理执法主管部门应当积极为公众监督城市管理执法活动提供条件。',\n", + " 'score': 0.645987793263916,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'},\n", + " {'content': '其他违反法律法规和本办法规定的。 第四十条 '\n", + " '非城市管理执法人员着城市管理执法制式服装的,城市管理执法主管部门应当予以纠正,依法追究法律责任。',\n", + " 'score': 0.628888526926951,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'},\n", + " {'content': '第三章 执法主体 第十三条 城市管理执法主管部门按照权责清晰、事权统一、精简效能的原则设置执法队伍。 第十四条 '\n", + " '直辖市、 设区的市城市管理执法推行市级执法或者区级执法。 '\n", + " '直辖市、设区的市的城市管理执法事项,市辖区人民政府城市管理执法主管部门能够承担的,可以实行区级执法。 直辖市、 '\n", + " '设区的市人民政府城市管理执法主管部门可以承担跨区域和重大复杂违法案件的查处。',\n", + " 'score': 0.6045487776924248,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'},\n", + " {'content': '第五章 执法规范 第二十五条 '\n", + " '城市管理执法主管部门依照法定程序开展执法活动,应当保障当事人依法享有的陈述、申辩、听证等权利。 第二十六条 '\n", + " '城市管理执法主管部门开展执法活动, 应当根据违法行为的性质和危害后果依法给予相应的行政处罚。\\n'\n", + " '\\n'\n", + " ' \\n'\n", + " '\\n'\n", + " '对违法行为轻微的,可以采取教育、劝诫、疏导等方式予以纠正。',\n", + " 'score': 0.5855412211996395,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'},\n", + " {'content': '住房和城乡建设部规章 \\n'\n", + " ' X住房和城乡建设部发布 \\n'\n", + " '-\\n'\n", + " '\\n'\n", + " '4 - 第十一条 城市管理执法事项范围确定后,应当向社会公开。\\n'\n", + " '\\n'\n", + " ' \\n'\n", + " '\\n'\n", + " '第十二条 城市管理执法主管部门集中行使原由其他部门行使的行政处罚权的,应当与其他部门明确职责权限和工作机制。',\n", + " 'score': 0.5779289002003206,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'},\n", + " {'content': '住房和城乡建设部规章 \\n'\n", + " ' X住房和城乡建设部发布 \\n'\n", + " '-\\n'\n", + " '\\n'\n", + " '2 - 第三条 城市管理执法应当遵循以人为本、依法治理、源头治理、 权责一致、 协调创新的原则, '\n", + " '坚持严格规范公正文明执法。 第四条 国务院住房城乡建设主管部门负责全国城市管理执法的指导监督协调工作。\\n'\n", + " '\\n'\n", + " ' \\n'\n", + " '\\n'\n", + " '各省、 自治区人民政府住房城乡建设主管部门负责本行政区域内城市管理执法的指导监督考核协调工作。\\n'\n", + " '\\n'\n", + " ' \\n'\n", + " '\\n'\n", + " '城市、 县人民政府城市管理执法主管部门负责本行政区域内的城市管理执法工作。\\n'\n", + " '\\n'\n", + " ' \\n'\n", + " '\\n'\n", + " '第五条 城市管理执法主管部门应当推动建立城市管理协调机制,协调有关部门做好城市管理执法工作。',\n", + " 'score': 0.5762151842611781,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'},\n", + " {'content': '第二十九条 城市管理执法主管部门对查封、扣押的物品,应当妥善保管,不得使用、截留、损毁或者擅自处置。\\n'\n", + " '\\n'\n", + " '查封、扣押的物品属非法物品的,移送有关部门处理。',\n", + " 'score': 0.5753635808026318,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'},\n", + " {'content': '住房和城乡建设部规章 \\n'\n", + " ' X住房和城乡建设部发布 \\n'\n", + " '- 10 - 第三十四条 城市管理执法主管部门应当通过门户网站、 '\n", + " '办事窗口等渠道或者场所,公开行政执法职责、权限、依据、监督方式等行政执法信息。 \\n'\n", + " '\\n'\n", + " '第六章 协作与配合 第三十五条 城市管理执法主管部门应当与有关部门建立行政执法信息互通共享机制, '\n", + " '及时通报行政执法信息和相关行政管理信息。 第三十六条 城市管理执法主管部门可以对城市管理执法事项实行网格化管理。\\n'\n", + " '\\n'\n", + " ' \\n'\n", + " '\\n'\n", + " '第三十七条 城市管理执法主管部门在执法活动中发现依法应当由其他部门查处的违法行为, 应当及时告知或者移送有关部门。 \\n'\n", + " '\\n'\n", + " '第七章 执法监督',\n", + " 'score': 0.5731701893090992,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'},\n", + " {'content': '住房和城乡建设部规章 \\n'\n", + " ' X住房和城乡建设部发布 \\n'\n", + " '- 1 - 城市管理执法办法 (2017年1月24日中华人民共和国住房和城乡建设部令第34号公布 '\n", + " '自2017年5月1日起施行) 第一章 总 则 第一条 为了规范城市管理执法工作,提高执法和服务水平, '\n", + " '维护城市管理秩序, 保护公民、 法人和其他组织的合法权益,根据行政处罚法、行政强制法等法律法规的规定,制定本办法。 第二条 '\n", + " '城市、 县人民政府所在地镇建成区内的城市管理执法活动以及执法监督活动,适用本办法。 本办法所称城市管理执法, '\n", + " '是指城市管理执法主管部门在城市管理领域根据法律法规规章规定履行行政处罚、 行政强制等行政执法职责的行为。',\n", + " 'score': 0.5722312939985383,\n", + " 'title': 'construction_regulations/城市管理执法办法.pdf'}]\n" + ] + } + ], + "source": [ + "faiss_search = FaissSearch(db=db)\n", + "res = faiss_search.search(query=\"城市管理执法主管部门的职责是什么?\")\n", + "from pprint import pprint\n", + "pprint(res)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.2 构建FunctionalAgentWithRetrieval\n", + "FunctionalAgentWithRetrieval可以是否进行检索增强回答用户问题,以下是其示例。" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# 创建一个ERNIEBot实例,使用\"ernie-4.0\"模型。\n", + "llm = ERNIEBot(model=\"ernie-4.0\")\n", + "# 创建一个WholeMemory实例。这可能是一个用于存储对话历史和上下文信息的类,有助于模型理解和持续对话。\n", + "memory = WholeMemory()\n", + "# 创建一个CalculatorTool实例。这是一个计算器工具。\n", + "calculator_tool=CalculatorTool()\n", + "# 创建一个FunctionalAgentWithRetrieval实例。这个代理将使用上面创建的ERNIEBot模型、WholeMemory和faiss_search,同时传入了一个名为calculator_tool的工具。\n", + "agent=FunctionalAgentWithRetrieval(\n", + " llm=llm,\n", + " tools=[calculator_tool],\n", + " memory=memory,\n", + " knowledge_base=faiss_search)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Retrying requests: Attempt 1 ended with: \n", + "Retrying requests: Attempt 1 ended with: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'role': 'user', 'content': '检索结果:\\n\\n 第1个段落: 住房和城乡建设部规章 \\n X住房和城乡建设部发布 \\n-\\n\\n 第2个段落: 住房和城乡建设部规章 \\n X住房和城乡建设部发布 \\n-\\n\\n 第3个段落: 第十条 城市管理执法主管部门依法相对集中行使行政处罚权的, 可以实施法律法规规定的与行政处罚权相关的行政强制措施。\\n\\n检索语句: 城乡建设部规章中,城市管理执法第三章,第十三条是什么?\\n请根据以上检索结果回答检索语句的问题'}\n", + "{'role': 'assistant', 'content': '根据以上检索结果,没有找到关于“城乡建设部规章中,城市管理执法第三章,第十三条”的具体内容。可能是因为该规章的具体内容没有被提供或者是在提供的段落中没有包含相关信息。建议您通过其他渠道查询该规章的完整内容,以获取所需的具体条款。', 'function_call': None, 'search_info': {'results': [{'index': 1, 'url': '', 'title': 'construction_regulations/市政公用设施抗灾设防管理规定.pdf'}, {'index': 2, 'url': '', 'title': 'construction_regulations/市政公用设施抗灾设防管理规定.pdf'}, {'index': 3, 'url': '', 'title': 'construction_regulations/城市管理执法办法.pdf'}]}}\n" + ] + } + ], + "source": [ + "# 定义一个查询字符串,这个查询是关于\"城乡建设部规章中,城市管理执法第三章,第十三条\"的内容。\n", + "query = \"城乡建设部规章中,城市管理执法第三章,第十三条是什么?\"\n", + "# 使用agent的async_run方法来异步执行查询。由于这是异步操作,因此需要使用'await'关键字。\n", + "response = await agent.async_run(query)\n", + "messages = response.chat_history\n", + "for item in messages:\n", + " print(item.to_dict())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "python310", + "language": "python", + "name": "py310" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}