news 2026/5/5 9:38:28

基于AWS Cognito与RAG技术构建安全智能搜索系统的实践指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于AWS Cognito与RAG技术构建安全智能搜索系统的实践指南

1. 项目概述:当AI搜索遇上Cognito,一个开源项目的诞生

最近在折腾一个很有意思的玩意儿,叫kekePower/cognito-ai-search。光看这个名字,可能有点云里雾里,但如果你同时接触过AWS的Cognito用户管理和当下火热的AI搜索,大概就能猜到它的核心价值了。简单来说,这是一个开源项目,它把AWS Cognito这个强大的身份认证服务,和AI驱动的智能搜索能力给“焊”在了一起。

为什么说这事儿有意思?因为在实际开发中,我们常常面临一个两难境地:一方面,我们需要为应用构建安全、可扩展的用户认证体系,Cognito几乎是云原生应用在这方面的首选;另一方面,我们又希望应用具备现代化的、类似ChatGPT那样的自然语言搜索体验,让用户能用大白话找到他们想要的内容。但这两者往往是割裂的——认证归认证,搜索归搜索。cognito-ai-search的出现,就是为了弥合这个鸿沟。它让你能在已经用Cognito保护起来的应用里,快速、安全地集成一个AI搜索后端,用户登录后,就能直接享受智能问答的便利。

这个项目特别适合那些已经跑在AWS上、用户体系基于Cognito,并且拥有大量结构化或非结构化数据(比如产品文档、知识库、内部wiki、客服对话记录)的团队。想象一下,你的用户登录后,不再需要翻找复杂的菜单或记住精确的关键词,只需要在搜索框里输入“上个月我提交的那个关于支付失败的工单后来怎么处理的?”,AI就能理解他的意图,结合他的身份(知道他是谁),从海量数据中精准定位并给出答案。这不仅仅是搜索体验的升级,更是产品智能化水平的一个标志性跨越。

2. 核心架构与设计思路拆解

2.1 为什么是Cognito + AI搜索?

要理解这个项目的设计,得先拆开看它的两个核心组件:AWS Cognito和AI搜索。

AWS Cognito 是亚马逊云科技提供的一个完整的用户身份服务。它帮你处理用户注册、登录、多因素认证(MFA)、社交账号登录(如Google、Facebook),甚至精细化的权限控制。对于开发者来说,最大的好处是省心。你不用自己从头搭建一套用户系统,不用担心密码安全存储、会话管理这些繁琐且容易出错的事情。Cognito 提供了标准的OAuth 2.0和OpenID Connect (OIDC) 端点,你的前端应用(Web或移动端)可以轻松集成,获取安全的访问令牌(Access Token和ID Token)。这个令牌,就是用户身份的“数字护照”。

AI搜索,在这里通常指的是基于大语言模型(LLM)的检索增强生成(RAG, Retrieval-Augmented Generation)技术。传统的搜索是基于关键词匹配,你搜“苹果”,它可能返回水果苹果和苹果公司。而AI搜索能理解语义,你问“有什么水果是红色的?”,它能理解你的意图,并找到“苹果”、“草莓”等相关内容。RAG技术更进一步:它先从一个庞大的知识库(你的数据)中检索出与问题最相关的文档片段,然后把这些片段作为上下文,喂给LLM,让LLM生成一个准确、基于你私有数据的回答。这样既利用了LLM的理解和生成能力,又保证了答案的事实准确性,避免了LLM“胡编乱造”。

那么,把这两者结合的逻辑就非常清晰了:

  1. 安全边界:应用的数据和功能受Cognito保护,只有合法登录的用户才能访问。
  2. 个性化搜索:用户的身份信息(如用户ID、所属用户组、自定义属性)可以从Cognito的ID Token中获取。这些信息可以作为AI搜索的上下文或过滤器。例如,一个普通员工和一个经理搜索“公司财报”,AI返回的信息范围和详细程度可以不同。
  3. 统一体验:用户在一个地方登录,即可无缝使用所有功能,包括高级的AI搜索,体验流畅。

cognito-ai-search项目本质上就是搭建了一个桥梁。它接收来自前端(已通过Cognito认证)的请求,验证其令牌的有效性,然后代表该用户,去执行对向量数据库的检索和向LLM的提问,最后将安全、个性化的答案返回给前端。

2.2 技术栈选型与权衡

一个典型的cognito-ai-search后端实现,其技术栈选择背后都有深入的考量。虽然具体实现可能因人而异,但核心组件通常包括:

  • 后端框架FastAPI是当前最热门的选择,没有之一。原因在于其极高的性能(基于Starlette和Pydantic)、直观的异步支持(async/await)以及对OpenAPI(Swagger)的自动生成。这对于需要处理并发搜索请求、并且希望提供清晰API文档的项目来说,是完美匹配。相比传统的Flask或Django,FastAPI在构建这类API优先的微服务时,开发和运行效率都更高。
  • 向量数据库:这是RAG的“记忆体”。PineconeWeaviate是云服务的代表,开箱即用,擅长管理海量向量。ChromaQdrant则是开源自托管的热门选项。选择哪一款,取决于团队规模和数据量。对于初创项目或数据量中等的情况,Chroma以其轻量和易用性胜出;如果需要处理亿级向量和复杂过滤,Qdrant的性能更优;如果不想操心运维,Pinecone的托管服务很省心。项目可能会提供与多种向量数据库的适配层。
  • 大语言模型(LLM)OpenAI的GPT系列Anthropic的Claude是闭源但能力强大的首选,API调用简单,效果有保障。开源方面,Llama 2/3Mistral系列模型通过OllamavLLM等工具本地部署,提供了数据隐私和成本可控的选项。选型时需要在“效果与成本”、“便利与隐私”之间做权衡。项目设计时通常会抽象一个LLM调用层,方便切换不同的模型提供商。
  • 嵌入模型:负责将文本(无论是用户问题还是知识库文档)转换为向量。OpenAI的text-embedding-ada-002或更新的模型是标杆。开源模型如BGEE5系列也表现优异,可以本地部署。关键是要保证检索的准确性,嵌入模型的质量至关重要。
  • 基础设施:由于深度集成AWS Cognito,整个后端很自然地会部署在AWS Lambda(无服务器函数)或Amazon ECS/Fargate(容器服务)上。配合API Gateway管理API访问,Secrets Manager保管API密钥,形成一个典型的、安全且弹性的云原生架构。

注意:技术选型不是追求最时髦,而是追求最适合。对于一个旨在“快速集成”的开源项目,它的默认配置或推荐配置,一定会倾向于选择那些文档丰富、社区活跃、集成简单的组件,以降低使用者的门槛。例如,它可能默认使用Chroma(易部署)和OpenAI API(易调用),并提供扩展点让你替换成其他组件。

3. 核心工作流程与模块解析

3.1 端到端请求生命周期

理解一个请求如何走完全程,是掌握这个项目的关键。我们假设一个用户在前端输入了一个问题:“我们公司今年的年假政策有什么新变化?”

  1. 前端请求:前端应用(如React/Vue)的用户已经登录,并持有Cognito颁发的有效ID Token和Access Token。前端将用户的问题和这个Access Token一起,发送到cognito-ai-search的后端API(例如POST /search)。
  2. 令牌验证与用户解析:后端API的第一个关键环节就是令牌验证。它会将接收到的Access Token发送到Cognito的userinfo端点或直接使用AWS SDK进行验证。这一步确认了令牌是否有效、是否过期、是否被篡改。验证通过后,后端可以从令牌中解析出用户的唯一标识(sub)、用户名、邮箱以及任何在Cognito中预设的自定义属性(Custom Attributes),比如department: Engineeringrole: Manager
  3. 查询理解与向量化:后端提取出用户的问题文本,然后调用嵌入模型(Embedding Model),将这段自然语言转换为一个高维度的向量(一组数字)。这个向量在数学空间中的“位置”,就代表了这个问题语义。
  4. 上下文感知检索:这是体现“Cognito集成”价值的一步。后端使用上一步得到的“问题向量”,去查询向量数据库。但查询不是盲目的,它会将第二步解析出的用户属性作为元数据过滤器。例如,查询语句可能是:“寻找与‘[问题向量]’最相似的文档,并且这些文档的accessible_departments元数据字段包含 ‘Engineering’ 或者 ‘All’”。这样就确保了检索到的文档片段,不仅是语义相关的,也是该用户有权访问的。
  5. 提示工程与LLM调用:检索到最相关的几个文档片段(例如,3-5段,每段200字左右)后,后端会精心构造一个提示词(Prompt),其结构通常如下:
    你是一个专业的助手,请根据以下上下文信息回答问题。如果上下文信息不足以回答问题,请直接说“根据提供的信息,我无法回答这个问题”。 上下文信息: {这里插入检索到的文档片段1} {这里插入检索到的文档片段2} ... 用户问题:{用户原始问题} 请用中文友好、清晰地回答:
    这个提示词,连同用户的原始问题,被发送给选定的LLM(如GPT-4)。
  6. 响应生成与返回:LLM基于提供的上下文,生成一个准确、连贯的回答。后端将这个回答,可能连同用于生成答案的“参考来源”(即检索到的文档片段标题或ID),一起包装成JSON格式,返回给前端。
  7. 前端展示:前端收到回答后,将其渲染展示给用户。整个流程在几秒内完成,用户感受到的就是一个即时、准确、安全的智能问答。

3.2 关键模块深度剖析

认证与授权中间件这是项目的安全基石。在FastAPI中,通常会实现一个依赖项(Dependency),比如get_current_user。这个依赖项会:

  • 从请求头中提取Authorization: Bearer <token>
  • 使用AWS SDK(如boto3)或直接调用Cognito的JWK(JSON Web Key)端点来验证令牌签名。
  • 解码并验证令牌的受众(aud)、签发者(iss)和过期时间(exp)。
  • 将解码后的用户信息(claims)注入到路由处理函数中,供后续步骤使用。
  • 实操心得:一定要缓存Cognito的JWK公钥,因为它们是相对稳定的。每次请求都去远程获取会严重增加延迟。可以设置一个内存缓存(如TTL为24小时)来存储这些公钥。

检索器检索器的核心是相似度搜索算法,最常见的是余弦相似度。向量数据库已经高效地实现了这一点。但关键在于检索策略

  • 多路检索:除了用整个问题向量检索,还可以尝试将问题拆分成关键词,或用不同嵌入模型分别检索,再合并结果,以提高召回率。
  • 重排序:初步检索出Top K个结果(比如20个)后,可以使用一个更精细但更慢的重排序模型(如Cohere的rerank模型)对它们进行二次排序,选出最相关的Top N个(比如5个)送给LLM,这能显著提升最终答案的质量。
  • 元数据过滤设计:在向向量数据库存入文档时,就必须精心设计元数据字段。例如,除了accessible_departments,还可能有document_type(政策/指南/公告)、effective_dateauthor等。灵活的过滤能力是实现精细化权限和搜索的基础。

提示工程与LLM交互层这是决定答案质量的“临门一脚”。一个好的提示词模板需要反复调试:

  • 角色设定:让LLM扮演什么角色?(“专业HR助手”、“技术支持专家”)
  • 指令清晰:明确告诉LLM该做什么,不该做什么(如“只基于上下文回答”、“不知道就说不知道”)。
  • 上下文格式化:如何将多个文档片段清晰地区分开?可以用--- Document [id] ---这样的分隔符。
  • 温度参数:对于事实性问答,通常设置较低的温度(如0.1),让输出更确定、更少创造性。对于创意性任务,则可以调高。
  • 实操心得:将提示词模板化、配置化。不要将提示词硬编码在代码里。可以将其放在配置文件或数据库中,这样无需重新部署代码,就能调整提示词策略。同时,强烈建议对所有发送给LLM的提示词和接收到的回答进行日志记录(注意脱敏),这对于调试和优化至关重要。

4. 从零开始:部署与配置实操指南

4.1 环境准备与基础设施搭建

假设我们从头开始部署一个cognito-ai-search的实例。以下是基于AWS环境的典型步骤:

  1. 创建AWS Cognito用户池

    • 登录AWS控制台,进入Cognito服务。
    • 创建用户池,选择“电子邮件”或“电话号码”作为登录标识符。为简化,可以先不启用MFA。
    • 在“属性”部分,添加自定义属性。例如,添加一个名为department的字符串属性,用于后续的权限过滤。
    • 记下用户池ID(如us-east-1_xxxxxxxxx)和区域。
    • 创建一个应用客户端,生成客户端ID和密钥。注意勾选“启用客户端密钥”以支持服务器端认证流。
    • 在“应用集成”->“域名”中,设置一个易于记忆的域名用于登录主机。
  2. 准备知识库数据并向量化

    • 这是最耗时但最重要的一步。收集所有需要被搜索的文档(PDF、Word、Markdown、网页等)。
    • 使用文本加载库(如langchainDocumentLoaderunstructured库)将这些文档转换成纯文本。
    • 对长文本进行分块。简单的按字符数分割(如每500字符一块)效果往往不好。更好的方法是使用语义分割,例如基于句子或自然段落,并设置一定的重叠区(如50字符),以确保上下文连贯。langchainRecursiveCharacterTextSplitter是一个不错的起点。
    • 选择一个嵌入模型。如果追求效果和便利,使用OpenAI的text-embedding-3-small。你需要一个OpenAI API密钥。
    • 编写一个脚本,遍历所有文本块,调用嵌入模型API获取每个块的向量,然后连同元数据(如来源文件名、分块ID、预设的访问部门属性等)一起,存入你选择的向量数据库(如Chroma)。
    # 示例:使用 LangChain 和 Chroma 的简化数据准备脚本 from langchain_community.document_loaders import DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma # 1. 加载文档 loader = DirectoryLoader('./knowledge_base/', glob="**/*.md") documents = loader.load() # 2. 分割文档 text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50, separators=["\n\n", "\n", "。", "!", "?", ";"] ) splits = text_splitter.split_documents(documents) # 3. 为每个分块添加元数据(例如,假设所有文档市场部都可访问) for i, split in enumerate(splits): split.metadata["accessible_departments"] = ["Marketing", "All"] split.metadata["chunk_id"] = i # 4. 创建向量存储 embeddings = OpenAIEmbeddings(model="text-embedding-3-small", openai_api_key=your_key) vectorstore = Chroma.from_documents( documents=splits, embedding=embeddings, persist_directory="./chroma_db" # 持久化到本地目录 ) print("向量数据库构建完成!")
  3. 部署后端服务

    • cognito-ai-search项目代码克隆到本地。
    • 配置环境变量。项目通常会有一个.env.example文件,你需要创建自己的.env文件并填写:
      AWS_REGION=us-east-1 COGNITO_USER_POOL_ID=us-east-1_xxxxxxx COGNITO_APP_CLIENT_ID=xxxxxxxxxxxxxx COGNITO_APP_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxx OPENAI_API_KEY=sk-xxxxxx EMBEDDING_MODEL=text-embedding-3-small LLM_MODEL=gpt-4-turbo-preview VECTOR_DB_TYPE=chroma VECTOR_DB_PATH=./chroma_db
    • 使用Docker构建镜像,或直接使用Serverless Framework、SAM等工具,将应用部署到AWS Lambda或ECS上。确保部署的服务拥有正确的IAM角色,能够访问Secrets Manager(如果密钥存在那里)以及必要的网络权限。

4.2 核心API接口与前端集成

后端部署好后,会暴露关键的API端点。前端集成主要围绕这两个端点:

  1. 搜索端点POST /api/search

    • 请求头:必须包含Authorization: Bearer <Cognito Access Token>
    • 请求体{"query": "用户的问题文本", "top_k": 5}top_k指定返回几个相关片段)
    • 响应{"answer": "LLM生成的答案", "sources": [{"source": "文档A.pdf", "chunk_id": 12}, ...]}
  2. 前端集成示例

    // 假设使用 React 和 axios import axios from 'axios'; import { Auth } from 'aws-amplify'; // 使用 Amplify 库管理 Cognito 登录 const searchWithAI = async (userQuery) => { try { // 1. 获取当前登录用户的会话 const session = await Auth.currentSession(); const accessToken = session.getAccessToken().getJwtToken(); // 2. 调用搜索API const response = await axios.post( 'https://your-api-endpoint.execute-api.us-east-1.amazonaws.com/prod/api/search', { query: userQuery, top_k: 5 }, { headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' } } ); // 3. 处理结果 console.log('AI回答:', response.data.answer); console.log('参考来源:', response.data.sources); return response.data; } catch (error) { console.error('搜索失败:', error); // 处理错误,例如令牌过期,引导用户重新登录 if (error.response && error.response.status === 401) { await Auth.signOut(); window.location.reload(); } } };

5. 性能优化、安全加固与成本控制

5.1 提升搜索性能与准确率

一个投入使用的AI搜索系统,优化是永无止境的。

  • 索引优化
    • 分层索引:对于超大规模知识库,可以考虑分层索引。先用一个快速的、粗粒度的模型(如较小维度的嵌入模型)进行初筛,再用一个精细的模型对候选集进行重排。
    • 混合搜索:结合向量搜索(语义相似)和关键词搜索(如BM25)。有些问题用关键词匹配更准(如产品型号“iPhone 15 Pro”),有些则需要语义理解(如“续航不好的手机”)。将两者的结果按分数融合,能获得更鲁棒的效果。WeaviateElasticsearch的向量插件原生支持这种混合搜索。
  • 缓存策略
    • 问题-答案缓存:对于常见、确定的问题(如“公司地址是什么?”),可以将LLM生成的答案直接缓存(如使用Redis),并设置一个较长的TTL。下次同样的问题命中缓存时,直接返回,省去检索和LLM调用的开销,极大降低延迟和成本。
    • 向量缓存:用户问题和文档片段的嵌入向量计算是相对昂贵的。可以对高频查询的问题向量进行缓存。甚至可以对文档块向量进行预计算和持久化存储,避免每次启动服务都重新计算。
  • 提示词迭代:答案质量不佳,很多时候不是检索的问题,而是提示词的问题。建立一套评估体系(可以是人工抽查,也可以设计一些自动化的评估指标),持续对提示词进行A/B测试和迭代。例如,尝试不同的指令措辞、上下文组织格式、要求LLM以特定格式(如Markdown列表)输出等。

5.2 安全与权限深度考量

集成Cognito解决了身份认证,但授权和内容安全需要更细致的设计。

  • 行级数据安全:元数据过滤是实现行级安全的核心。确保在向量化入库时,每段文本都打上了正确的、颗粒度合适的权限标签(如read_groups: [‘engineering’, ‘management’])。后端在检索时,必须将用户的组信息作为硬性过滤器应用到查询中,确保任何返回的片段都经过了权限过滤。
  • 输入输出审查
    • 输入清理:对用户的问题进行基本的清理和检查,防止过长的输入或恶意字符导致服务异常。
    • 输出审查:LLM可能被诱导生成不当内容。虽然RAG基于可信上下文降低了风险,但仍建议在后端或API网关上添加一个轻量级的内容审查层。可以调用内容审查API(如OpenAI的Moderation API)或使用规则引擎,对LLM返回的答案进行扫描,拦截明显违规的内容。
  • 令牌安全:Access Token是通行证。确保前端通过安全的方式存储(如HttpOnly Cookie,避免localStorage),并在过期后能平滑刷新。后端验证令牌时,除了签名,务必验证aud(受众)是否匹配你的应用客户端ID,防止令牌被用于其他服务。

5.3 成本监控与优化策略

使用云服务和闭源LLM API,成本是必须关注的问题。

  • 成本构成分析
    • LLM调用:按Token数计费(输入+输出)。这是主要成本,尤其是使用GPT-4等高级模型。
    • 嵌入模型调用:按Token数计费。文档向量化是一次性成本,但用户每次提问也会产生一次嵌入调用。
    • 向量数据库:自托管成本低(主要是服务器费用),托管服务(如Pinecone)按向量存储量和查询次数计费。
    • 计算资源:运行后端服务的Lambda/ECS/EC2成本。
  • 优化手段
    • 模型选型:在效果可接受的前提下,使用更经济的模型。例如,用gpt-3.5-turbo代替gpt-4进行答案生成;用text-embedding-3-small代替更大的嵌入模型。
    • 上下文管理:严格控制送入LLM的上下文长度。优化文本分块策略,避免送入无关或冗余信息。只发送最相关的Top N个片段,而不是Top K个。
    • 异步与批处理:对于后台的数据向量化任务,可以将文档批量发送给嵌入模型API,以利用可能的批量折扣(如果API支持)。
    • 用量监控与告警:在AWS Cost Explorer中设置预算告警。在应用层面,记录每次搜索消耗的Token数,并设置每日/每用户调用次数限制,防止异常使用导致账单爆炸。

6. 典型问题排查与实战经验分享

在实际部署和运维中,你肯定会遇到各种问题。以下是一些常见坑点及解决方案。

  • 问题1:检索结果不相关,导致LLM“胡言乱语”。

    • 排查:首先检查检索环节。打印出用户问题的向量和Top K个检索结果的相似度分数。如果分数普遍很低(例如余弦相似度<0.5),说明检索没找到相关内容。
    • 解决
      1. 检查嵌入模型:确保索引文档和查询问题时使用的是同一个嵌入模型。混用不同模型生成的向量没有可比性。
      2. 优化分块策略:当前的分块可能太碎或太大,破坏了语义完整性。尝试调整分块大小和重叠区,或者采用基于语义的分割器。
      3. 审视元数据过滤:是否过滤条件太严格,把所有相关文档都过滤掉了?暂时放宽过滤条件测试。
      4. 引入重排序:增加一个重排序步骤,用更精细的模型对初筛结果进行二次排序。
  • 问题2:LLM回答“根据提供的信息,我无法回答”,但明明检索到了相关文档。

    • 排查:检查送入LLM的提示词和上下文。将完整的提示词和上下文打印出来,模拟LLM的视角阅读。
    • 解决
      1. 优化提示词:可能是提示词指令不够清晰。尝试强化指令,如“必须严格根据上下文回答,上下文一定包含答案所需信息。”或者调整上下文在提示词中的位置和格式。
      2. 检查上下文质量:检索到的文档片段本身是否清晰、完整地包含了答案?可能片段只包含了部分信息。尝试增加检索数量(top_k),或者优化文档源的质量。
      3. 调整LLM参数:尝试降低temperature到0,让输出更确定。
  • 问题3:Cognito令牌验证失败,返回401未授权。

    • 排查:查看后端日志,确认令牌验证失败的具体原因。
    • 解决
      1. 令牌过期:前端需要实现令牌刷新逻辑。使用Amplify等库会自动处理。
      2. 令牌受众不匹配:验证代码中检查的aud是否与Cognito应用客户端ID一致。
      3. 网络问题:后端服务无法访问Cognito的公网JWK端点。如果服务部署在VPC内,需要配置NAT网关或接口端点。
      4. 密钥缓存失效:确保JWK公钥缓存逻辑正确,没有因为缓存失效导致每次都去远程获取。
  • 问题4:搜索延迟很高(>5秒)。

    • 排查:使用APM工具或添加详细计时日志,拆解各环节耗时:令牌验证、问题向量化、向量检索、LLM调用。
    • 解决
      1. 向量检索慢:检查向量数据库的索引类型和性能配置。对于Chroma,确保使用的是高效的索引(如HNSW)。考虑升级向量数据库的资源配置。
      2. LLM调用慢:这是主要瓶颈。考虑使用LLM的流式响应(如果前端支持),让用户先看到部分结果。或者,对于简单问题,设置一个更快的备用模型(如GPT-3.5 Turbo)。
      3. 引入缓存:如前所述,对常见问答进行缓存是降低延迟最有效的手段之一。
  • 个人踩坑心得

    • 文档预处理是重中之重:垃圾进,垃圾出。投入在文档清洗、格式规整、结构提取上的时间,最终都会在搜索质量上得到回报。一个混乱的PDF转换出来的文本,效果远不如一个干净的Markdown文件。
    • 从简单开始,逐步迭代:不要一开始就追求完美的多路检索、复杂重排序。先用最基本的向量检索+GPT-3.5跑通全流程,确保核心链路work。然后逐步加入元数据过滤、优化提示词、升级模型、引入缓存。每步都做评估,看效果提升是否对得起复杂度增加。
    • 监控和评估不可或缺:上线后,一定要记录用户的搜索query、返回的答案、用户反馈(如果有)。定期抽样评估答案质量。没有数据和反馈,优化就是盲人摸象。可以设置一个简单的“赞/踩”按钮,收集用户对答案的直接反馈。
    • 成本意识要早养成:在开发阶段就估算单次搜索的成本,并设置沙箱环境的预算告警。曾经有团队在测试时不小心循环调用API,一晚上产生了巨额账单。对生产环境,务必设置硬性的用量限制和告警。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 9:29:03

基于OpenClaw与本地LLM网关,构建AI驱动的YouTube视频智能分析工具

1. 项目概述&#xff1a;基于OpenClaw的AI技能库最近在折腾一个挺有意思的项目&#xff0c;叫OpenClaw-Skills。简单来说&#xff0c;它是一个建立在OpenClaw LLM网关之上的、由AI驱动的命令行工具集合。你可以把它理解为一个“技能库”&#xff0c;每个技能都是一个独立的、能…

作者头像 李华
网站建设 2026/5/5 9:25:51

Obsidian PDF++终极指南:3步实现原生PDF标注与知识管理革命

Obsidian PDF终极指南&#xff1a;3步实现原生PDF标注与知识管理革命 【免费下载链接】obsidian-pdf-plus PDF: the most Obsidian-native PDF annotation & viewing tool ever. Comes with optional Vim keybindings. 项目地址: https://gitcode.com/gh_mirrors/ob/obsi…

作者头像 李华
网站建设 2026/5/5 9:23:54

基于MCP协议为LLM构建本地文本文件探索服务器

1. 项目概述&#xff1a;一个为LLM打造的文本探索利器最近在折腾大语言模型&#xff08;LLM&#xff09;的应用开发&#xff0c;特别是想让它们能更好地理解和处理我本地电脑里那些堆积如山的文档、日志和代码文件。直接让模型去“读”一个几百兆的文本文件&#xff0c;或者遍历…

作者头像 李华
网站建设 2026/5/5 9:22:13

MySQL 9.7.0 使用详解:新特性、实战与避坑指南

一、版本定位与适用场景 MySQL 9.7.0 于 2026年4月21日作为 LTS&#xff08;长期支持&#xff09;版本​ 正式发布&#xff0c;提供约 8 年的支持周期&#xff08;5年首发3年扩展&#xff09;&#xff0c;是 MySQL 进入 AI 与云原生时代的重要里程碑。它与 8.4.9 LTS 并行维护…

作者头像 李华
网站建设 2026/5/5 9:21:11

终极指南:用罗技鼠标宏彻底解决绝地求生压枪难题

终极指南&#xff1a;用罗技鼠标宏彻底解决绝地求生压枪难题 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为绝地求生中难以控制的后坐力而…

作者头像 李华