ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenAI Embeddings API 接入实战:从向量化到语义检索的完整指南

OpenAI Embeddings API 接入实战:从向量化到语义检索的完整指南 1. 为什么文本向量化是 AI 应用的隐形地基1.1 从一次语义搜索翻车说起去年帮一个做法律文书检索的朋友调系统他跟我抱怨“明明搜的是‘合同违约赔偿标准’结果给我返回一堆‘劳动合同解除流程’这检索是瞎了吗”我打开他的代码一看好家伙关键词匹配加 TF-IDF连个向量化都没有。用户搜“违约赔偿”文档里写的是“违约责任承担方式”字面完全不重叠传统检索直接歇菜。这件事让我彻底意识到一个事实Embedding 不是 AI 应用里的花架子它是语义理解的基础设施。你把一段文本丢给 Embedding 模型它吐出来一个固定长度的浮点数数组比如 1536 维或 3072 维。这个数组就是这段文本在语义空间里的“坐标”。语义相近的文本坐标距离就近语义无关的坐标就远。搜索、推荐、聚类、去重、分类全都建立在这个坐标体系之上。而 OpenAI Embeddings API 是目前工程落地最成熟的选择之一——模型稳定、维度可选、多语言支持好、生态工具链完善。问题在于国内开发者直接调用官方接口经常遇到网络链路不稳定、计费方式不灵活、密钥管理麻烦等现实问题。Ace Data Cloud 这类 API 聚合平台的价值就在这里它把 OpenAI Embeddings API 封装成国内可直连的稳定通道你不需要折腾网络环境拿个 API Key 就能跑。这篇文章适合谁看如果你是后端工程师、算法工程师、全栈开发者或者正在做 RAG 应用、语义搜索、智能客服、内容推荐系统那这篇内容就是给你写的。我会从架构设计讲到代码实操从参数选择讲到踩坑记录尽量把每个“为什么”都说清楚。1.2 Embedding 到底在算什么很多人第一次接触 Embedding 会懵凭什么一串数字就能表示语义这里用一个生活化的类比来解释。想象一个巨大的图书馆每本书都有一个三维坐标X 轴代表“偏理论还是偏实践”Y 轴代表“偏文科还是偏理科”Z 轴代表“偏入门还是偏进阶”。《深入理解计算机系统》可能在实践 7理科 9进阶 8《Python 编程从入门到实践》在实践 9理科 7入门 3。这两本书的坐标距离就比较近因为它们都是计算机类、偏实践的书。Embedding 做的就是这件事只不过维度从 3 维变成了 1536 维甚至 3072 维。维度越高能刻画的语义细节就越丰富——不仅能区分“计算机 vs 文学”还能区分“讽刺语气 vs 严肃语气”、“正式合同 vs 口语聊天”。OpenAI 的 text-embedding-3-small 默认 1536 维text-embedding-3-large 默认 3072 维而且支持通过dimensions参数降维这个后面会详细讲。关键要理解的是Embedding 模型本身不生成文字它只做一件事——把文本映射到向量空间。生成回答是 GPT 系列的事Embedding 负责的是“理解”和“检索”环节。在 RAG检索增强生成架构里Embedding 是检索层GPT 是生成层两者配合才能让 AI 基于你的私有知识库回答问题。1.3 Ace Data Cloud 在链路里扮演什么角色直接说结论Ace Data Cloud 是一个 API 聚合与中转平台它把 OpenAI Embeddings API 包装成兼容 OpenAI 官方 SDK 的接口格式。你只需要把base_url从https://api.openai.com/v1改成 Ace Data Cloud 提供的地址把 API Key 换成平台分配的 Key其余代码几乎不用动。这样做的好处有几个。第一网络链路稳定不需要额外配置代理或中转服务器国内服务器直接调用成功率很高。第二计费灵活平台通常按调用量计费支持小额充值适合个人开发者和小团队试水。第三统一管理如果你同时用多个模型Embedding、Chat、Rerank一个平台一个 Key 就能搞定省去多平台密钥管理的麻烦。但要注意聚合平台不是银弹。它的稳定性取决于平台自身的运维能力高峰期可能有延迟波动。所以我的建议是开发测试阶段用聚合平台快速验证生产环境根据业务量评估是否直连官方或做双通道容灾。这个思路后面在架构章节会展开。2. 接入前的技术选型与准备工作2.1 模型选择small 还是 largeOpenAI 目前主流的 Embedding 模型有两个text-embedding-3-small和text-embedding-3-large。选哪个不是拍脑袋决定的要看你的业务场景和成本预算。对比维度text-embedding-3-smalltext-embedding-3-large默认维度15363072支持降维是通过 dimensions 参数是语义精度中等日常检索够用高复杂语义区分强调用成本低约为 small 的 6-7 倍适用场景大规模文档检索、去重、分类高精度语义搜索、法律/医疗等专业领域向量存储开销小大3072 维浮点数组约 12KB/条我的实操经验是先用 small 跑通全流程用真实数据评估召回效果如果准确率不达标再换 large。很多团队一上来就用 large结果发现 small 完全够用白白多花了好几倍成本。特别是做大规模文档库百万级以上的时候3072 维向量的存储和检索开销非常可观用 small 加降维到 512 或 768 维往往能在精度和成本之间找到更好的平衡点。2.2 维度选择降维不是简单砍维度text-embedding-3 系列支持通过dimensions参数指定输出维度这是它相比旧版 ada-002 的一个重要升级。但降维不是随便砍它用的是 Matryoshka Representation Learning 技术简单说就是模型训练时就让前 N 个维度承载了主要语义信息所以从 1536 维降到 512 维精度损失相对可控。那到底选多少维我整理了一个参考表维度存储开销约适用场景精度损失2561KB/条超大规模粗筛、移动端较明显5122KB/条大规模检索、成本敏感可接受7683KB/条通用检索、平衡之选较小15366KB/条高精度检索基准307212KB/条专业领域最高精度无损注意降维后的向量和原始维度的向量不能混用。如果你先用 1536 维建了库后来改成 768 维必须全量重新生成向量否则检索结果会完全错乱。2.3 环境准备与依赖安装Python 环境下最省事的方案是用 OpenAI 官方 SDK因为 Ace Data Cloud 兼容它的接口格式。安装命令很简单pip install openai如果你用的是 Node.js对应安装npm install openai版本方面Python SDK 建议 1.0.0 以上因为 1.0 之后接口做了大改老版本的openai.Embedding.create()已经废弃新写法是client.embeddings.create()。这个坑我踩过网上很多老教程还在用旧写法复制过来直接报错。另外建议装一个tiktoken用来估算 token 数因为 Embedding API 是按 token 计费的提前算清楚能避免账单超预期pip install tiktoken2.4 API Key 与 base_url 配置拿到 Ace Data Cloud 的 API Key 后配置方式有两种。一种是写在环境变量里这是推荐做法export ACE_API_KEYyour-api-key-here export ACE_BASE_URLhttps://api.acedata.cloud/v1另一种是代码里直接初始化客户端from openai import OpenAI client OpenAI( api_keyyour-api-key-here, base_urlhttps://api.acedata.cloud/v1 )提示API Key 千万不要硬编码在代码里提交到 Git 仓库。我见过太多团队因为密钥泄露被刷爆账单的案例。用环境变量或者密钥管理服务这是底线。3. 核心接口调用与参数详解3.1 最简调用三行代码跑通第一个向量先跑通最简单的场景把一句话变成向量from openai import OpenAI client OpenAI( api_keyyour-api-key-here, base_urlhttps://api.acedata.cloud/v1 ) response client.embeddings.create( modeltext-embedding-3-small, input合同违约方应当承担继续履行、采取补救措施或者赔偿损失等违约责任 ) vector response.data[0].embedding print(f向量维度: {len(vector)}) print(f前5个值: {vector[:5]})跑通之后你会看到输出类似向量维度: 1536前几个值是 -0.02、0.015 这样的小数。这就是这段法律文本在语义空间里的坐标。这里有个细节值得说input参数可以传字符串也可以传字符串列表。传列表时API 会批量返回多个向量这比循环单条调用效率高得多。批量调用是生产环境的基本操作后面会专门讲。3.2 批量处理一次最多能塞多少条批量调用看起来简单但有几个限制必须搞清楚否则会踩坑。第一单次请求的 input 列表最多 2048 条。超过会报错。第二所有输入的总 token 数不能超过模型的最大上下文限制text-embedding-3 系列是 8191 tokens。注意这是单条文本的上限不是总和上限但总 token 数太大也会导致请求超时。第三也是最重要的一点批量调用时返回结果的顺序和输入顺序是一致的通过index字段对应。但如果你并发多个批量请求就要自己维护好映射关系别搞混了。texts [ 违约责任包括继续履行和赔偿损失, 劳动合同解除需要提前三十日通知, 股权转让应当办理工商变更登记, # ... 更多文本 ] # 分批处理每批 100 条 batch_size 100 all_vectors [] for i in range(0, len(texts), batch_size): batch texts[i:i batch_size] response client.embeddings.create( modeltext-embedding-3-small, inputbatch ) # 按 index 排序确保顺序正确 sorted_data sorted(response.data, keylambda x: x.index) all_vectors.extend([d.embedding for d in sorted_data]) print(f已完成 {min(i batch_size, len(texts))}/{len(texts)})批量大小设多少合适我的经验是 100 到 500 之间。太小了请求次数多网络开销大太大了单次请求耗时长失败重试成本高。100 条一批是比较稳妥的选择配合并发能跑出不错的吞吐。3.3 降维参数怎么用前面提到 text-embedding-3 支持降维用法就是在请求里加dimensions参数response client.embeddings.create( modeltext-embedding-3-large, input需要向量化的文本, dimensions1024 ) vector response.data[0].embedding print(f降维后维度: {len(vector)}) # 输出 1024这里有个实操技巧如果你不确定最终用多少维先用大维度生成存库时再降维。因为降维是取前 N 个维度然后重新归一化这个操作可以在本地做不需要重新调 API。但反过来低维升维是不可能的信息已经丢了。不过要注意本地降维和 API 降维的结果可能有细微差异因为 API 端做了归一化处理。如果对一致性要求极高建议统一用 API 降维。3.4 编码格式与 token 计费OpenAI Embeddings API 支持两种输入格式普通字符串和 token 数组。普通字符串最常用SDK 会自动用 cl100k_base 编码器转成 token。token 数组格式适合你已经预处理好 token 的场景能省一点编码开销但一般用不上。计费方面Embedding 按输入 token 计费输出向量不计费。text-embedding-3-small 的价格大约是每百万 token 0.02 美元large 是 0.13 美元。看起来便宜但大规模文档库要注意一篇 5000 字的文章大约 3000-4000 token百万篇文章就是 30-40 亿 token用 large 的话成本就上去了。用 tiktoken 预估 token 数import tiktoken encoding tiktoken.get_encoding(cl100k_base) text 你的文本内容 tokens encoding.encode(text) print(ftoken 数: {len(tokens)})注意中文的 token 密度比英文高。同样一段话中文可能比英文多 1.5 到 2 倍 token。做成本预估时别按字数除以 4 来算中文要按字数乘以 0.6 到 0.8 来估。4. 从向量到应用完整实操链路4.1 文本预处理向量化之前必须做的事很多人拿到文本直接丢给 Embedding API结果检索效果一塌糊涂。问题往往出在预处理环节。文本预处理不是可选项是必选项。第一步是清洗。去掉 HTML 标签、多余空白、特殊符号。特别是从网页爬下来的内容一堆div、span混在里面向量化出来全是噪声。第二步是分块。Embedding 模型有 8191 token 上限长文档必须切分。但切分不是随便按字数切要按语义边界切。我的做法是优先按段落切段落太长再按句子切句子还长才按字符切。重叠部分留 10%-20%避免语义在切分处断裂。def split_text(text, max_tokens500, overlap50): 按段落和句子切分文本控制单块 token 数 encoding tiktoken.get_encoding(cl100k_base) paragraphs text.split(\n\n) chunks [] current_chunk for para in paragraphs: para_tokens len(encoding.encode(para)) if para_tokens max_tokens: # 段落太长按句子切 sentences para.replace(。, 。\n).split(\n) for sent in sentences: if len(encoding.encode(current_chunk sent)) max_tokens: chunks.append(current_chunk.strip()) current_chunk sent else: current_chunk sent else: if len(encoding.encode(current_chunk para)) max_tokens: chunks.append(current_chunk.strip()) current_chunk para else: current_chunk para if current_chunk.strip(): chunks.append(current_chunk.strip()) return chunks第三步是加元数据。纯文本向量化后你只知道“这段内容和查询相关”但不知道它来自哪个文档、哪一页。所以存向量的时候要带上doc_id、chunk_index、source等字段检索出来才能溯源。4.2 向量存储选什么数据库向量存哪里这是架构设计的关键决策。我按数据规模分三种情况给建议。数据量在 10 万条以下用 FAISS 就够了。它是 Facebook 开源的本地向量库零依赖pip 装完就能用检索速度极快。缺点是单机、不支持分布式、没有持久化需要自己存磁盘。数据量在 10 万到千万级推荐用 Milvus 或 Qdrant。这两个都是专业向量数据库支持分布式、持久化、过滤检索。Milvus 生态更成熟Qdrant 部署更轻量。我个人偏好 QdrantDocker 一条命令就能跑起来API 设计也清爽。数据量在千万级以上或者已经有 PostgreSQL 技术栈可以考虑 pgvector。它把向量检索能力集成到 Postgres 里不用额外维护一套数据库运维成本低。缺点是超大规模下性能不如专业向量库。# Qdrant 示例创建集合 from qdrant_client import QdrantClient from qdrant_client.models import Distance, VectorParams client QdrantClient(hostlocalhost, port6333) client.create_collection( collection_namedocuments, vectors_configVectorParams(size1536, distanceDistance.COSINE) )提示距离度量选 COSINE 还是 EUCLIDEANOpenAI 的 Embedding 向量已经归一化过用 COSINE 和点积结果等价。但如果你的向量没归一化一定要用 COSINE否则长度会影响相似度计算。4.3 写入与检索的完整代码把前面的环节串起来写一个完整的写入流程import uuid from qdrant_client import QdrantClient from qdrant_client.models import PointStruct def embed_and_store(texts, doc_id, collection_namedocuments): 将文本向量化并存入 Qdrant # 1. 批量向量化 response client.embeddings.create( modeltext-embedding-3-small, inputtexts ) # 2. 构造写入点 points [] for i, data in enumerate(sorted(response.data, keylambda x: x.index)): points.append(PointStruct( idstr(uuid.uuid4()), vectordata.embedding, payload{ doc_id: doc_id, chunk_index: i, text: texts[i] } )) # 3. 写入 Qdrant qdrant.upsert( collection_namecollection_name, pointspoints ) return len(points)检索流程def search(query, top_k5, collection_namedocuments): 语义检索 # 1. 查询向量化 response client.embeddings.create( modeltext-embedding-3-small, inputquery ) query_vector response.data[0].embedding # 2. 向量检索 results qdrant.search( collection_namecollection_name, query_vectorquery_vector, limittop_k ) # 3. 返回结果 return [ { text: hit.payload[text], score: hit.score, doc_id: hit.payload[doc_id] } for hit in results ]这套代码跑通你就有了一个基础的语义检索系统。但别急着上生产还有几个优化点要做。4.4 检索质量优化从能用到好用基础检索跑通后你会发现有些查询结果不太准。这是正常的向量检索不是万能的。我总结了几个提升检索质量的实操技巧。第一个技巧是查询改写。用户输入的查询往往很短、很口语化直接向量化效果不好。可以用 GPT 先把查询改写成更规范的表述再向量化。比如用户搜“合同违约了怎么办”改写成“合同违约责任承担方式及赔偿标准”检索命中率会明显提升。第二个技巧是混合检索。向量检索擅长语义匹配但对精确关键词如产品型号、人名不敏感。把向量检索和 BM25 关键词检索的结果做融合能兼顾语义和精确匹配。融合算法用 RRFReciprocal Rank Fusion简单有效。第三个技巧是重排序。向量检索先召回 Top 50再用 Rerank 模型精排取 Top 5。Rerank 模型如 Cohere Rerank、BGE Rerank比 Embedding 模型精度更高但速度慢所以只用在精排阶段。这个两阶段架构是工业界标配。优化手段提升效果额外成本适用场景查询改写召回率 10-20%一次 GPT 调用查询短、口语化混合检索召回率 15-25%BM25 索引维护含专有名词重排序精度 20-30%Rerank API 费用对精度要求高分块优化召回率 10-15%无长文档5. 踩坑记录与问题排查5.1 常见报错与解决方案接入过程中我遇到过不少报错整理成速查表方便对照报错信息原因解决方案401 UnauthorizedAPI Key 错误或过期检查 Key 是否正确是否有多余空格429 Too Many Requests超过速率限制加指数退避重试降低并发400 maximum context length单条文本超 8191 token分块处理控制单块长度400 invalid dimensions维度参数超出范围small 支持 1-1536large 支持 1-3072连接超时网络链路问题检查 base_url加重试机制返回向量全为 0输入为空或全空白过滤空文本加输入校验429 限流是最常见的。我的处理方式是加一个带指数退避的重试装饰器import time from functools import wraps def retry_with_backoff(max_retries5, base_delay1): def decorator(func): wraps(func) def wrapper(*args, **kwargs): for attempt in range(max_retries): try: return func(*args, **kwargs) except Exception as e: if 429 in str(e) and attempt max_retries - 1: delay base_delay * (2 ** attempt) print(f限流{delay}秒后重试...) time.sleep(delay) else: raise return None return wrapper return decorator5.2 向量质量问题的排查思路有时候代码不报错但检索效果差。这种问题最难查因为没有明确报错信息。我的排查顺序是这样的。先查输入。把要向量化的文本打印出来看看是不是有乱码、HTML 残留、超长空白。我遇到过一次爬虫抓下来的文本里混了一堆\u200b零宽字符向量化出来全是噪声清洗掉就好了。再查分块。把分块结果打印出来看看有没有把一句话切成两半、有没有块特别短少于 10 个字。块太短语义不完整检索出来也没用。然后查相似度分布。拿一个已知答案的查询看正确文档的相似度分数排在第几。如果正确文档分数很低说明 Embedding 模型不适合你的领域考虑换模型或微调。如果正确文档分数高但没排前面说明检索参数有问题检查距离度量和 top_k 设置。最后查数据一致性。确认写入和检索用的是同一个模型、同一个维度。我见过有人写入用 small 1536 维检索用 large 3072 维结果当然全错。5.3 成本控制的几个实操技巧Embedding 调用成本看着低但量大起来很吓人。分享几个我实际用过的省钱技巧。缓存重复文本的向量。很多场景下同样的文本会被反复向量化比如系统提示词、固定模板。用一个 Redis 或本地字典缓存文本到向量的映射命中缓存直接返回能省不少调用。增量更新而非全量重建。文档库更新时只对新文档和修改过的文档重新向量化没变的复用旧向量。这需要维护文档的哈希值但省下的调用量很可观。用 small 做粗筛large 做精排。如果精度要求高又不想全用 large可以两阶段先用 small 向量做粗筛召回 Top 100再用 large 对这 100 条重新向量化精排。这样 large 的调用量只有全量的 1% 左右。监控 token 消耗。每次调用记录 token 数按天汇总。发现异常增长及时排查避免代码 bug 导致重复调用刷爆账单。6. 生产环境架构建议6.1 双通道容灾设计前面说过聚合平台不是银弹。生产环境我建议做双通道主通道用 Ace Data Cloud备通道直连官方或其他平台。通过配置开关切换主通道连续失败 N 次自动切备通道。class EmbeddingClient: def __init__(self, primary_config, backup_config): self.primary OpenAI(**primary_config) self.backup OpenAI(**backup_config) self.failure_count 0 self.threshold 3 self.use_backup False def embed(self, texts): client self.backup if self.use_backup else self.primary try: result client.embeddings.create( modeltext-embedding-3-small, inputtexts ) self.failure_count 0 return result except Exception as e: self.failure_count 1 if self.failure_count self.threshold: self.use_backup True print(切换到备用通道) raise这个设计的关键是故障切换要自动、要快不能等人工介入。同时要有告警切换发生时通知到人方便排查主通道问题。6.2 异步化与并发控制Embedding 调用是 IO 密集型操作同步调用会阻塞主线程。生产环境建议用异步方式Python 里用asyncio配合AsyncOpenAIimport asyncio from openai import AsyncOpenAI async_client AsyncOpenAI( api_keyyour-api-key, base_urlhttps://api.acedata.cloud/v1 ) async def embed_batch(texts, semaphore): async with semaphore: response await async_client.embeddings.create( modeltext-embedding-3-small, inputtexts ) return response async def embed_all(all_texts, batch_size100, max_concurrent5): semaphore asyncio.Semaphore(max_concurrent) tasks [] for i in range(0, len(all_texts), batch_size): batch all_texts[i:i batch_size] tasks.append(embed_batch(batch, semaphore)) results await asyncio.gather(*tasks) return results并发数设多少这取决于平台的速率限制。一般建议从 5 开始观察有没有 429 报错逐步调整。别一上来就开 50 并发很容易触发限流甚至被封。6.3 监控指标与告警生产环境必须监控这几个指标调用成功率、平均延迟、token 消耗量、缓存命中率。成功率低于 99% 要告警延迟突然升高要排查token 消耗异常增长要查代码。我一般用 Prometheus 加 Grafana 做监控每次调用记录指标from prometheus_client import Counter, Histogram embedding_calls Counter( embedding_calls_total, Total embedding calls, [status, model] ) embedding_latency Histogram( embedding_latency_seconds, Embedding call latency ) embedding_tokens Counter( embedding_tokens_total, Total tokens consumed )这些指标看起来简单但出问题时能帮你快速定位。比如成功率突然下降可能是平台故障延迟升高可能是网络问题或文本太长token 消耗暴涨可能是代码 bug 导致重复调用。7. 几个容易被忽略的细节7.1 文本长度与语义稀释Embedding 模型对长文本的处理有个特点文本越长语义越容易被“平均”掉。一篇 5000 字的文章向量化成一个 1536 维向量里面可能讲了五六个主题但最终向量是这些主题的混合检索时反而不如拆成五段分别向量化来得准。所以我的原则是单块文本控制在 200-500 token 之间。这个长度既能承载完整语义又不会稀释主题。超过 500 token 的块检索精度会明显下降。7.2 多语言混合场景OpenAI 的 Embedding 模型多语言支持不错中英文混合文本也能处理。但如果你的文档库以中文为主查询也是中文建议测试一下纯中文场景的检索效果。有些模型在跨语言检索上表现好但同语言检索反而不如专门的中文模型。如果发现中文检索效果不理想可以考虑用 BGE、M3E 等中文优化的开源模型做对比测试。不过开源模型需要自己部署运维成本高要权衡。7.3 向量归一化的重要性OpenAI 返回的向量已经归一化L2 范数为 1所以用余弦相似度和点积结果一样。但如果你自己做了降维或变换一定要重新归一化否则相似度计算会出错。验证方法很简单import numpy as np vector np.array(response.data[0].embedding) norm np.linalg.norm(vector) print(fL2 范数: {norm}) # 应该接近 1.0如果范数明显偏离 1说明向量没归一化需要手动处理normalized vector / np.linalg.norm(vector)7.4 版本兼容性检查OpenAI SDK 更新频繁不同版本接口有差异。生产环境要锁定版本别用pip install openai不指定版本否则某天自动升级可能直接跑不起来。pip install openai1.30.0同时Ace Data Cloud 的接口兼容性也要确认。虽然它兼容 OpenAI 格式但某些新参数可能支持滞后。用新功能前先看平台文档别直接照搬官方文档。8. 从 Embedding 到 RAG 的延伸Embedding 只是起点。把它接入 RAG 系统才能发挥完整价值。RAG 的流程是用户提问 → 查询向量化 → 向量检索召回相关文档 → 文档和问题一起送给 GPT → GPT 生成回答。这个链路里Embedding 负责检索层GPT 负责生成层。检索质量直接决定生成质量——召回不准GPT 再强也答不对。所以我在 RAG 项目里花在 Embedding 和检索优化上的时间往往比调 GPT 提示词还多。一个完整的 RAG 检索函数大概长这样def rag_query(question, top_k5): # 1. 检索相关文档 docs search(question, top_ktop_k) # 2. 构造上下文 context \n\n.join([d[text] for d in docs]) # 3. 调用 GPT 生成回答 response client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 基于以下上下文回答问题不要编造信息。\n\n context}, {role: user, content: question} ] ) return response.choices[0].message.content这套代码跑通你就有了一个能基于私有知识库回答问题的 AI 应用。后续优化方向包括更好的分块策略、混合检索、重排序、查询改写、多轮对话上下文管理等等。每个方向都值得单独写一篇这里就不展开了。我个人在实际操作中的体会是Embedding 接入本身不难难的是把检索质量调到业务可用的水平。这需要反复测试、分析 bad case、迭代优化。别指望一次调通就完事留出足够的调优时间。另外Ace Data Cloud 这类平台确实能省去网络配置的麻烦但生产环境一定要做容灾和监控别把鸡蛋放一个篮子里。最后分享一个小技巧建库时把原始文本和向量一起存检索出来直接能看到原文排查问题时特别方便不用再去数据库里反查。
返回列表