回头看基础,TemplatePrompt和MessagePrompt

news/2025/12/1 15:41:52/文章来源:https://www.cnblogs.com/nanimono/p/19293013

最近想实现一个简单的功能:用户输入一个餐厅名关键词,agent调用高德地图api,拿到餐厅的一些关键信息,如准确店名、地址(文字地址+经纬度)、评分、人均、营业时间等,接下来agent将接口返回的数据整理,形成更精简的结构化json,存入数据库。只获取餐厅信息并存库是没太多业务价值的,第二步我会给这个agent提供更多全网搜索餐厅信息、评价等工具,让存储的信息不止包含基本信息,还要包含agent处理过的评价。不过第二步是后话了,今天先记录我在做第一步过程中遇到的问题,和我的思考。

我先封装了两个请求高德地图api接口的方法,它们属于一个RestaurantPoi类。

 1 import requests
 2 import os
 3 from dotenv import load_dotenv
 4 
 5 load_dotenv()
 6 
 7 class RestautantPoi:
 8     """
 9         提供餐厅地图位置等信息查询工具
10     """
11 
12     def get_city_info(self):
13         """
14             获取当前定位城市
15         """
16         url = os.getenv('IP_POSITION_URL')
17         try:
18             res = requests.get(url,params={'key': os.getenv('AMAP_API_KEY')})
19             res.raise_for_status()
20 
21             return res.json()
22         except Exception as e:
23             return None
24         
25     def amap_search(self, keyword, city=''):
26         """
27             根据餐厅关键词在地图上搜索店铺
28         """
29         if not city:
30             ip_city_info = self.get_city_info()
31             city = ip_city_info.get('adcode') if ip_city_info else ''
32         
33         url = os.getenv('SEARCH_RESTAURANT_URL')
34         params = {
35             'key': os.getenv('AMAP_API_KEY'),
36             'keywords': keyword,
37             'types': os.getenv('RESTAURANT_TYPE_CODE'),
38             'city': city
39         }
40         try:
41             res = requests.get(url, params=params)
42             res.raise_for_status()
43 
44             json = res.json()
45             if json.get('status') == 0:
46                 raise Exception(json.get('info'))
47             return json.get('pois')
48         except Exception as e:
49             print(f'搜索遇到错误{e}')
50             return None
View Code

然后,我定义了一个langchain_tool,在里面实例化RestaurantPoi类并调用查询方法。

 1 from langchain_core.tools import tool as langchain_tool
 2 from poi_api import RestautantPoi
 3 
 4 # 定义工具
 5 @langchain_tool
 6 def search_restaurant(query: str) -> list:
 7     """
 8     根据关键字搜索餐厅方法
 9     args:
10         query: str 餐厅名关键字
11     returns:
12         rest_info: list 餐厅信息列表
13     """
14     print(f'\n --- tools: 工具调用:search_restaurant,查询:{query} ---')
15     try:
16         poi_obj = RestautantPoi()
17         rests = poi_obj.amap_search(query)
18         if len(rests) > 0:
19             print('--- 工具调用结束 ---')
20             return rests
21         else:
22             raise Exception('没有获取到餐厅信息')
23     except Exception as e:
24         print(f'--- 餐厅搜索工具出错: {e}')
25         return []
View Code

接下来,定义一个agent,传入工具和prompt,期待它返回一个精简后的结构化json。

 1 from langchain_openai import ChatOpenAI
 2 from langchain_core.messages import SystemMessage
 3 from langchain.agents import create_agent
 4 
 5 tools = [search_restaurant]
 6     
 7 # 创建工具调用agent
 8 if llm:
 9     agent_prompt = SystemMessage("""
10     你是一个帮助用户搜索并整理餐厅信息的助手。
11     用户输入中会包含餐厅名关键词{keyword}。
12     而你需要使用工具,根据关键词搜索餐厅信息,并从中整理出最匹配的一家。
13     读取并整理餐厅信息,从名字、人均、评分、位置(经纬度)四个方面,进行格式化的输出。
14     仅输出json,不要进行多余文本输出。
15     --------
16     正常输出example:
17     {
18         'name': '云水谣云南菜',
19         'price': '¥79',
20         'rate': '4.2',
21         'location': '115.984339,40.474397'
22     }
23     ---------
24     部分信息未找到输出example:
25     {
26         'name': '无二和牛烧',
27         'price': '暂无',
28         'rate': '暂无',
29         'location': '115.984339,40.474397'
30     }
31     ----------
32     工具未找到合适餐厅输出example:
33     { }
34     """)
35 
36 agent = create_agent(
37     model=llm,
38     tools=tools,
39     system_prompt=agent_prompt)
40 
41 if __name__ == '__main__':
42     res = agent.invoke({"messages": [{"role": "user", "content": "帮我查一下离故宫最近的四季民福烤鸭店"}]})
43     print('------ Agent 回复: -------')
44     print(res)
View Code

补充一下llm的实例化:

1 try:
2     llm = ChatOpenAI(model='gpt-4o',temperature=0)
3     print(f'语言模型初始化成功')
4 except Exception as e:
5     print(f'语言模型初始化失败{e}')
6     llm = None
View Code

上面这段定义agent的代码有两个问题,虽然能跑起来,但结果和预期不同。

第一个是我对大模型function call的理解不够深入,已知大模型可以被理解成一个巨大的预测函数,函数的特性是一次调用一次输出,没有定义成递归的前提下,不会自己调用自己,也不会有两次输出。

那么我的prompt是怎么写的呢?我希望大模型先调用工具,拿到工具函数的返回后,再优化这个返回,输出精简json。

但是对于大模型来说,输出工具调用就完成这一次调用,后面工具调用的结果,它无感知了。正常的流程应该我来编排,将工具调用的结果合并前面的历史记录,再次传递给大模型,由模型进行处理。这是我这个工具调用初学者犯的一个小白错误。同时,负责判断意图并调用工具的agent(因为后续会增加更多的搜索工具)和负责信息整理优化的agent,应该分开作为两个独立功能的agent来设计,每个agent只负责自己份内的工作,这样理论上效果才最好。

我需要将prompt拆开,工具调用就只进行工具调用的提示;优化json就只进行json优化的提示。

那么第二个问题来了:我prompt中的'keyword'真的用到了吗?

我虽然使用了SystemMessage,并进行了模版插值,但agent是以

agent.invoke({"messages": [{"role": "user", "content": "帮我查一下离故宫最近的四季民福烤鸭店"}]})
的形式调用的,我混淆了TemplatePrompt和MessagePrompt!
 

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

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

相关文章

2025年碳纤木门制造商权威推荐榜单:套装门/实木门/无漆木门源头厂家精选

碳纤木门,作为现代门业中融合了前沿材料科技与家居美学的高端产品,凭借其卓越的强度重量比、优异的耐用性、出众的环保性能以及时尚的外观设计,正迅速成为住宅、商业及工程项目中的热门选择。选择一家技术扎实、品控…

2025年氯化镁阻化剂定制厂家权威推荐榜单:LH—Z01阻化剂‌/煤矿专用阻化剂‌/MSF—II阻化剂‌源头厂家精选

在煤矿安全生产标准不断提升与环保政策日益严格的背景下,氯化镁阻化剂作为抑制煤炭自燃的关键材料,其市场需求正朝着高效、环保、定制化的方向深度发展。据行业调研,应用优质阻化剂后,煤炭的自燃发火期能够延长约2…

2025商丘特色餐饮品牌口碑榜:商丘任广涛干锅鸭怎么样?

本榜单依托河南、山东等区域餐饮市场调研与真实消费口碑,深度筛选出5家聚焦特色干锅赛道的标杆品牌,为消费者就餐选型、创业者加盟决策提供客观依据,助力精准匹配适配的餐饮品牌。 TOP1 推荐:商丘任广涛餐饮管理有…

【AP出版 | CPCI检索】第八届人文教育与社会科学国际学术会议(ICHESS 2025)

第八届人文教育与社会科学国际学术会议(ICHESS 2025)于2025年12月19-21日在中国西安举行。【西安交通大学主办|高录用|快见刊|稳检索】 第八届人文教育与社会科学国际学术会议(ICHESS 2025) 2025 8th Internati…

10418_基于SSM的旅游管理系统

1、项目包含 项目源码、项目文档、数据库脚本、软件工具等资料; 带你从零开始部署运行本套系统。 2、项目介绍 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通…

2025年广州儿童黄埔军校夏令营学校权威推荐榜单:广州黄埔军校夏令营招生服务商/广州小学生黄埔军校军事夏令营培训/广州黄埔军校军事夏令营公司精选

在素质教育备受重视的当下,融合了纪律训练、品格塑造与爱国主义教育的军事主题夏令营,成为众多广州家庭暑期规划的热点。数据显示,2023年全国青少年夏令营参与人数已突破800万,市场持续扩大。其中,以“黄埔精神”…

2025年耙式干燥设备制造厂权威推荐榜单:新型耙式干燥机‌/真空耙式干燥机‌/耙式干燥器‌源头厂家精选

在化工、制药及新能源材料等领域,对高粘度、热敏性或易氧化物料的安全高效干燥需求日益增长。耙式干燥设备以其独特的间歇式、低氧操作特性,正成为此类物料干燥工艺的核心装备。根据行业技术评估,真空耙式干燥机可使…

【IEEE出版 | EI检索】第二届机器学习、计算智能与模式识别国际学术会议(MLCIPR 2025)

第二届机器学习、计算智能与模式识别国际学术会议(MLCIPR 2025)将于2025年12月19-21日在南京召开。【 出版社快至提交后2个月检索;两大高校联合主办;收稿主题广泛,快审核高录用率】 第二届机器学习、计算智能与模…

深度揭秘:湖南省网安基地——由“安服公司”开的网络安全培训班,到底是坑还是宝藏?​ - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

百度不收录境外服务器是真是假?

结论:假的。百度官方明确表示对境外服务器没有歧视,只要符合条件,境外服务器网站完全可以被收录。 官方态度与事实 百度官方在多个场合明确表态:"百度对海外站点没有歧视。我们对国内和国外空间的站点是一样的…

面试官最喜欢问的Webpack中的loader和plugin到底有什么区别?

基本概念​Loader​:对单个资源(文件)做转换的函数(把一个文件从一种内容转换为另一种内容),在 module 层面运行。 ​Plugin​:在整个构建过程的生命周期里插入钩子逻辑(修改编译器、生成资源、注入行为等),…

SQL子查询完全指南:从零掌握嵌套查询的三种用法与最佳实践 - 详解

SQL子查询完全指南:从零掌握嵌套查询的三种用法与最佳实践 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

Rust自定义迭代器

Rust自定义迭代器 Rust要自定迭代器要实现Iterator这个Trait,就可以使用next方法,也可以实现IntoIterator方法就可以把对象转换为一个迭代器。这与Python中的可迭代对象和迭代器的概念类似。在Python中,实现了__ite…

适合幼儿园开展的STEM课程品牌介绍及分析

在当前以科技教育为主的大环境,幼儿园如何开展STEM教育,哪个课程品牌更容易落地,风险更小呢? 在教育部等七部门发布《关于加强中小学科技教育的意见》的大背景,很多人在思考:在幼儿园阶段引入STEM教育(科学、技…

分库分表全面总结

目录分库分表全面总结分库分表的本质分库分表方式示例1:垂直分库(按业务拆分到不同数据库)示例2:垂直分表(按列拆分到不同表)示例3:水平分库(数据分布到不同数据库的同名表)示例4:水平分表(数据分布到同库的…

2025年深圳品牌策划公司推荐排行榜:深圳品牌策划公司能整合

在企业品牌竞争白热化的当下,选择一家能整合资源、提供稳定优质服务的深圳品牌策划公司,成为众多企业突破增长瓶颈的关键。为帮助企业精准选型,我们从资源整合能力、服务稳定性、服务质量、客户口碑及案例落地效果五…

2025年中国十大网店代运营公司推荐:代运营哪家强?

本榜单依托产业带深度调研与工厂真实合作口碑,聚焦源头厂商电商痛点,筛选出十家能解决招人难、成本高、效果差的标杆代运营企业,为实体厂商选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:广东飞客网…

2025年户外橡胶地垫制造厂权威推荐榜单:减震橡胶地垫/公园橡胶地垫/复合橡胶地垫源头厂家精选

户外橡胶地垫作为公共空间安全防护与运动场地建设的重要材料,其市场需求持续增长。据行业统计,我国户外橡胶地垫市场规模年均增长率达12%以上,其中厚度20mm以上的高规格产品占比超过40%。本文基于产品质量、市场覆盖…

靠谱的国际短信验证码平台,短信验证码服务商盘点,兼顾速度、安全与成本控制!

在全球化日益加深的今天,国际短信验证码服务已成为企业拓展海外市场、提升用户体验的关键环节。从跨境电商到金融科技,从游戏出海到远程办公,高效、稳定、安全的短信验证码平台成为企业不可或缺的合作伙伴。根据QYR…

【JPCS出版 | EI检索】第七届国际科技创新学术交流大会暨机械工程与自动化国际学术会议(MEA 2025)

第七届机械工程与自动化国际学术会议(MEA 2025)将于2025年12月19日至21日在中国广州举行。【往届见刊后快至1个月检索、连续5年稳定EI检索、易中稿】 第七届国际科技创新学术交流大会暨机械工程与自动化国际学术会议…