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

news2024/9/28 13:27:07

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

前言

什么是 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: 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)⾥⼀起沟通。

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

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

相关文章

Elasticsearch之储存原理和优化

存储原理 上篇介绍了在 ES 内部索引的写处理流程&#xff0c;这个流程是在 ES 的内存中执行的&#xff0c;数据被分配到特定的分片和副本上之后&#xff0c;最终是存储到磁盘上的&#xff0c;这样在断电的时候就不会丢失数据。 具体的存储路径可在配置文件 ../config/elastics…

哨兵排序算法

代码展示 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h>#define MAXSIZE 20 //直接排序 typedef struct {int r[MAXSIZE 1];int length; } SqList; int InsertSort(SqList* L) {int i, j;for (i 2; i < L->length; i){if (L-…

10.2 TCP IP模型、IP协议、IPv4、子网掩码

TCP / IP 协议族 IP协议 IPv4地址 IPv4地址分类 子网掩码 子网掩码用来区分 网络地址 和 主机地址 真题 1

1024页 | 20万字详细讲解大数据系统平台设计

大数据引擎系统针对互联网业务系统对海量大数据的分布式存储、计算、 分析挖掘、建模及业务查询需求&#xff0c;通过提供基于分布式数据仓库的离线计算、实 时计算等服务&#xff0c;实现涵盖数据全生命周期的完整数据处理。大数据服务分系统主 要任务是构建大数据仓库&#x…

IP风险画像如何维护网络安全

在当今数字化时代&#xff0c;互联网已成为我们生活、工作不可或缺的一部分。然而&#xff0c;随着网络应用的日益广泛&#xff0c;网络安全问题也日益凸显。为了有效应对网络安全挑战&#xff0c;IP风险画像技术应运而生&#xff0c;正逐步成为构建网络安全新防线的重要工具。…

华为云征文|华为云Flexus X实例docker部署MinIO对象存储系统obs

华为云征文&#xff5c;华为云Flexus X实例docker部署MinIO对象存储系统obs 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体验跃级、面向中小企业和开发者打造的高品价比云服务产品。Flexus云服务器X实例是新一代面向中小企业和开发者打造的柔性算力…

深度学习从入门到精通——基于unet++算法实现细胞分割

模型定义 import torch from torch import nn__all__ [UNet, NestedUNet]class VGGBlock(nn.Module):def __init__(self, in_channels, middle_channels, out_channels):super().__init__()self.relu nn.ReLU(inplaceTrue)self.conv1 nn.Conv2d(in_channels, middle_channe…

matlab实现简单的保角变换

用虚数的思想可以在虚坐标系内绘制圆&#xff0c;同样可以用虚数的想法将这个圆进行变换 用MATLAB绘制一个坐标在(1,1)的圆代码如下 % 定义半径和圆心 radius 10; center 1 1i; % 圆心位于 (1,1) % 创建角度向量&#xff0c;从0到2*pi theta linspace(0, 2*pi, 100);% 计…

运算放大器组成的比较器

D1,D2为5.3V稳压管。运放输出高时&#xff0c;为6V.运放输入1V&#xff0c;运放正端为2V. 运放输出低时&#xff0c;为-6V&#xff0c;运放输入4V&#xff0c;运放正端约为2V&#xff0c;实测值2.03V

JavaScript 实现虚拟滚动技术

虚拟滚动 虚拟滚动&#xff08;有时称为 虚拟列表、虚拟滚动条&#xff09;是 JavaScript 中的一种技术&#xff0c;旨在优化大数据量的列表渲染&#xff0c;尤其是当有成千上万的数据项时&#xff0c;直接渲染整个列表会导致性能问题。虚拟列表通过只渲染用户视口中可见的那一…

【HuggingFace Transformers】OpenAIGPTModel源码解析

OpenAIGPTModel源码解析 1. GPT 介绍2. OpenAIGPTModel类 源码解析 说到ChatGPT&#xff0c;大家可能都使用过吧。2022年&#xff0c;ChatGPT的推出引发了广泛的关注和讨论。这款对话生成模型不仅具备了强大的语言理解和生成能力&#xff0c;还能进行非常自然的对话&#xff0c…

手机免费录屏软件,这3款软件最佳选择

在数字化浪潮的推动下&#xff0c;智能手机已成为我们生活中不可或缺的一部分。而在这些小巧而强大的设备中&#xff0c;录屏功能逐渐崭露头角&#xff0c;成为记录屏幕精彩瞬间的得力助手。无论是游戏的高光时刻、APP的使用教程&#xff0c;还是进行远程会议&#xff0c;录屏功…

2024自动化测试面试真题(附答案)!

一、编程语法题 1 、 python 有哪些数据类型 python 数据类型有很多&#xff0c;基本数据类型有整型&#xff08;数字&#xff09;、字符串、元组、列表、字典和布尔类型等 2 、怎么将两个字典合并 调用字典的 update 方法&#xff0c;合并 2 个字典。 3 、 json.l python 如…

HarmonyOS NEXT 体验调用云数据库更新排行榜单

一、介绍 基于鸿蒙Next模拟一个排行帮单二、场景需求 1.目标用户 社交平台用户&#xff0c;尤其是热衷于获取和分享信息的年轻人和用户群体。 2. 功能描述 用户可以通过“排行帮单”功能查看某个主题或领域的热门内容&#xff0c;并能够向朋友或群体推荐特定的项目。 3. 需求…

数据治理与标准推动数据成为“金矿”

方案介绍&#xff1a; 数据治理是一个涉及组织、政策、流程和技术的综合性框架&#xff0c;旨在确保数据的质量、安全性、可用性、合规性和一致性。它涵盖了从数据产生到销毁的全生命周期管理&#xff0c;确保数据在组织内部得到正确、高效地使用。而数据标准是数据治理的基石…

OPenCV结构分析与形状描述符(2)计算轮廓周长的函数arcLength()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算轮廓的周长或曲线的长度。 该函数计算曲线的长度或闭合轮廓的周长。 如果曲线是闭合的&#xff08;即首尾相连&#xff09;&#xff0c;则计…

CSS解析:层叠、优先级和继承

CSS虽说不是编程语言&#xff0c;但是日常使用中经常有很多误解&#xff0c;发现样式不奏效的情况&#xff0c;所以需要加强下CSS基础。 CSS本质上就是声明规则&#xff0c;即在各种条件下&#xff0c;我们希望产生特定的效果。 如果某个元素有这个类&#xff0c;则应用这些样…

英文翻译哪家强?2024年3款热门工具大比拼

现在世界变得越来越“小”&#xff0c;英语几乎成了大家都懂的语言。但对那些天天忙工作的小伙伴们来说&#xff0c;一大堆英文的东西&#xff0c;比如文件、邮件、会议记录&#xff0c;看着就头大。好在&#xff0c;科技帮了大忙&#xff0c;出了好多翻译工具。2024年&#xf…

php邮箱服务器怎么搭建?如何构建服务器?

php邮箱服务器配置教程指南&#xff1f;php邮件服务器如何搭建&#xff1f; 搭建一个稳定高效的php邮箱服务器&#xff0c;不仅可以提升邮件传输的效率&#xff0c;还能增强数据的安全性。那么&#xff0c;如何着手搭建这样一个服务器呢&#xff1f;AokSend将详细探讨php邮箱服…

使用YOLOv10训练自定义数据集之一(环境部署)

0x00 前言 由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10&#xff0c;通过优化模型结构并去除非极大值抑制&#xff08;NMS&#xff09;环节&#xff0c;提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领先的检测性能&#xff0c;还降低了对计算…