AI Agent白手起家31: 根据语义相似度动态选择 Few Shot 示例 纲要动态示例选择进阶从长度到语义核心概念SemanticSimilarityExampleSelector基于语义相似度从示例池中选择与输入最相关的示例向量嵌入Embedding与向量数据库如Chroma余弦相似度衡量向量空间距离的常用算法关键流程准备示例 → 定义嵌入模型和向量数据库 → 创建选择器 → 组合 Few Shot 提示词模板 → 调用 LLM涉及组件langchain_core.example_selectors、langchain_community.embeddings、langchain_community.vectorstores代码演示完整可运行的 Python 脚本使用FakeEmbeddings模拟嵌入过程无需外部 API Key引言在上一篇文章中我们介绍了根据长度动态截取示例的LengthBasedExampleSelector它虽然能够控制上下文窗口的大小但选择逻辑过于机械只是从列表头部开始依次添加示例完全不考虑示例与当前输入的相关性。如果示例池里混杂了中文和英文、天气和情绪等多种场景长度选择器很可能给出与当前任务毫不相干的例子。LangChain 提供了另一种更智能的选择器——SemanticSimilarityExampleSelector它利用文本嵌入技术将输入和示例都映射到向量空间然后通过计算余弦相似度从示例池中选出语义最接近的 Top-K 个示例。这种方式可以轻松实现跨语言、跨领域的精准匹配让 Few Shot 提示真正“看懂”输入的内容。工作原理其本质是检索增强生成RAG在提示词构建阶段的应用整体流程如下示例池向量化并存入Chroma用户输入向量化在Chroma中做相似度搜索返回Top-K最相似示例组合进Few Shot提示词模板向量化使用嵌入模型Embedding Model将文本转换为高维向量。存储将示例向量存入向量数据库本文使用轻量级的 Chroma。查询将用户输入也向量化通过余弦相似度计算与各示例向量的距离返回距离最近即语义最相似的 K 个示例。完整可运行代码为了让你无需任何外部 API Key 即可运行本示例使用FakeEmbeddings模拟向量嵌入。实际项目中只需替换为真实的嵌入模型如 OpenAI 或 HuggingFace 模型代码结构完全一致。首先安装依赖pipinstalllangchain langchain-core langchain-community chromadb核心代码fromlangchain_core.promptsimportPromptTemplate,FewShotPromptTemplatefromlangchain_core.example_selectorsimportSemanticSimilarityExampleSelectorfromlangchain_community.embeddings.fakeimportFakeEmbeddingsfromlangchain_community.vectorstoresimportChroma# 1. 准备示例池反义词任务examples[{input:happy,output:sad},{input:高兴,output:悲伤},{input:sunny,output:gloomy},{input:晴朗,output:阴沉},{input:big,output:small},]# 2. 定义示例格式化模板example_promptPromptTemplate(input_variables[input,output],template原词: {input}\n反义词: {output})# 3. 创建语义相似度示例选择器# 使用 FakeEmbeddings 模拟嵌入size 参数指定向量维度embedding_modelFakeEmbeddings(size128)example_selectorSemanticSimilarityExampleSelector.from_examples(examplesexamples,embeddingsembedding_model,vectorstore_clsChroma,# 使用 Chroma 作为向量数据库k1,# 每次选择最相似的 1 个示例)# 4. 构建动态 Few Shot 提示词模板dynamic_promptFewShotPromptTemplate(example_selectorexample_selector,example_promptexample_prompt,prefix给出每个输入词的反义词,suffix原词: {input}\n反义词:,input_variables[input],)# 5. 测试输入英文情绪词期望选中情绪相关示例print( 输入: worried )print(dynamic_prompt.format(inputworried))print()# 6. 测试输入中文天气词期望选中天气相关示例print( 输入: 晴朗 )print(dynamic_prompt.format(input晴朗))运行后可以看到worried会匹配到情绪相关的示例如happy/sad晴朗则匹配到天气相关的示例如sunny/gloomy或晴朗/阴沉。注意FakeEmbeddings使用随机向量因此结果可能略有随机性若换成真实嵌入模型匹配会非常精准。与长度选择器的对比特性长度选择器 (LengthBasedExampleSelector)语义选择器 (SemanticSimilarityExampleSelector)选择依据示例字符数 顺序输入与示例的语义相似度能否跨语言不支持支持嵌入模型通常跨语言计算开销极低较高需向量化和相似度搜索适用场景示例少且顺序重要示例多、任务多变、要求高相关性使用建议嵌入模型选型对中文任务推荐使用text-embedding-ada-002OpenAI或开源的BAAI/bge-large-zh它们对中英文混合场景支持良好。Top-K 设置k值一般设为 1~3过多示例可能引入噪声。可根据实际效果调整。向量数据库Chroma 适合原型开发和小规模数据生产环境可考虑 FAISS、Pinecone、Milvus 等。示例池维护定期更新示例池并重新生成向量以保持与最新任务的语义一致性。总结SemanticSimilarityExampleSelector将检索增强生成RAG的向量检索思路应用于提示词工程让 Few Shot 示例的选择从“机械截断”进化为“智能检索”。它充分利用了嵌入模型捕捉语义的能力无论输入是中文还是英文都能从庞大的示例池中精准捞出最有参考价值的样例大幅提升 Few Shot 的命中率和回答质量。