AI 网关基于 IP 地理位置,增强 Prompt 修饰能力

作者:沈鑫糠,来自昆仑数智瑞道云团队,专注于云原生领域产品研发和相关技术。

前言

什么是 Prompt Engineering

提示词工程(Prompt Engineering),也被称为上下文提示(In-Context Prompting),指的是通过结构化文本等方式来完善提示词,引导 LLM 输出我们期望的结果。通过提示词工程可以在不更新模型权重的情况下,让 LLM 完成不同类型的任务。面对同样一个问题,为 LLM 设置不同的提示词,能够得到不同的回答结果。我们可以通过对 Prompt 的优化提升 LLM 的回答精度。

例如:

什么是 AI Gateway

AI Gateway 的定义是 AI Native 的 API Gateway,是基于 API Gateway 的能⼒来满⾜ AI Native 的需求。例如:

  • 将传统的 QPS 限流扩展到 Token 限流。
  • 将传统的负载均衡/重试/fallback 能力延伸,支持对接多个大模型厂商 API,提高整体稳定性。
  • 扩展可观测能力,支持不同模型之间效果的对比 A/B Test,以及对话上下⽂链路 Tracing 等。

Higress  (https://github.com/alibaba/higress) 是阿⾥云开源的⼀款 AI Gateway,为开发者提供了一站式的 AI 插件集和增强后端模型调度处理能力,使得 AI 与网关的集成更加便捷和高效。官方提供了丰富的插件库,涵盖 AI、流量管理、安全防护等常用功能,满足 90% 以上的业务场景需求。此外还支持 Wasm 插件扩展,支持多语言编写 Wasm 插件,插件更新采用热插拔机制对流量无损。

本文主要基于 Higress 的 Wasm 插件机制,使用 Go 进行插件的整体开发和能力增强。具体可以参考:https://higress.io/docs/latest/plugins/custom/

Geo-IP 插件与 AI 提示词修饰插件的结合与使用

插件参数配置

配置 Geo-IP 插件

启用 Geo-IP 插件(目前仅支持 IPv4),并配置:

Bash
ipProtocal: "ipv4"

配置 AI 提示词修饰插件

启用 AI 提示词修饰插件,在配置的 content 中通过变量,注入地理位置信息:

Bash
prepend:
- content: "提问用户当前的地理位置信息是,国家:${geo-country},省份:${geo-province}, 城市:${geo-city}"role: "system"
append:
- content: "每次回答完问题,尝试进行反问"role: "user"

插件效果

示例请求⼀:

Bash
curl 'http://<这里换成网关公网IP>/api/openai/v1/chat/completions' \
-H 'Accept: application/json, text/event-stream' \
-H 'Content-Type: application/json' \
--data-raw '{"model":"qwen-long","frequency_penalty":0,"max_tokens":800,"stream":false,"presence_penalty":0,"temperature":0.7,"top_p":0.95,"messages":[{"role":"user","content":"附近有什么旅游景点?"}]}'

示例响应一:

Bash
{..."content": "附近热门的旅游景点有故宫、天安门广场、恭王府等。您对哪个景点更感兴趣呢?"...}

示例请求二:

Bash
curl 'http://<这里换成网关公网IP>/api/openai/v1/chat/completions' \
-H 'Accept: application/json, text/event-stream' \
-H 'Content-Type: application/json' \
--data-raw '{"model":"qwen-long","frequency_penalty":0,"max_tokens":800,"stream":false,"presence_penalty":0,"temperature":0.7,"top_p":0.95,"messages":[{"role":"user","content":"怎么去香港?"}]}'

示例响应二:

Bash
{..."content": "从您所在的位置(北京市)前往香港,您可以选择乘坐飞机、火车或者长途汽车等多种交通方式。\n\n1. **飞机**:从北京首都国际机场出发,有多家航空公司提供直飞香港的服务。\n2. **高铁**:北京西站有直达香港西九龙站的高速列车。\n3. **长途汽车**:虽然不是主流方式,但也有部分长途汽车线路连接两地。\n\n您计划什么时候出发呢?不同的出行日期可能会有不同的票务情况和价格。"...}

示例请求三:

Bash
curl 'http://<这里换成网关公网IP>/api/openai/v1/chat/completions' \
-H 'Accept: application/json, text/event-stream' \
-H 'Content-Type: application/json' \
--data-raw '{"model":"qwen-long","frequency_penalty":0,"max_tokens":800,"stream":false,"presence_penalty":0,"temperature":0.7,"top_p":0.95,"messages":[{"role":"user","content":"特色小吃有哪些?"}]}'

示例响应三:

Bash
{..."content": "我可以帮您大概介绍一下北京的一些特色小吃:\n\n1. **豆汁儿配焦圈**:北京的传统小吃之一,豆汁儿口感独特,搭配焦圈食用。\n2. **炸酱面**:北京非常有名的面条吃法,面条通常拌上特制的炸酱以及各种蔬菜丝。\n3. **卤煮火烧**:以猪内脏和豆腐干为主要原料,炖煮而成,汤味醇厚,是老北京的传统食品。\n4. **炒肝**:一种类似卤煮的小吃,但是主要用猪肝和大肠,加上蒜泥等调味品。\n5. **艾窝窝**:糯米制成的甜食,外皮软糯,里面包裹着红豆沙或其他甜馅。\n6. **糖葫芦**:串起来的山楂果,表面裹上一层糖浆,酸甜可口,很受欢迎。\n\n您对哪一种小吃比较感兴趣呢?或者您想了解更多有关这些小吃的信息吗?"...}

实现原理

  1. Geo-IP 插件基于用户 IP 获取用户相关的地理位置信息,如:国家、省份、城市等。
  2. 基于 Higress 的 Property 机制实现跨插件间的数据传递,将 Geo-IP 插件获取的地理位置信息传递给 AI 提示词修饰插件。
  3. AI 提示词插件基于用户配置的提示词模板、用户输入,以及地理位置信息,生成增强后的用户请求发送给 LLM。

Geo-IP 插件实现

用户 IP 的获取:

当请求进入 onHttpRequestHeader( ) 函数时,如果用户是直接连接 Higress,就取 remote_address 作为用户 IP。如果用户通过代理服务访问 Higress,请求里包含请求头 X-forwarded-for,就解析 XFF 头取第一个 IP 地址作为原始用户 IP。

离线 IP 地址定位库内存优化:

Geo IP 插件内置离线 IP 地址定位库,数据来源:https://gitee.com/lionsoul/ip2region

由于默认提供的文件格式为:起始 IP 地址|结束 IP 地址|国家|区域|省份|城市|ISP,直接对数据进行存储存在较大的内存开销。因此首先对原始数据进行处理,将原始数据拆分为多个:IP 地址/子网掩码|国家|区域|省份|城市|ISP 的格式。然后基于加工后的数据格式,可以通过基数树(Radix Tree)的数据结构在内存中进行存储,最终在降低内存占用的同时,保证了 IP 地址的查找效率。

地理位置信息的传递:

起初希望通过 setContext 进行信息的传递。后来在和 Higress Maintainer 的沟通中了解到 Context 没有办法跨插件传递信息。需要通过 setProperty 设置到 metadata 中,其他插件通过 getProperty 获取。在此感谢 johnlanni 的热心解答和帮助。

AI 提示词修饰插件增强实现

用户配置:

prepend:
- role: systemcontent: "提问用户当前的地理位置信息是,国家:${geo-country},省份:${geo-province}, 城市:${geo-city}"

使用以上配置发起请求:

curl http://localhost/test \
-H "content-type: application/json" \
-d '{"model":"gpt-3.5-turbo","messages": [{"role": "user","content":"明天天气怎么样"}]
}'

经过插件处理后,实际请求为:

curl http://localhost/test \
-H "content-type: application/json" \
-d '{"model": "gpt-3.5-turbo","messages": [{"role": "system","content": "提问用户当前的地理位置信息是,国家:中国,省份:浙江, 城市:杭州"},{"role": "user","content": "明天天气怎么样"}]
}'

在设置提示词时,一般将提示词设置为 user 或 system 类型:

  • user:user 角色,代表当前用户。当用户向 LLM 提问或与其交互时,输入的内容都标记为 user。
  • system:system 角色,代表系统级的消息或通知。用于存放提问的相关背景信息或一些预置规则。比如,我们在一个“写小红书文案”的场景中与 LLM 对话。那么“写小红书文案”这个场景中就会提前预置一些规则(比如字数要求、emoji 图像等等)。这些规则就是 system。

总结

本⽂对 Prompt 的使用方式进行了简单介绍,让大家了解到 Prompt 对于 LLM 的重要性。并尝试在 Prompt 中结合用户 Geo IP 信息,实现 LLM 的个性化回复,提升问答的准确度。希望对你有帮助!

插件的实现已经提交 PR 给 Higress 开源社区,可以到这里查看完整的代码实现:

Geo-IP 插件实现:https://github.com/alibaba/higress/pull/1172

AI 提示词修饰插件增强实现:https://github.com/alibaba/higress/pull/1228

也欢迎⼤家提出宝贵建议,可以直接在上⾯ PR 中评论,或者在 Higress 社区交流群(钉钉群号:30735012403)⾥⼀起沟通。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

云服务器+docker:还在为项目上线苦恼?一文包你解决(保姆级教程,图文并茂,万字起步!!!)

目录 Blue留言机&#xff1a; 学习视频以及参考资料 &#xff1a; 1、学习之前的必备操作&#xff1a; 第一步&#xff1a;购买服务器 选择一台免费的云服务器&#xff08;包白嫖的&#xff09; 配置服务器的一点说明&#xff1a; 查看自己是否购买成功&#xff1a; 第…

Codeforces Round 920 (Div. 3)(A,B,C,D)

A 在二维坐标轴上有一个正方形&#xff0c;给你一个正方形的四个顶点坐标&#xff0c;求面积 知道一个边长&#xff0c;平方即可 for(int i0;i<4;i)x[i]x1; Arrays.sort(x); //1122 kMath.abs(x[2]-x[1]); System.out.println(k*k); B 操作1、2是添加和修改&#xff0c;操…

Django+Vue二手交易平台的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作者&…

ubuntu14.04.5出现配环境后重启进不了图形化界面解决记录

前言 这段时间给公司接了一个需要使用到linux环境进行交叉编译的工程&#xff0c;就采用了简单易操作的图形化ubuntu系统。 镜像采用的是&#xff1a;ubuntu14.04.5-desktop-amd64.iso(官网下载的&#xff09; 配置环境的过程下载了众多依赖包&#xff0c;总之就是缺啥下载啥…

vue通过html2canvas+jspdf生成PDF问题全解(水印,分页,截断,多页,黑屏,空白,附源码)

前端导出PDF的方法不多&#xff0c;常见的就是利用canvas画布渲染&#xff0c;再结合jspdf导出PDF文件&#xff0c;代码也不复杂&#xff0c;网上的代码基本都可以拿来即用。 如果不是特别追求完美的情况下&#xff0c;或者导出PDF内容单页的话&#xff0c;那么基本上也就满足业…

HOW DO VISION TRANSFORMERS WORK

HOW DO VISION TRANSFORMERS WORK Namuk Park1,2, Songkuk Kim1 1Yonsei University, 2NAVER AI Lab{namuk.park,songkuk}yonsei.ac.kr 总结 MSA 改善模型泛化能力&#xff1a; MSA 不仅提高了模型的准确性&#xff0c;还通过平滑损失景观来提高泛化能力。损失景观的平坦化使…

ArkUI-动画

ArkUI-动画 系统能力属性动画显式动画 关键帧动画转场动画路径动画粒子动画 资源调用GIF动画帧动画 三方库LottieSVG 提升动画的流畅度使用renderGroup概述使用约束 系统能力 属性动画 通过更改组件的属性值实现渐变过渡效果&#xff0c;例如缩放、旋转、平移等。支持的属性包…

乐鑫 ESP32-P4 无线连接解决方案

ESP32-P4 是乐鑫信息科技推出的一款功能强大的芯片 (SoC) &#xff0c;专为高性能的应用打造。尽管 ESP32-P4 集成了一系列先进特性&#xff0c;但它并未设置无线连接功能&#xff0c;因此需要额外的连接方案来满足嵌入式系统的多样化需求。乐鑫为 ESP32-P4 提供了三种主要的连…

2分钟学会使用createrepo制作本地yum仓库

华子目录 createrepo介绍实验主题实验前提实验前的准备1.server端配置yum网络源&#xff08;这里以阿里云为主&#xff09;2.server端配置本地yum源&#xff08;需要挂载本地镜像&#xff09;3.关闭selinux和firewalld4.安装createrepo包 server端实验步骤1.只下载&#xff0c;…

检测SSRF漏洞的工具

免责声明此文档仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&…

Self-study Python Fish-C Note19 P62to63

类和对象 (part 2) 本节主要介绍 类和对象的构造函数、重写、钻石继承、Mixin及案例源码剖析&#xff08;原视频P62-63)\ 构造函数 之前我们在函数章节里说&#xff0c;函数是可以通过参数来进行个性化定制的。类在实例化的时候其实也是支持个性化定制对象的。 定义类的时候…

idea的springboot里面的resources是什么

在IDEA&#xff08;IntelliJ IDEA&#xff09;中的Spring Boot项目中&#xff0c;resources目录扮演着非常重要的角色。这个目录主要用于存放项目的非代码资源&#xff0c;包括但不限于配置文件、静态资源文件&#xff08;如图片、CSS、JavaScript等&#xff09;、模板文件&…

如何用c++判断一个类型是vector

如何用c判断一个类型是vector 我们使用模板元编程来搞定 这里我们可以定义一个模板结构体 is_std_vector&#xff0c;并对其进行特化&#xff0c;以便专门处理 std::vector 类型。 . 下面是详细的实现和使用示例。 实现 is_std_vector 类型, 继承自false_type 首先&#xff…

EvoSuite使用总结

1.安装EvoSuite插件 以IDEA为例&#xff0c;在Plugins栏搜索EvoSuite后点击install&#xff0c;安装完成后重启IDEA 2.使用EvoSuite 选中文件右键选择Run EvoSuite 生成成功可以看到如下提示&#xff1a; 注意事项&#xff1a; 生成路径&#xff1a;src/test/java 使用juni…

数智时代敲门砖:华为云MaaS服务让中小企业AI应用如此简单

文&#xff5c;白 鸽 编&#xff5c;王一粟 19.9元的数字人、29.9元的云数据库、195元10卡时包的MaaS大模型服务...... 堪称企业级“双十一”的华为云828营销季&#xff0c;带着一众AI应用产品和云服务&#xff0c;杀疯了。 云计算叠加大模型的价格战&#xff0c;也正式进入…

HTTPS理论(SSL/TLS)

SSL安全套接层协议 为互联网通信提供加密和身份认证SSL3.0有漏洞&#xff0c;被TLS取代基于TCP的协议工作原理 握手&#xff1a;客户端hello&#xff1b;服务器hello&#xff08;发送数字证书&#xff09;&#xff08;协商ssl版本&#xff0c;加密算法&#xff09;数据传输连接…

JS笔记

9.3 1.数据类型 1.1.Object 对象 对象&#xff1a;一切皆对象 面向过程&#xff1a;按照时间的发生顺序&#xff0c;从上往下依次执行 对象对象&#xff1a;指挥对象做某件事 1.2.数据类型的检测 1.3.数据类型转换 1.自动转换&#xff1a;js会通过关系运算符&#xff0c…

ai聊天软件哪个好用?分享5款实用的智能聊天软件

从文字到语音&#xff0c;再到现在的智能AI聊天软件&#xff0c;我们见证了沟通方式的不断演进。 每天&#xff0c;我们都需要与家人、朋友、同事进行交流&#xff0c;而AI聊天软件的出现&#xff0c;无疑为我们的对话增添了一抹智能色彩。 那么&#xff0c;ai聊天软件下载哪…

Kettle--发送邮件

目录 新建转换 执行成功 新建demo 作业job 发送邮件配置 邮件服务器&#xff1a; 授权码获得 以163邮箱为例 新建转换 执行成功 新建demo 作业job 发送邮件配置 确定发件人和收件人邮箱 服务器设置 邮件服务器&#xff1a; 邮件服务商SMTP服务器地址SMTP端口&#xff08;…

图像边缘检测技术详解:利用OpenCV实现Sobel算子

图像边缘检测技术详解&#xff1a;利用OpenCV实现Sobel算子 前言Sobel算子的原理代码演示结果展示结语 前言 在数字图像处理的广阔领域中&#xff0c;边缘检测技术扮演着至关重要的角色。无论是在科学研究、工业自动化&#xff0c;还是在日常生活中的智能设备中&#xff0c;我们…