微信扫码
与创始人交个朋友
我要投稿
前言
Cloud Native
在这样的背景下,业界提出了 AI Agent 的概念。AI Agent 中文翻译成智能体,旨在让大模型像人脑一样思考问题,通过在思考过程中的不断反馈以及工具的调用,最终实现逐步完成给定目标的过程。例如,用户使用外卖助手 Agent,只需告诉 Agent,我想点一份肯德基的上校鸡块,Agent 便可以实现搜索肯德基商家,选择食物,下单,支付等一系列的思考过程以及工具调用,无需人工参与。
Higress[1]是阿里云开源的一款 AI Gateway,基于 API Gateway 的能力,再加上基于 Wasm 插件扩展的大量 AI 插件,就可以满足上述所有 AI Native 的需求。
AI Agent 插件使用
Cloud Native
高德地图:入门指南-Web 服务 API丨高德地图 API(amap.com)[2]
心知天气:查看/修改你的 API 密钥(yuque.com)[3]
dashscope: #通义千问大模型客户端配置apiKey: sk-xxxxxxxxxxxxxxxxxxxxxxxdomain: dashscope.aliyuncs.comserviceName: dashscopeservicePort: 443promptTemplate:language: CHapis:- apiProvider:domain: restapi.amap.comserviceName: geoservicePort: 80apiKey:in: queryname: keyvalue: fcxxxxxxxxxxxxxxxxxxapi: |openapi: 3.1.0info:title: 高德地图description: 获取 POI 的相关信息version: v1.0.0servers:- url: https://restapi.amap.compaths:/v5/place/text:get:description: 根据POI名称,获得POI的经纬度坐标operationId: get_location_coordinateparameters:- name: keywordsin: querydescription: POI名称,必须是中文required: trueschema:type: string- name: regionin: querydescription: POI所在的区域名,必须是中文required: trueschema:type: stringdeprecated: false/v5/place/around:get:description: 搜索给定坐标附近的POIoperationId: search_nearby_poisparameters:- name: keywordsin: querydescription: 目标POI的关键字required: trueschema:type: string- name: locationin: querydescription: 中心点的经度和纬度,用逗号隔开required: trueschema:type: stringdeprecated: falsecomponents:schemas: {}- apiProvider:domain: api.seniverse.comserviceName: seniverseservicePort: 80apiKey:in: queryname: keyvalue: SMxxxxxxxxxxxxxxapi: |openapi: 3.1.0info:title: 心知天气description: 获取 天气预办相关信息version: v1.0.0servers:- url: https://api.seniverse.compaths:/v3/weather/now.json:get:description: 获取指定城市的天气实况operationId: get_weather_nowparameters:- name: locationin: querydescription: 所查询的城市required: trueschema:type: string- name: languagein: querydescription: 返回天气查询结果所使用的语言required: trueschema:type: stringdefault: zh-Hansenum:- zh-Hans- en- ja- name: unitin: querydescription: 表示温度的的单位,有摄氏度和华氏度两种required: trueschema:type: stringdefault: cenum:- c- fdeprecated: falsecomponents:schemas: {}
插件配置分三部分,第一部分 dashscope,是通义千问大模型服务的相关信息,第二部分 promptTemplate,是自定义 agent react 模板的配置项,示例中的 language 是指使用中文模板,第三部分 apis 是外部 API 服务的相关配置,包含服务相关信息 apiProvider 以及 api(tools) 的 OpenAPI 文档,这一部分是实现 agent 调用外部工具的关键,agent 会通过理解 OpenAPI 文档来理解参数应该赋什么值。
curl 'http://<这里换成网关公网IP>/api/openai/v1/chat/completions' \-H 'Accept: application/json, text/event-stream' \-H 'Content-Type: application/json' \--data-raw '{"messages":[{"role":"user","content":"我想在济南市鑫盛大厦附近喝咖啡,给我推荐几个"}],"model":"qwen","stream":false}'
示例响应一:
{...,"content":" 在济南市鑫盛大厦附近,您可以选择以下咖啡店:\n1. luckin coffee 瑞幸咖啡(鑫盛大厦店),位于新泺大街1299号鑫盛大厦2号楼大堂;\n2. 三庆齐盛广场挪瓦咖啡(三庆·齐盛广场店),位于新泺大街与颖秀路交叉口西南60米;\n3. luckin coffee 瑞幸咖啡(三庆·齐盛广场店),位于颖秀路1267号;\n4. 库迪咖啡(齐鲁软件园店),位于新泺大街三庆齐盛广场4号楼底商;\n5. 库迪咖啡(美莲广场店),位于高新区新泺大街1166号美莲广场L117号;以及其他一些选项。希望这些建议对您有所帮助!"...}
示例请求二:
curl 'http://<这里换成网关公网IP>/api/openai/v1/chat/completions' \-H 'Accept: application/json, text/event-stream' \-H 'Content-Type: application/json' \--data-raw '{"messages":[{"role":"user","content":"济南市现在的天气情况如何?"}],"model":"qwen","stream":false}'
示例响应二:
{..."content":" 济南市现在的天气状况为阴天,温度为31℃。此信息最后更新于2024年8月9日15时12分(北京时间)。"...}
示例请求三:
curl 'http://<这里换成网关公网IP>/api/openai/v1/chat/completions' \-H 'Accept: application/json, text/event-stream' \-H 'Content-Type: application/json' \--data-raw '{"messages":[{"role":"user","content":"济南市现在的天气情况如何?用华氏度表示,用日语回答"}],"model":"qwen","stream":false}'
{..."content":" 济南市の現在の天気は雨曇りで、気温は88°Fです。この情報は2024年8月9日15時12分(東京時間)に更新されました。"...}
AI Agent 实现原理
Cloud Native
尽你所能回答以下问题。你可以使用以下工具:
{tools}
请使用以下格式,其中Action字段后必须跟着Action Input字段,并且不要将Action Input替换成Input或者tool等字段,不能出现格式以外的字段名,每个字段在每个轮次只出现一次:
Question: 你需要回答的输入问题
Thought: 你应该总是思考该做什么
Action: 要采取的动作,动作只能是{tools_name}中的一个 ,一定不要加入其它内容
Action Input: 行动的输入,必须出现在Action后。
Observation: 行动的结果
...(这个Thought/Action/Action Input/Observation可以重复N次)
Thought: 我现在知道最终答案
Final Answer: 对原始输入问题的最终答案
再次重申,不要修改以上模板的字段名称,开始吧!
Question: {input}
该模板指导了大模型的推理过程。
role: usermsg: {prompt模板}
之后通过 proxywasm.ReplaceHttpRequestBody 函数用 prompt 模板替换掉用户的原始 query,通过 ai-proxy 发送给大模型。
role: assistantmsg: {大模型的回复}
之后需要通过正则表达式来判断大模型的返回内容。
Thought: 为了提供咖啡店的推荐,我首先需要获取五道口这一地点的经纬度坐标。
Action: get_location_coordinate
Action Input: {"keywords": "五道口", "region": "北京市"}
通过正则表达式取出 Action 与 Action Input 的值,就得到了需要调用的工具名称以及参数的值。
GET https://restapi.amap.com/v5/place/text?key=xxxxxx&keywords=五道口®ion=北京市
该 API 的回复为:
{"status":0,"message":"成功","result":{"location":{"lng":116.352978,"lat":39.982849},"precise":1,"confidence":100,"comprehension":100}}
将该回复拼接到 Observation 后面,作为新的 query,在存储到 messageStore 后,将整个历史对话发送给大模型。此时由于处在插件的 onHttpResponseBody 阶段,无法再通过 ai-proxy 访问大模型,因此需要自己去调用 dashscope client 访问大模型。
Thought: 现在我得到了五道口的经纬度坐标,接下来我可以使用这些坐标来搜索附近的咖啡店。
Action: search_nearby_pois
Action Input: {"keywords": "咖啡", "longitude": "116.352978", "latitude": "39.982849"}
程序通过正则得到 Action 与 Action Input 后,会重复刚才的过程,组装新的 url,向高德地图发请求,然后把结果存 messageStore 后给到大模型。整个过程是一个不断递归调用的过程。
Thought: 我现在知道最终答案
Final Answer: 在北京市五道口附近有几家咖啡店可以选择,包括:
- 星巴克五道口店
- Costa Coffee五道口店
- 漫咖啡五道口店
您可以根据个人喜好选择前往。
这一次,程序通过可以检测到回复中包含了 Final Answer,这说明大模型已经得到了最终答案,无需再次调用工具了。因此检测到 Final Answer 就是结束递归调用的条件,此时就可以将 Final Answer 的答案通过 proxywasm.ReplaceHttpResponseBody 函数替换掉 response body 返回给用户了。
该部分对应图中的 5,6,7,8 步骤。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-11-22
RAG技术在实际应用中的挑战与解决方案
2024-11-22
从普通RAG到RAPTOR,10个最新的RAG框架
2024-11-22
如何使用 RAG 提高 LLM 成绩
2024-11-21
提升RAG性能的全攻略:优化检索增强生成系统的策略大揭秘 | 深度好文
2024-11-20
FastGraphRAG 如何做到高达 20%优化检索增强生成(RAG)性能优化
2024-11-20
为裸奔的大模型穿上"防护服":企业AI安全护栏设计指南
2024-11-20
RAG-Fusion技术在产品咨询中的实践与分析
2024-11-19
构建高性能RAG:文本分割核心技术详解
2024-07-18
2024-05-05
2024-07-09
2024-07-09
2024-05-19
2024-06-20
2024-07-07
2024-07-07
2024-07-08
2024-07-09
2024-11-06
2024-11-06
2024-11-05
2024-11-04
2024-10-27
2024-10-25
2024-10-21
2024-10-21