Nacos托管LangChain应用Prompts和配置,助力你的AI助手快速进化

作者:濯光&于怀

前言:AI应用如何实现更好的配置管理?

AI 应用开发中,总有一些让人头疼的问题:敏感信息(比如 API-KEY)怎么安全存储?模型参数需要频繁调整怎么办?Prompt 模板改来改去,每次都得重启服务,太麻烦了!别急,今天我们就来聊聊如何用 Nacos 解决这些问题。

假设我们正在开发一个 AI 旅游助手,功能是根据用户给出的目的地指定相应的旅游计划。基于 LangChain 和 FastAPI 的代码实现如下所示:

python 复制代码
import asyncio

import uvicorn
from fastapi import FastAPI
from fastapi.routing import APIRoute
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel


class TextRequest(BaseModel):
    text: str

class AIAssistant:

    async def init(self):
        #初始化模型
        LLMParam = {
            "temperature": 0,
            "model_name": "qwen-turbo",
            "streaming": False,
            "openai_api_key": "sk-xxxxxxxxxx",
            "openai_api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1"
        }
        self.llm = ChatOpenAI(**LLMParam)
        template = (
            """请为{location}编写一份面向自由行游客的旅行指南。指南应包括以下部分:
                1. 简介:简要介绍该目的地的历史和文化背景。
                2. 主要景点:列出并简要描述几个主要景点。
                3. 推荐活动:推荐几个有趣的活动或体验。"""
        )
        #初始化prompt
        self.prompt = PromptTemplate.from_template(template)

    async def run(self):
        await self.init()
        app = FastAPI(
            debug=True,
            routes=[
                APIRoute("/call", endpoint=self.call,methods=["POST"]),
            ],
        )
        config = uvicorn.Config(
            app=app,
            host="0.0.0.0",
            port=80
        )
        server = uvicorn.Server(config=config)
        await server.serve()

    async def call(self, text: TextRequest):
        return self.llm.invoke(self.prompt.format(location=text.text)).content

async def main():
    server = AIAssistant()
    await server.run()

if __name__ == "__main__":
    asyncio.run(main())

这段代码看起来很简洁,对吧?但如果你把它放到生产环境中,很快就会发现一堆问题:

1. Prompt 模板无法快速迭代:AI 应用在实际使用过程中可能会随时提出修改 Prompt 模板的需求,在传统开发模式中,每次模板的修改都需要开发人员手动调整代码,并重新部署应用,效率较低。无法快速响应市场变化或用户反馈。**

2. 模型调用参数太死板:如果对模型调用的参数(如 temperature 等)进行修改,需要重新测试和部署应用。静态的参数管理方式难以适应业务灵活调整的需求,可能会导致生成内容的质量无法及时优化,影响用户体验。特别是在需要快速实验和迭代模型表现时,这种参数调整的滞后性会大大影响开发效率。

3. 敏感信息硬编码:当前代码中直接硬编码了 API-KEY 等敏感信息,存在严重的安全隐患。一旦代码泄露,攻击者可以轻松获取 API-KEY,非法访问相关服务,导致数据泄露和经济损失。

以上这些问题也是当前很多 AI 应用需要面对的问题。针对这些痛点,接下来我们一步步引入 Nacos,将他们逐一解决。

Nacos 是什么?

简单来说,Nacos 是阿里巴巴开源的一款注册配置中心产品,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 提供了丰富的多语言 SDK 支持,涵盖了 Java/Go/Python 等热门编程语言,在配置管理方面,Nacos 解决的一大痛点就是就是配置"动态"------你可以通过 Nacos 随时更新 AI 应用配置,而不用重启应用。

它能解决 AI 应用的什么问题?

1. Prompt 模板的快速迭代

Prompt 是生成式 AI 的核心,但它的优化往往需要多次试验。通过 Nacos 动态加载 Prompt 模板,你可以快速试错,响应业务变化。

2. Prompt 模板的灰度发布

Prompt 迭代时,直接全量上线可能导致不可预测的风险。借助 Nacos 灰度配置的能力,你可以将新 Prompt 先更新到部分 AI 应用的节点,验证其效果并收集反馈,降低全面上线的风险。

3. 模型参数的动态调整

温度(temperature)、最大生成长度(max_tokens)这些参数可能需要根据业务需求随时调整。有了 Nacos,你可以在界面上直接修改,实时生效!

4. 敏感信息的安全存储

AI 应用离不开 API-KEY 这种敏感信息,直接写在代码里不安全,放在配置文件里又不方便管理。Nacos 支持配置加密功能,通过对敏感配置进行加密存储,可以帮你安全地管理这些信息。

5. AI 应用各类配置的动态管理

除了 Prompt 以及模型动态参数,AI 应用中任何需要动态变更的配置都可以通过 Nacos 托管,例如 AI 应用的限流规则,用户输入的违禁词,访问 IP 地址的黑白名单等等,只需要在 Nacos 控制台上点击发布,就可以在应用中即时生效。

接下来就让我们通过AI导购的案例,手把手体验 Nacos 如何让你的 AI 应用从"原始社会"走向"现代化治理"。

环境准备

首先,我们需要在本地启动一个 Nacos 实例,通过以下步骤,我们可以通过 Nacos 的 Docker 镜像,在 Docker 容器中部署并使用 Nacos。

1. 下载 nacos-docker 项目

bash 复制代码
git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker

2. 执行 docker-compose 命令启动 Nacos

首次执行命令时,会自动下载所需的相关 Docker 镜像,需要等待的时长取决于网络速度。您也可以提前下载好相关镜像,以缩短执行部署命令的等待时间。

bash 复制代码
docker-compose -f example/standalone-derby.yaml up

3. 验证 Nacos 服务是否启动成功

通过 docker logs -f $container_id 命令,查看 Nacos 服务启动日志,如果看到如下日志,说明服务启动成功。

perl 复制代码
Nacos started successfully in xxxx mode. use xxxx storage

启动完成之后,我们就可以通过 http://localhost:8848 访问 Nacos 了

Nacos 托管 Prompt 实现快速迭代

在现代 AI 应用开发中,Prompt Engineering(提示工程)已经成为一个至关重要的环节。无论是构建对话系统、文本生成模型,还是复杂的多模态应用,Prompt 的设计和优化都直接影响了模型的表现。业务需求往往是快速变化的,如何高效地对 Prompt 进行动态调整成为了一个痛点。而 Nacos 配置中心支持了动态变更,历史版本等功能,通过将 Prompt 托管到 Nacos 上,即可利用 Nacos 的配置管理能力,实现对于 Prompt 模版的高效管理。

首先,我们要将 prompt 迁移到 Nacos 上。在 Nacos 控制台上创建一个配置文件,DataId 为 Prompt.template,Group 为默认的 DEFAULT_GROUP,内容为 Prompt 模版对应的内容:

markdown 复制代码
请为{location}编写一份面向自由行游客的旅行指南。指南应包括以下部分:
1. 简介:简要介绍该目的地的历史和文化背景。
2. 主要景点:列出并简要描述几个主要景点。
3. 推荐活动:推荐几个有趣的活动或体验。

然后,在代码中引入 Nacos 的 Python SDK(nacos-sdk-python),在 Prompt 初始化时读取对应的配置并对相应的配置进行监听,以便动态的感知并应用更改后的配置:

python 复制代码
import asyncio
import json

import uvicorn
from fastapi import FastAPI
from fastapi.routing import APIRoute
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel
from v2.nacos import ClientConfigBuilder, NacosConfigService, ConfigParam

class AIAssistant:
    async def init(self):
        LLMParam = {
            "temperature": 0,
            "model_name": "qwen-turbo",
            "streaming": False,
            "openai_api_key": "sk-xxxxxxxxx",
            "openai_api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1"
        }
        self.llm = ChatOpenAI(**LLMParam)

        #初始化Nacos配置客户端
        client_config = (ClientConfigBuilder()
                         .server_address("localhost:8848")
                         .build())
        config_client = await NacosConfigService.create_config_service(client_config)

        #获取Prompt内容并初始化
        template = await config_client.get_config(ConfigParam(
            data_id="Prompt.template",
            group="DEFAULT_GROUP"
        ))
        self.prompt = PromptTemplate.from_template(template)

        #监听Prompt变化
        await config_client.add_listener("Prompt.template", "DEFAULT_GROUP",
                                         self.PromptListener)

    async def PromptListener(self,tenant_id:str, group_id:str, data_id:str, content:str):
        self.prompt = PromptTemplate.from_template(content)

通过以上步骤,我们便实现了 Nacos 对于 Prompt 的托管,接下来就可以实现在 AI 应用运行时动态调整和迭代 Prompt 了,一起来体验下吧。

首先在 Nacos 控制台上设置 Prompt 为以下内容并启动应用:

markdown 复制代码
请为{location}编写一份面向自由行游客的旅行指南。指南应包括以下部分:
1. 简介:简要介绍该目的地的历史和文化背景。
2. 主要景点:列出并简要描述几个主要景点。
3. 推荐活动:推荐几个有趣的活动或体验。

执行下面的命令,调用对应的 AI 助手:

json 复制代码
curl -X POST "http://127.0.0.1:80/translate" -H "Content-Type: application/json" -d '{"text": "上海"}'

应用返回内容为:

可以发现,AI 助手根据我们输入的目的地上海给出了对应的旅游计划。

但是,现在我们觉得 AI 助手提供的计划显得略微有点啰嗦,我们希望返回内容能够精炼一点,此外,我们希望能够以结构化的格式进行返回,方便用户进行查阅。因此我们要对 Prompt 进行修改。没有 Nacos 时,我们需要修改代码并重启应用,而将 Prompt 托管到 Nacos 上之后,我们只需要在 Nacos 控制台上修改对应的 Prompt 内容为:

markdown 复制代码
请为{location}编写一份面向自由行游客的旅行指南,要求内容尽量精炼,指南应遵循以下结构:
1. 简介(一段话):简要介绍该目的地的历史和文化背景。
2. 主要景点(表格形式):列出并简要描述几个主要景点。
3. 推荐活动(表格形式):推荐几个有趣的活动或体验。

执行以下命令:

json 复制代码
curl -X POST "http://127.0.0.1:80/call" -H "Content-Type: application/json" -d '{"text": "上海"}'

返回结果为:

可以发现,模型翻译的结果根据我们 Prompt 的要求做了相应的调整, Prompt 变更成功生效了。

Nacos 还支持变更历史历史,在历史版本界面,可以查看所有使用过的历史 Prompt 版本,并进行回滚,这样即使 Prompt 效果不够满意,也可以一键复原:

Nacos 托管模型调用参数实现动态调优

在使用 AI 模型时,调用参数(如温度、最大长度等)直接影响输出效果。固定参数难以满足多样化任务需求,可能导致资源浪费或用户体验不佳。动态管理模型调用参数能够根据任务特点和用户需求灵活调整,优化资源利用,提升输出质量和用户满意度,从而更好地适应复杂多变的场景。接下来,我们将介绍如何通过 Nacos 动态管理模型调用参数

和 Prompt 托管类似,我们需要将模型调用参数迁移到 Nacos。我们在 Nacos 中创建一个配置文件,DataId 为 LLMParam.json,Group 为默认的 DEFAULT_GROUP,内容为模型调用所需要的参数

json 复制代码
{
    "temperature": 0,
    "model_name": "qwen-turbo",
    "streaming": false,
    "openai_api_key": "sk-xxxxxxxx",
    "openai_api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1"
}

然后,同样的在模型初始化时读取对应的模型调用参数配置,并对响应的配置进行监听,以便动态的感知并应用更改后的模型调用参数

python 复制代码
import asyncio
import json

import uvicorn
from fastapi import FastAPI
from fastapi.routing import APIRoute
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel
from v2.nacos import ClientConfigBuilder, NacosConfigService, ConfigParam

class AIAssistant:
    async def init(self):
        #初始化Nacos配置客户端
        client_config = (ClientConfigBuilder()
                       .server_address("localhost:8848")
                       .build())
        config_client = await NacosConfigService.create_config_service(client_config)

        #获取模型调用参数并初始化
        LLMParamContent = await config_client.get_config(ConfigParam(
            data_id="LLMParam.json",
            group="DEFAULT_GROUP"))
        LLMParam = json.loads(LLMParamContent)
        self.llm = ChatOpenAI(**LLMParam)

        template = await config_client.get_config(ConfigParam(
            data_id="Prompt.template",
            group="DEFAULT_GROUP"
        ))
        self.prompt = PromptTemplate.from_template(template)

        #监听Prompt变化
        await config_client.add_listener("Prompt.template", "DEFAULT_GROUP",
                                         self.PromptListener)
        #监听对应的配置,动态感知变化
        await config_client.add_listener("LLMParam.json", "DEFAULT_GROUP",
                                   self.LLMParamListener)

    async def LLMParamListener(self,tenant_id:str, group_id:str, data_id:str, content:str):
        LLMParam = json.loads(content)
        self.llm = ChatOpenAI(**LLMParam)

    async def PromptListener(self,tenant_id:str, group_id:str, data_id:str, content:str):
        self.prompt = PromptTemplate.from_template(content)

通过以上几步,我们便将模型调用参数托管到了 Nacos 上,现在,你可以直接在 Nacos 控制台修改 temperaturemodel_name,而无需重启应用。让我们来看看效果。

首先我们在 Nacos 控制台上将模型的 model_name 设置为 qwen-turbo:

Prompt设置为:

复制代码
请为{location}编写一份城市介绍,要求内容尽量精要,五句话以内。

通过 localhost:80 接口调用模型:

json 复制代码
curl -X POST "http://127.0.0.1:80/call" -H "Content-Type: application/json" -d '{"text": "上海"}'

模型返回结果为:

复制代码
上海,中国东部沿海城市,地处长江入海口,是国际经济、金融、贸易和航运中心。融合传统与现代,外滩的万国建筑与陆家嘴的摩天大楼交相辉映。拥有丰富文化底蕴,豫园、田子坊展现老上海风情。作为科技创新热土,张江高科技园区聚集众多研发机构。美食荟萃,小笼包、生煎等特色小吃闻名遐迩

而当我们想调整模型调用参数,将后端模型调整为 deepseek-r1 时,只需要在 Nacos 控制台上将调用参数的 model_name 设置为 deepseek-r1:

再次调用接口,返回的内容为:

arduino 复制代码
上海,中国国际化大都市,国家经济、金融、贸易中心,长江入海口的世界级港口城市。外滩万国建筑群与陆家嘴摩天楼群交相辉映,演绎着百年沧桑与当代奇迹的时空对话。作为江南文化、海派文化与全球文明交融之地,石库门弄堂与当代艺术展馆并存,传统本帮菜与国际米其林餐厅共生。中国国际进口博览会永久举办地,特斯拉超级工厂、迪士尼乐园等外资地标彰显开放胸襟。2022年GaWC世界城市排名位列全球第五,持续演绎着"魔都"的非凡魅力。

可以发现后端模型返回的内容风格发生了比较浓烈的变化,返回的内容也有比较大的区别。除了 model_name 等参数之外,还可以通过 Nacos 动态更换调用模型的 API-KEY 等调用凭证,实现凭证的轮转。

现在,通过 Nacos,你可以根据业务需求,轻松地动态变更模型调用参数,即使生效而无需重启应用。

进阶应用

通过将 Prompt 以及模型调用参数托管到 Nacos 配置中心,我们实现了 AI 应用运行时的 Prompt 快速迭代以及模型调用参数的动态调整。但是,在 AI 应用配置管理的过程中,大家可能还存在这样的需求:

  • 灰度发布: Prompt 或者模型调用参数更新上线时,直接全量上线可能导致不可预测的风险,希望先在小部分节点进行灰度验证,确认无风险后再全量推送。
  • 敏感信息安全存储: 模型调用参数中包含了密钥等敏感机密的信息,明文存储可能存在泄露的风险,会造成很大的损失,要保证敏感信息存储的安全性。

而 Nacos 除了配置变更动态生效的基础能力之外,还提供了灰度发布、配置加密等功能,让我们来看看如何利用 Nacos 配置管理的高阶能力来帮助AI应用进一步的进化吧。

基于 Nacos 实现 Prompt 灰度发布

在 AI 应用中,当需要更新 Prompt 以优化模型输出时,直接全量上线可能导致不可预测的风险,新 Prompt 可能在真实用户场景中表现不佳,导致回答错误或用户体验下降,因此我们可以借助 Nacos 灰度配置的能力,通过灰度发布,将新 Prompt 先更新到部分 AI 应用的节点,验证其效果并收集反馈,降低全面上线的风险。Nacos 原生支持 IP 灰度发布的能力,而 MSE Nacos 是阿里云微服务引擎(Microservice Engine,简称 MSE) 提供的一个基于 Nacos 的托管服务,在配置灰度方面的能力更加全面,支持多版本标签灰度,接下来我们将基于 Mse Nacos,演示如何进行 Prompt 的灰度发布。

我们将 LLMTranslator 代码复制一份,在创建 Nacos 客户端时分别指明客户端的标签为 app=demo1 以及 app=demo2

less 复制代码
#节点一初始化Nacos配置客户端
client_config = (ClientConfigBuilder()
               .server_address("localhost:8848")
               .app_conn_labels({"app":"demo1"})
               .build())
config_client = await NacosConfigService.create_config_service(client_config)
less 复制代码
#节点二初始化Nacos配置客户端并制定标签
client_config = (ClientConfigBuilder()
               .server_address("localhost:8848")
               .app_conn_labels({"app":"demo2"})
               .build())
config_client = await NacosConfigService.create_config_service(client_config)

Nacos 中 Prompt.template 配置的内容为:

复制代码
请列出{location}的三个主要旅游景点,每个景点一句话介绍

分别以端口 80 和 90 启动两个应用节点,并执行以下命令调用:

makefile 复制代码
curl -X POST "http://127.0.0.1:80/call" -H "Content-Type: application/json" -d '{"text": "上海"}'
#AIAssistant1返回结果
1. 外滩:作为上海的标志性景观之一,外滩以其壮观的历史建筑群和黄浦江对岸现代摩天大楼的对比景色而闻名。
2. 东方明珠广播电视塔:位于浦东新区,不仅是上海最具代表性的地标之一,也是观光客可以俯瞰整个城市美景的好去处。
3. 豫园及城隍庙地区:这是一处集古典园林、传统商店与小吃于一体的旅游区,让游客能够体验到老上海的文化魅力。

curl -X POST "http://127.0.0.1:90/call" -H "Content-Type: application/json" -d '{"text": "上海"}'
#AIAssistant2返回结果
1. 外滩:作为上海的标志性景点之一,外滩以其壮观的历史建筑群和对岸浦东现代化高楼林立的天际线而闻名。
2. 东方明珠广播电视塔:位于浦东新区陆家嘴,不仅是上海最具标志性的现代建筑之一,也是观光、餐饮及娱乐的好去处。
3. 豫园及城隍庙:这是一处融合了古典园林美与传统商业街氛围的历史文化名胜区,其中豫园是明代风格的私人花园,周围则是热闹非凡的老街区。

可以发现,由于采用的 Prompt 相同,目前两个节点返回的推荐结果的内容和风格是基本一致的。

接下来,我们希望对 Prompt 进行迭代,除了给出旅游景点之外,还要对当地的美食进行介绍。为了防止全量上线引发的不可控风险,我们在 Nacos 控制台上进行灰度发布。

我们打开编辑配置界面,选中基于标签灰度发布,选择灰度版本名称为 gray1,应用节点标签键为 app,值为 demo1,代表选中了 app=demo1 的节点,代表灰度 Prompt 对 AIAssistant1 生效。配置内容为:

复制代码
请列出{location}的三个主要旅游景点,以及三种特色美食,每个一句话介绍

点击发布后,无需重启应用,再次执行以下命令调用:

markdown 复制代码
curl -X POST "http://127.0.0.1:80/call" -H "Content-Type: application/json" -d '{"text": "上海"}'
#AIAssistant1返回结果
上海的三个主要旅游景点及其简介如下:
1. **外滩**:位于黄浦江畔,是上海最具标志性的风景之一,这里不仅能够欣赏到历史悠久的"万国建筑博览群",还能远眺对岸现代化的陆家嘴金融区。
2. **东方明珠广播电视塔**:作为上海乃至中国的地标性建筑之一,东方明珠塔不仅是观光的好去处,其内部还设有多个展览馆、旋转餐厅等设施,让游客在享受美景的同时也能体验文化与美食。
3. **豫园及城隍庙**:这是一处集古典园林艺术与传统文化于一体的综合性旅游区,其中豫园以其精美的园林布局闻名,而周边的老街则汇集了各式各样的传统手工艺品和小吃。
三种特色美食及其简介如下:
1. **小笼包**:一种源自上海的传统点心,以其薄皮大馅、汤汁丰富著称,吃时需小心烫口,但那鲜美无比的味道让人难以忘怀。
2. **生煎**:又名生煎馒头,在底部煎得金黄酥脆的同时保持上面部分柔软多汁,内里包裹着猪肉馅料,搭配特制蘸酱食用更佳。
3. **红烧肉**:虽然红烧肉在全国各地都有制作,但是上海版本以其色泽红亮、肥而不腻的特点尤为著名,通过长时间慢炖使得五花肉充分吸收调料精华,味道醇厚。

curl -X POST "http://127.0.0.1:90/call" -H "Content-Type: application/json" -d '{"text": "上海"}'
#AIAssistant2返回结果
1. 外滩:作为上海的标志性景观之一,外滩以其壮观的历史建筑群和黄浦江对岸现代摩天大楼的对比景色而闻名。
2. 东方明珠广播电视塔:位于浦东新区,不仅是上海最具代表性的地标之一,也是观光客可以俯瞰整个城市美景的好去处。
3. 豫园及城隍庙:这是一处融合了古典园林美与传统商业街氛围的历史文化名胜区,其中豫园是明代风格的私人花园,周围则是热闹非凡的老街区。

可以发现,两个节点返回的翻译结果风格不一样了,灰度 Prompt 已经在 AIAssistant1 上生效了。

当我们对改动后的 Prompt 验证完成后,就可以全量发布,推平所有的线上节点:

再次执行以下命令调用:

markdown 复制代码
curl -X POST "http://127.0.0.1:80/call" -H "Content-Type: application/json" -d '{"text": "上海"}'
#AIAssistant1返回结果
上海的三个主要旅游景点及其简介如下:
1. **外滩**:位于黄浦江畔,是上海最具标志性的风景之一,这里不仅能够欣赏到历史悠久的"万国建筑博览群",还能远眺对岸现代化的陆家嘴金融区。
2. **东方明珠广播电视塔**:作为上海乃至中国的地标性建筑之一,东方明珠塔不仅是观光的好去处,其内部还设有多个展览馆、旋转餐厅等设施,让游客在享受美景的同时也能体验文化与美食。
3. **豫园及城隍庙**:这是一处集古典园林艺术与传统文化于一体的综合性旅游区,其中豫园以其精美的园林布局闻名,而周边的老街则汇集了各式各样的传统手工艺品和小吃。
三种特色美食及其简介如下:
1. **小笼包**:一种源自上海的传统点心,以其薄皮大馅、汤汁丰富著称,吃时需小心烫口,但那鲜美无比的味道让人难以忘怀。
2. **生煎**:又名生煎馒头,在底部煎得金黄酥脆的同时保持上面部分柔软多汁,内里包裹着猪肉馅料,搭配特制蘸酱食用更佳。
3. **红烧肉**:虽然红烧肉在全国各地都有制作,但是上海版本以其色泽红亮、肥而不腻的特点尤为著名,通过长时间慢炖使得五花肉充分吸收调料精华,味道醇厚。

curl -X POST "http://127.0.0.1:9080/call" -H "Content-Type: application/json" -d '{"text": "上海"}'
#AIAssistant2返回结果
上海的三个主要旅游景点及其特色如下:
1. **外滩**:位于黄浦江畔,是上海最著名的地标之一,以其历史悠久的欧式建筑群和对岸现代化的陆家嘴天际线而闻名。
2. **东方明珠广播电视塔**:不仅是上海的象征性建筑之一,也是亚洲第六高的电视塔,游客可以登顶欣赏到整个上海市区的壮观景色。
3. **豫园及城隍庙**:这是一处融合了古典园林与传统商业街的综合景区,其中豫园展示了精美的江南园林艺术,而周围的城隍庙街区则以售卖各种手工艺品、小吃等著称。
上海三种特色美食介绍如下:
1. **小笼包**:小巧玲珑、皮薄馅多汁的小笼包是上海非常受欢迎的传统点心之一,吃时需小心咬开一个小口先吸汤汁再品尝肉馅。
2. **生煎馒头(生煎)**:底部金黄酥脆、顶部柔软、内里鲜美多汁的生煎馒头是另一种极具地方特色的面食小吃。
3. **红烧肉**:作为一道经典本帮菜,红烧肉以其色泽红亮、味道醇厚、肥而不腻的特点深受人们喜爱。

可以发现,两个节点返回的推荐风格一致,新版本的 Prompt 已经全量推平。而如果灰度发布的过程中出现任何问题,也可以选择停止灰度。

通过 Nacos 的灰度配置功能,我们实现了 Prompt 从灰度上线到全量推平的全过程,确保了 Prompt 迭代过程中的稳定性。

Nacos配置加密,支持敏感信息安全存储

模型调用参数中包含了访问模型的 API-KEY 等敏感信息,如果敏感信息以明文形式存储或传输,容易成为黑客攻击的目标,导致数据泄露或系统被滥用。这些信息一旦泄露,可能对用户隐私、企业安全和系统稳定性造成严重影响。Nacos 配置中心支持配置加密功能,可以对存放在 Nacos 上的敏感信息从存储到传输的全链路加密,大大提高安全性。

MSE Nacos 更进一步,和阿里云秘钥管理服务 KMS 合作,支持对配置进行安全等级更高的非对称加密。针对数据安全隐患,MSE Nacos 可为敏感配置提供满足国家三级等保中数据安全要求的解决方案。

因此,我们可以将模型调用参数,通过加密配置在 MSE Nacos 上进行对应的托管:

通过这样的方式,可以确保配置信息在传输和存储的过程中均为密文的形式,大大提高安全性。

配置加密的具体使用方式,请参见《配置加密》文档

结语

AI 时代下,应用快速迭代和演进的特点对AI场景下的配置管理提出了新的要求。 Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理的平台,在多种场景中得到了广泛的应用。经过阿里多年双十一超大规模场景的锤炼, Nacos 在配置管理领域沉淀了丰富的经验和最佳实践。从配置变更动态生效到灰度发布,从历史版本回滚到敏感信息的安全存储,通过和 Nacos 相结合, AI 应用可以实现自身的快速迭代和不断进化,创造出更大的价值,本文的示例也说明了这一点。而根据不可靠消息透露,阿里和字节内部也已经接入 Nacos 进行 AI 应用的配置管理。

近期,Nacos 3.0-BETA 版本也已经重磅发布,在安全性方面显著提升,同时增加了分布式锁,模糊订阅等新特性,欢迎各位体验使用。未来,Nacos 将会进一步探索和 AI 场景的结合,Nacos 社区也正在和 Higress 社区合作,探索存量应用转化为 MCP 协议提供服务,敬请期待。

相关链接

【1】Nacos 官网

nacos.io

【2】Nacos Github 主仓库

github.com/alibaba/nac...

【3】生态组仓库

github.com/nacos-group

【4】MSE 配置灰度发布

help.aliyun.com/zh/mse/user...

Nacos 多语言生态仓库:

【1】Nacos-GO-SDK

github.com/nacos-group...

【2】Nacos-Python-SDK

github.com/nacos-group...

【3】Nacos-Rust-SDK

github.com/nacos-group...

【4】Nacos C# SDK

github.com/nacos-group...

【5】Nacos C++ SDK

github.com/nacos-group...

【6】Nacos PHP-SDK

github.com/nacos-group...

【7】Rust Nacos Server

github.com/nacos-group...

推荐阅读:

Nacos 安全零信任实践

MSE Nacos:解决敏感配置的安全隐患

《配置加密》

help.aliyun.com/zh/mse/user...

相关推荐
butiehua02023 小时前
Docker 命令大全:从入门到精通
docker·云原生·eureka
阿里云云原生7 小时前
IngressNightmare:Ingress Nginx 再曝5个安全漏洞,可接管你的 K8s 集群
云原生
阿里云云原生10 小时前
不断突破极致:SPL新版数据加工能力焕新登场
云原生
运维博客团11 小时前
搭建K8S-1.23
云原生·容器·kubernetes
神奇的海马体14 小时前
ZooKeeper集群部署(容器)
分布式·zookeeper·云原生
基哥的奋斗历程19 小时前
Kubernetes 存储 Downward API
云原生·容器·kubernetes
程序边界1 天前
AIGC时代Kubernetes企业级云原生运维实战:智能重构与深度实践指南
云原生·kubernetes·aigc
lzz的编码时刻1 天前
K8s私有仓库拉取镜像报错解决:x509 certificate signed by unknown authority
云原生·容器·kubernetes
{⌐■_■}1 天前
【Kubernetes】RBAC(基于角色的访问控制)如何设置?如何管理 Kubernetes 的权限?
云原生·容器·kubernetes