ARTICLE DETAIL

资讯详情

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

Hindsight 多语言记忆系统:从语言感知的事实提取到 BM25 索引选型

Hindsight 多语言记忆系统:从语言感知的事实提取到 BM25 索引选型 Hindsight 多语言记忆系统从语言感知的事实提取到 BM25 索引选型【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight本文基于 Hindsight 官方文档《Multilingual Support》展开深入讲解该项目如何实现输入什么语言、记忆与响应就保持什么语言的多语言能力包括 retain/recall/reflect 全流程中的语言保持机制、多语言嵌入与重排模型配置、五种 BM25 全文检索后端的 CJK 适配差异以及HINDSIGHT_API_LLM_OUTPUT_LANGUAGE强制输出语言参数的底层实现。读完后你可以为一套中文/日文为主的 Agent 记忆库完成完整的模型与索引选型并理解每条配置在源码中的实际作用点。核心机制用 LLM Prompt 指令实现语言检测Hindsight 会自动检测输入内容的语言并让事实facts、实体entities和 reflect 响应保持原始语言而不会翻译成英文。官方给出的处理链路如下当你 retain 内容或发起 reflect 查询时Hindsight 会依次完成四步自动检测输入语言——从内容本身推断以原始语言提取事实——保留语气与语义细节以原生文字存储实体——张伟 保持为 张伟而不是 Zhang Wei以相同语言响应——中文查询得到中文回答。值得强调的是文档Technical Details部分明确指出多语言支持完全通过 LLM Prompt 指令实现而不是依赖外部语言检测库。从源码可以印证这一点retain 的事实提取 Prompt 中直接内置了一条强制性的语言规则见 fact_extraction.pyLANGUAGE: MANDATORY — Detect the language of the input text and produce ALL output in that EXACT same language. You are STRICTLY FORBIDDEN from translating or switching to any other language. Every single word of your output must be in the same language as the input. ...这条规则被注入 retain、consolidation、reflect 各环节的 Prompt 模板模板中含{language_section}占位符。这种方案的好处是文档所列的四点无额外依赖、适用于任何支持多语言的 LLM、天然处理混合语言边缘情况、比基于规则的翻译更好地保留语义。Retain 非英文内容retain 任意语言的内容时Hindsight 都会以相同语言提取并存储事实。示例中文内容from hindsight import Hindsight hindsight Hindsight() # Retain 中文内容 hindsight.retain( bank_iduser-123, content 张伟是一位资深软件工程师在腾讯工作了五年。 他专门研究分布式系统并领导了公司微服务架构的开发。 , context团队概述 ) # 用中文查询——得到中文结果 results hindsight.recall( bank_iduser-123, query告诉我关于张伟的信息 ) # 事实以中文返回 # - 张伟是一位资深软件工程师在腾讯工作了五年 # - 张伟专门研究分布式系统并领导了公司微服务架构的开发示例日文内容hindsight.retain( bank_iduser-123, content 田中さんはソフトウェアエンジニアで、東京のスタートアップで働いています。 彼女はPythonとTypeScriptが得意で、毎日コードレビューをしています。 , contextチームプロフィール ) # 用日文查询 results hindsight.recall( bank_iduser-123, query田中さんについて教えてください )Reflect 对非英文查询的语言响应reflect操作同样尊重输入语言会以与查询相同的语言生成回答。示例中文反思# 存储团队成员的事实中文 hindsight.retain( bank_idteam-eval, content张伟是一位优秀的软件工程师完成了五个重大项目。他总是按时交付代码整洁有良好的文档。, context绩效评估 ) hindsight.retain( bank_idteam-eval, content李明最近加入团队。他错过了第一个截止日期代码有很多bug。, context绩效评估 ) # 用中文 reflect result hindsight.reflect( bank_idteam-eval, query谁是更可靠的工程师 ) # 响应为中文 # 我认为张伟更可靠。张伟完成了五个重大项目按时交付代码质量高...reflect 环节的语言控制同样来自 Promptreflect/prompts.py 与 reflect/agent.py 都会把语言指令或强制语言指令织入系统 Prompt 与工具 schema保证最终的自然语言回答与查询同语言。混合语言内容Hindsight 也能优雅地处理混合语言内容在合适的位置同时保留两种语言。示例含英文公司名的中文文本hindsight.retain( bank_iduser-123, content 王芳在Google北京办公室工作她是一名高级产品经理。 之前她在Microsoft和Amazon工作过。 她负责管理YouTube在中国市场的推广策略。 , context员工资料 ) # 事实同时保留两种语言 # - 王芳在Google北京办公室工作担任高级产品经理 # - 王芳曾在Microsoft和Amazon工作过 # - 王芳负责管理YouTube在中国市场的推广策略这与源码中专名永不翻译的规则一致prompt_utils.py 的语言指令明确要求实体名entity names保持原样因此 Google、Microsoft、YouTube 等专有名词不会被转写。支持的语言范围Hindsight 的多语言能力完全取决于你所用 LLM 的语言能力。Hindsight 只是指示 LLM 检测输入语言并以该语言响应——如果 LLM 支持某种语言Hindsight 就能处理它。大多数现代 LLMGPT-4、Claude、Gemini、Llama 3 等支持数十种语言包括东亚中文简体/繁体、日文、韩文欧洲西班牙语、法语、德语、意大利语、葡萄牙语、荷兰语、波兰语、俄语中东阿拉伯语、希伯来语、土耳其语南亚印地语、孟加拉语、泰米尔语东南亚泰语、越南语、印尼语验证目标语言支持的正确做法是直接用该语言内容测试你的 LLM如果模型能理解并生成该语言文本Hindsight 就能正确保持它。多语言配置四个组件的完整选型要获得最优的多语言效果需要配置管道的四个组件。下面逐个展开并结合源码说明每个配置项的真实作用点。1. LLM必需你的 LLM 必须支持目标语言。大多数现代 LLM 都支持但请用你实际使用的具体模型验证。2. 嵌入模型推荐默认嵌入模型BAAI/bge-small-en-v1.5是纯英文的——这一点在 config.py 中可以看到常量定义DEFAULT_EMBEDDINGS_LOCAL_MODEL BAAI/bge-small-en-v1.5。对多语言内容应改用多语言嵌入模型# 在 .env 文件中 HINDSIGHT_API_EMBEDDINGS_LOCAL_MODELBAAI/bge-m3推荐的多语言嵌入模型模型语言数说明BAAI/bge-m3100多语言综合表现最佳intfloat/multilingual-e5-large100良好替代方案sentence-transformers/paraphrase-multilingual-MiniLM-L12-v250更轻量3. 重排模型推荐默认重排器cross-encoder/ms-marco-MiniLM-L-6-v2同样是纯英文的见 config.py 的DEFAULT_RERANKER_LOCAL_MODEL。多语言内容请换用多语言重排器# 在 .env 文件中 HINDSIGHT_API_RERANKER_LOCAL_MODELBAAI/bge-reranker-v2-m3推荐的多语言重排器模型模型语言数说明BAAI/bge-reranker-v2-m3100多语言重排最佳cross-encoder/mmarco-mMiniLMv2-L12-H384-v114更轻量的替代4. BM25 / 全文检索后端语义嵌入检索臂负责按语义的跨语言匹配Hindsight 会并行运行一条 BM25 关键词检索臂。而BM25 本质上是语言内的——它是针对分词器词素的字符/token 精确匹配。默认的native后端使用 PostgreSQL 的英文词典对非英文内容效果很差对没有空格分词边界的中文/日文/韩文更是完全无法有效分词。这里有两个相互关联的开关HINDSIGHT_API_TEXT_SEARCH_EXTENSION——选择后端native、vchord、pg_textsearch、pgroonga或pg_search。HINDSIGHT_API_TEXT_SEARCH_EXTENSION_NATIVE_LANGUAGE——选择native后端使用的 PostgreSQL 词典默认english。按 bank 中存储的语言选择后端后端多语言/CJK说明native仅欧洲语言英、法、德、西、意、葡、俄、荷、瑞典语、挪威语、丹麦语、芬兰语、匈牙利语、土耳其语、阿拉伯语以及simple。CJK 需要zhparser等第三方词典。原生 PostgreSQL无需额外扩展。语言通过HINDSIGHT_API_TEXT_SEARCH_EXTENSION_NATIVE_LANGUAGE配置。vchord通过llmlingua2分词器支持多语言。如果你已经在用 vchord 做向量检索这是最优选。pg_textsearch仅英文硬编码。工业标准 BM25 排序 Block-Max WAND。pgroonga开箱即用。单个索引即可处理英文、CJK 及混合文字内容基于TokenBigram多语言分词器 NormalizerNFKC150Unicode 归一化。非英文/多语言 bank 的推荐选择。需要pgroonga扩展见 docker/docker-compose/pgroonga。pg_search通过可配置分词器支持多语言如chinese_compatible、jieba、chinese_lindera、japanese_lindera、korean_lindera、ngram。ParadeDBpg_search扩展唯一兼容 Citus 的 BM25 后端。分词器通过HINDSIGHT_API_TEXT_SEARCH_EXTENSION_PG_SEARCH_TOKENIZER设置见 docker/docker-compose/pg_search。单语言 bank 的选型例如全是西班牙语文本HINDSIGHT_API_TEXT_SEARCH_EXTENSIONnative HINDSIGHT_API_TEXT_SEARCH_EXTENSION_NATIVE_LANGUAGEspanishCJK 或多语言 bank 的选型HINDSIGHT_API_TEXT_SEARCH_EXTENSIONpgroonga注意native与pgroonga的开关互不适用——pgroonga的分词器在索引创建时确定会忽略HINDSIGHT_API_TEXT_SEARCH_EXTENSION_NATIVE_LANGUAGE。从源码看native后端的语言配置最终落地在 SQL 的to_tsvector调用上ops_postgresql.py 会生成形如to_tsvector({config.text_search_extension_native_language}::regconfig, ...)的表达式即 PostgreSQL 全文索引的词典由该参数直接决定。而 pgroonga 臂则调用pgroonga_tokenize(..., TokenBigram, NormalizerNFKC150)这一点可在 test_multilingual_bm25.py 的断言中得到验证。配置项本身在 config.py 中定义并且text_search_extension_native_language会经过 PostgreSQL 标识符合法性校验正则[a-zA-Z_][a-zA-Z0-9_]*防止拼入任意 SQL。强制指定 LLM 输出语言独立于 BM25 后端之外HINDSIGHT_API_LLM_OUTPUT_LANGUAGE会把所有LLM 生成产物统一固定到单一语言与源内容语言无关。它统一作用于Retain——从源文档提取的事实文本、上下文、实体名Consolidation——由这些事实合成的观察observations/ 心智模型Reflect——reflect API 返回的最终自然语言响应。# 所有 LLM 调用retain、consolidation、reflect无论源语言都输出西班牙语。 HINDSIGHT_API_LLM_OUTPUT_LANGUAGESpanish这一机制的实现在 prompt_utils.pyoutput_language_directive()为 retain 的事实提取、consolidation 与 reflect 追加统一指令——IMPORTANT: Respond exclusively in {language}. Translate any source content into {language}. All output text — including fact text, observations, entity names, and the final response — must be in {language}.一个值得注意的实现细节default_language_section()与output_language_directive()是互斥的——一旦设置了显式输出语言保持源语言的默认规则会被整体移除而不是与新指令并存源码注释说明两条指令同时出现时模型会因保持源语言规则语气更强而静默忽略配置见 issue #3776 的记录。相关行为可由 test_retain_reflect_output_language.py 与 test_consolidation_output_language.py 复验。常见配置模式对齐的单语言 bankHINDSIGHT_API_TEXT_SEARCH_EXTENSION_NATIVE_LANGUAGEspanishHINDSIGHT_API_LLM_OUTPUT_LANGUAGESpanish——即使源语言混杂也以西班牙语存储、索引、响应带多语言索引的混合语言 bankHINDSIGHT_API_TEXT_SEARCH_EXTENSIONpgroonga 不设置HINDSIGHT_API_LLM_OUTPUT_LANGUAGE——事实保持源语言pgroonga 用单个索引处理所有语言reflect 按查询语言响应跨语言归一化HINDSIGHT_API_LLM_OUTPUT_LANGUAGEEnglish——无论源语言所有事实、观察、reflect 响应统一为英文。适用于消费端仅英文的 LLM、仪表盘或下游管道需要统一输出格式的场景。不设置HINDSIGHT_API_LLM_OUTPUT_LANGUAGE时管道会保持源语言/查询语言默认行为。未设置输出语言时的默认行为不设置HINDSIGHT_API_LLM_OUTPUT_LANGUAGE时retain 与 consolidation 都会被指示保持源材料语言输出。对 observations观察而言语言按单条 observation 决定依据其构建所基于的事实——而不是整个批次。一个混合了中英文事实的批次会为中文事实产出中文观察、为英文事实产出英文观察。若一条 observation 合并了多种语言的事实则以这些事实中的多数语言为准。更新跟随新事实的语言。当既有 observation 的语言与更新它的新事实不同时整条 observation 会按新事实的语言重写。一个 observation 曾漂移到错误语言的 bank会随着新事实到达而逐步收敛回来。专名与技术术语永不翻译——专有名词、产品名、地名、标识符、代码、单位无论周围语言是什么都按源事实的原文保留。需要明确边界这是Prompt 级别的引导不是硬保证——一个不遵守指令的模型仍可能输出错误语言。若某个 bank 必须无论源内容如何都保持单一语言请显式设置HINDSIGHT_API_LLM_OUTPUT_LANGUAGE。最佳实践1. 非英文内容使用多语言模型如果你的主要工作语言不是英文请配置多语言嵌入与重排模型。纯英文模型仍能正确存储你的内容但语义检索质量会下降。2. 每次 retain 调用保持单一语言混合内容虽然可以工作但让每次retain调用集中在单一语言上结果更一致。3. 用与内容相同的语言查询最佳效果是用与存储内容相同的语言查询。跨语言查询例如用英文查询中文内容可能有效但效果取决于你的嵌入模型结果会有波动。小结Hindsight 的多语言体系是一条完整的链路语言检测与保持由 Prompt 指令完成无需额外依赖库嵌入/重排模型负责语义臂的跨语言能力BM25 后端pgroonga/pg_search等负责语言内的关键词召回而HINDSIGHT_API_LLM_OUTPUT_LANGUAGE则提供一条一刀切的归一化开关。部署 CJK 为主的记忆库时官方文档与 docker/docker-compose/pgroonga/docker-compose.yaml、docker/docker-compose/pg_search/docker-compose.yaml 提供了可直接参考的容器化参考配置完整文档见 hindsight-docs/versioned_docs/version-0.9/developer/multilingual.md。【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表