资讯动态

ragas 非英语语料合成测试数据生成:prompt 语言适配(language adaptation)完整指南

发布时间:2026/9/21 20:59:49 来源:尧图企业网站定制
人工智能大模型模型评测RAG【免费下载链接】ragasSupercharge Your LLM Application Evaluations 项目地址https://gitcode.com/gh_mirrors/ra/ragas点击查看免费下载在 ragas 中合成测试数据生成synthetic test generation默认面向英文语料与英文 prompt 工作。当你的 RAG 应用需要面向西班牙语、法语、德语等非英语场景时直接沿用英文 prompt 会让生成出的查询query与参考答案reference与目标语言脱节。本文以docs/howtos/customizations/testgenerator/_language_adaptation.md为主线讲解如何通过 ragas 内置的adapt_prompts/set_prompts机制把查询合成器Query Synthesizer的 prompt 自动翻译并适配到目标语言并给出从语料加载、模型初始化、Persona 与 transforms 配置到最终生成评估集的完整可运行流程同时结合仓库源码说明 prompt 适配的底层实现PromptMixin、PydanticPrompt.adapt与翻译 prompt帮助你理解语言适配究竟在做什么、能做什么、不能做什么。背景为什么要做 prompt 语言适配ragas 的测试集生成链路大致是语料documents→ 知识图谱与 transforms → 场景生成scenarios→ 采样生成samples→ 测试集Testset。其中查询 参考答案是由 LLM 依据合成器内置的 prompt 生成的。这些 prompt 带有英文指令instruction与英文示例examples。即使你把西班牙语维基百科文章作为输入语料只要 prompt 还是英文LLM 就很容易生成英文查询query而非目标语言查询或者生成英文思考、西语措辞的混合文本导致评估集与真实用户查询分布不一致。_language_adaptation.md给出的解决方案不是让你手写一份西语 prompt而是调用合成器自带的prompt 语言适配接口先adapt_prompts(spanish, llm...)把 prompt 翻译成目标语言再用set_prompts(**prompts)写回合成器最后用这个本地化的合成器执行生成。文档中的运行结果也印证了效果——生成的查询与参考均以法语呈现示例语料与语言为法语内容说明适配后的 prompt 成功驱动了目标语言输出。需要说明的是语言适配只作用于合成器的 prompt 本身即查询/答案生成的指令与示例它并不会替你翻译语料也不会把 transforms如NERExtractor抽取的实体翻译成目标语言。适配后仍应使用目标语言语料作为输入这一点在下面流程中会体现。第一步下载并加载非英语语料文档以西班牙语维基百科文章为示例语料直接从一个托管在 Hugging Face 上的示例数据集克隆得到本地文本文件! git clone https://huggingface.co/datasets/vibrantlabsai/Sample_non_english_corpus克隆完成后用 LangChain 的DirectoryLoader配合TextLoader把目录下所有*.txt文件加载为Document列表from langchain_community.document_loaders import DirectoryLoader, TextLoader path Sample_non_english_corpus/ loader DirectoryLoader(path, glob**/*.txt) docs loader.load()len(docs) # 示例结果为 6要点说明glob**/*.txt会递归匹配子目录下的所有 txt 文件你可以按自己语料目录结构调整你可以把这里的Sample_non_english_corpus换成自己的非英语文档集例如法语、德语、日语维基百科导出等后续流程完全一致语料数量不必很多示例中 6 篇文档即可走通全流程testset_size控制最终样本数。第二步初始化所需的 LLM 与 Embedding 模型测试集生成需要两类模型用于生成查询与答案的LLM以及用于 transforms如实体抽取、关系构建的Embedding 模型。文档中使用 LangChain 包装方式初始化from ragas.llms import LangchainLLMWrapper from ragas.embeddings import OpenAIEmbeddings from langchain_openai import ChatOpenAI import openai generator_llm LangchainLLMWrapper(ChatOpenAI(modelgpt-4o-mini)) openai_client openai.OpenAI() generator_embeddings OpenAIEmbeddings(clientopenai_client)对应到仓库实现TestsetGenerator的llm字段类型是BaseRagasLLMembedding_model字段类型是BaseRagasEmbeddings见 src/ragas/testset/synthesizers/generate.py。LangchainLLMWrapper与OpenAIEmbeddings分别把 LangChain LLM 和 OpenAI Embedding 客户端包装为 ragas 的统一接口。如果不想手写包装也可以使用TestsetGenerator.from_langchain(llm, embedding_model)或from_llama_index(...)两个类方法见 src/ragas/testset/synthesizers/generate.py。一个值得注意的实践细节prompt 适配adapt本身也需要调用 LLM 来做翻译因此请为adapt_prompts传入你最信任、翻译质量最好的 LLM文档注释中也建议如此这样适配出的 prompt 才可靠。第三步配置 Persona 与 Transforms测试集生成会站在不同用户画像Persona的视角产生查询。你可以用 persona 生成 notebook 基于语料自动生成 personas文档为了聚焦主题直接预定义了一个西语场景下的好奇学生画像from ragas.testset.persona import Persona personas [ Persona( namecurious student, role_descriptionA student who is curious about the world and wants to learn more about different cultures and languages, ), ]Persona是定义在 src/ragas/testset/persona.py 上的一个 pydantic 模型仅含name与role_description两个字段。它的role_description会作为 prompt 输入驱动 LLM 生成符合该角色视角的查询对非英语场景建议把角色描述写成目标语言相关的描述效果会更自然。随后配置 transforms。文档使用了两个内置 transformfrom ragas.testset.transforms.extractors.llm_based import NERExtractor from ragas.testset.transforms.splitters import HeadlineSplitter transforms [HeadlineSplitter(), NERExtractor()]HeadlineSplitter按标题切分文档。它从节点的headlines属性取标题进行切分若节点缺少该属性会抛出headlines property not found in this node的ValueError见 src/ragas/testset/transforms/splitters/headline.py——这正是文档运行日志里那几条unable to apply transformation警告的来源属于可忽略的非致命提示。NERExtractor用 LLM 抽取命名实体并把实体写入节点的entities属性。这一步对后面的SingleHopSpecificQuerySynthesizer至关重要因为它依赖节点的entities属性来生成主题见下节。第四步初始化测试集生成器把 LLM、Embedding 与 Persona 列表组装成TestsetGeneratorfrom ragas.testset import TestsetGenerator generator TestsetGenerator( llmgenerator_llm, embedding_modelgenerator_embeddings, persona_listpersonas )这里与默认用法相比多传了persona_list否则生成器会用默认 persona。TestsetGenerator还支持knowledge_graph与llm_context两个可选字段前者用于注入已有的知识图谱默认为空见 src/ragas/testset/synthesizers/generate.py后者用于给 LLM 额外的上下文提示。第五步加载查询类型并适配到目标语言核心步骤这是整篇文档的灵魂。首先生成查询分布query distribution这里使用单跳特定查询合成器SingleHopSpecificQuerySynthesizerfrom ragas.testset.synthesizers.single_hop.specific import ( SingleHopSpecificQuerySynthesizer, ) distribution [ (SingleHopSpecificQuerySynthesizer(llmgenerator_llm), 1.0), ]然后对分布中每个合成器执行语言适配for query, _ in distribution: prompts await query.adapt_prompts(spanish, llmgenerator_llm) query.set_prompts(**prompts)这段代码背后是 ragas 的PromptMixin机制见 src/ragas/prompt/mixin.pyadapt_prompts(language, llm, adapt_instructionFalse)遍历合成器上所有PydanticPrompt属性逐一调用prompt.adapt(target_language, llm)得到翻译后的新 prompt并以字典返回见 src/ragas/prompt/mixin.pyset_prompts(**prompts)按 prompt 名称把适配结果写回合成器实例如果传入的 key 不是合成器已注册的 prompt 名会抛出ValueError见 src/ragas/prompt/mixin.py。PydanticPrompt.adapt的底层实现见 src/ragas/prompt/pydantic_prompt.py做了三件事用get_all_strings收集 prompt 中所有示例examples里的字符串调用内置翻译 promptTranslateStatementstranslate_statements_prompt把每条示例字符串翻译为目标语言翻译 prompt 的指令明确要求保持语句数量完全一致、只翻译不执行见 src/ragas/prompt/pydantic_prompt.pycopy.deepcopy生成新 prompt替换翻译后的示例并设置language target_language若adapt_instructionTrue还会额外翻译指令instruction本身。注意adapt_instruction默认为False即默认只翻译示例、不翻译指令。对大多数场景这已足够——LLM 通过翻译后的示例即可学会输出目标语言若你的生成结果仍不稳定可以把adapt_prompts的adapt_instructionTrue打开代价是适配时多一次翻译调用。此外PromptMixin还提供了save_prompts(path)与load_prompts(path, language)两个方法见 src/ragas/prompt/mixin.py适配好的 prompt 会以{合成器名}_{prompt名}_{语言}.json的格式落盘下次可以直接加载复用避免每次都重新调用翻译。这在实际工程中非常实用——语言适配只做一次之后反复生成测试集。SingleHopSpecificQuerySynthesizer本身见 src/ragas/testset/synthesizers/single_hop/specific.py继承自SingleHopQuerySynthesizer其场景生成流程是从知识图谱中找出带有entities属性的节点CHUNK 或 DOCUMENT取数量多的类型→ 为每个节点提取实体作为主题themes→ 用ThemesPersonasMatchingPrompt把主题与 persona 匹配 → 组合(node, theme, persona, style, length)生成候选场景并采样见 src/ragas/testset/synthesizers/single_hop/specific.py。最终在_generate_sample中把 persona、term、context、query_length、query_style 组装成QueryCondition喂给查询生成 prompt产出SingleTurnSample(user_input, reference, reference_contexts, ...)见 src/ragas/testset/synthesizers/single_hop/base.py。第六步生成测试集并转换为评估集适配完成后用generate_with_langchain_docs生成测试集dataset generator.generate_with_langchain_docs( docs[:], testset_size5, transformstransforms, query_distributiondistribution, )generate_with_langchain_docs的关键参数见 src/ragas/testset/synthesizers/generate.py参数含义默认值documentsLangChain Document 序列作为生成素材必填testset_size要生成的测试样本数量必填transforms应用到文档上的 transforms 列表Nonetransforms_llm若 transforms 需要 LLM 且与生成器 LLM 不同可单独指定Nonetransforms_embedding_modeltransforms 用的 embedding独立于生成器时指定Nonequery_distribution各查询类型的采样权重分布Nonerun_config运行配置超时、重试等Nonewith_debugging_logs是否输出调试日志Falseraise_exceptions生成中出错是否抛出异常Truereturn_executor为True时返回Executor实例可cancel()取消需调用executor.results()取结果False另外若未提供 LLM 或 embedding该方法会主动抛出ValueError提醒见 src/ragas/testset/synthesizers/generate.py避免静默使用默认模型。运行日志中的Generating Scenarios与Generating Samples进度条分别对应场景生成与采样生成阶段前面提到的headlines property not found提示来自HeadlineSplitter不影响最终产出。最后把生成的Testset转换为评估数据集EvaluationDataset并抽样查看eval_dataset dataset.to_evaluation_dataset()print(Query:, eval_dataset[0].user_input) print(Reference:, eval_dataset[0].reference)文档中运行结果展示了适配后的效果示例输出为法语内容Query: Quelles sont les caractéristiques du Bronx en tant que borough de New York? Reference: Le Bronx est lun des cinq arrondissements de New York, qui est la plus grande ville des États-Unis. ...可见查询与参考答案均已落在目标语言上。得到EvaluationDataset后即可直接用于后续的评估evaluate流程或按需导出为 CSV / JSONL 供标注与 CI 使用。常见问题与工程建议headlines属性缺失警告HeadlineSplitter对没有headlines属性的节点会打印unable to apply transformation并跳过该节点见 src/ragas/testset/transforms/splitters/headline.py。若语料本身没有标题结构可以省略HeadlineSplitter只保留NERExtractor。适配后的 prompt 复用语言适配需要额外调用一次 LLM 翻译成本与耗时均大于普通生成。工程上建议用save_prompts把适配结果持久化后续用load_prompts(path, languagespanish)直接加载见 src/ragas/prompt/mixin.py。生成结果语言不稳定先确认你的语料确实是目标语言再确认adapt_prompts用的是翻译质量好的强 LLM仍不稳定可开启adapt_instructionTrue连指令一起翻译。不要脱离语料适配语言适配只翻译合成器 prompt不翻译语料本身。输入语料、Persona 的role_description最好与目标语言一致才能获得一致的输出。更多自定义本文聚焦单跳特定查询合成器的适配多跳合成器与 agent 场景的合成同样遵循PromptMixin的适配机制可以参考 single_hop 合成器 与 multi_hop 合成器 目录下的实现进行扩展Persona 自动生成可参考 persona_generator notebook。小结通过adapt_promptsset_prompts两步ragas 可以在不改动任何生成代码的前提下把查询合成器的 prompt 翻译并适配到任意目标语言从而让合成测试集与多语言 RAG 应用的真实场景对齐。其核心实现位于PromptMixinsrc/ragas/prompt/mixin.py与PydanticPrompt.adaptsrc/ragas/prompt/pydantic_prompt.py翻译任务由内置的TranslateStatementsprompt 完成并保证示例数量严格不变。配合save_prompts/load_prompts的持久化能力你可以把语言适配做成一次性的预处理步骤稳定地产出目标语言的评估数据集。赞分享人工智能大模型模型评测RAG【免费下载链接】ragasSupercharge Your LLM Application Evaluations 项目地址https://gitcode.com/gh_mirrors/ra/ragas点击查看免费下载相关推荐PentestGPT多语言支持非英语环境下的渗透测试适配方案PentestGPT多语言支持非英语环境下的渗透测试适配方案 痛点与挑战非英语环境下的渗透测试困境 在全球化的网络安全测试场景中渗透测试人员Penetr网络安全渗透测试人工智能大模型AI Agent自主智能体AutoRAG 使用 RAGAS 生成评测数据集从语料库到 QA 数据集的完整实战指南AutoRAG 使用 RAGAS 生成评测数据集从语料库到 QA 数据集的完整实战指南 导读 本文讲解 AutoRAG 中基于 RAGASRAG Asses人工智能AI AgentRAG本地部署CLIOmost多语言支持非英语提示词的图像生成质量测试Omost多语言支持非英语提示词的图像生成质量测试 引言打破语言壁垒的AI绘画革命 你是否曾因英语提示词表达不准确导致AI生成的中国龙变成西方恶龙在人工智能大模型媒体生成预训练创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价