序言

什么是 Prompt Engineering

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

例如:

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

什么是 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),并配置:

BashipProtocal: "ipv4"

配置 AI 提示词润色插件

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

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

插件效果

示例要求⼀:

Bashcurl '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": "附近热门的旅游景点有故宫、天安门广场、恭王府等。
您对哪个景点更感兴趣呢?"...}

示例要求二:

Bashcurl '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您操持什么时候出发呢?不同的出行日期可能会有不同的票务情形和价格。
"...}

示例要求三:

Bashcurl '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: system content: "提问用户当前的地理位置信息是,国家:${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)⾥⼀起沟通。