当前位置: 首页 > ops >正文

RAG实现多语言客户端的技术方案

场景:

RAG项目对应的目标客户群体是多个不同国家、不同语言,比如 英语、中文、德语等。开发RAG项目,该如何应对这种场景呢?

一、知识库搭建

1、知识库存储相关数据,是否要多语言存储? 

若能够提供多语言版本的知识源数据文档,建议各种语言都Embeddings向量化存储一份;可分在不同的表里,也可以在同一个表里。

若无法提供多语言版本的知识源数据文档,或有些能有些不能,则只存储其中一份较为完善的文档。

二、提示词模版

1、提示词模版是否需要每种语言各设置一份?

强烈建议,每种语言各设置一份;并且多次检索的每次调用大模型的提示词语言保持一致。

2、如何判断客户输入的是什么语言?

可使用lingua包,对用户输入的文本进行语言识别。

pip install lingua-language-detector
from lingua import Language, LanguageDetectorBuilderdef detect_language(text: str) -> str:"""检测文本语言,返回 zh/en/es"""if not text:return "es"detector = LanguageDetectorBuilder.from_languages(Language.CHINESE, Language.ENGLISH, Language.SPANISH).build()lang = detector.detect_language_of(text)if lang == Language.CHINESE:return "zh"elif lang == Language.ENGLISH:return "en"else:return "es"

3、多轮对话引擎如何设置提示词模版?

以LlamaIndex框架的多轮对话引擎来实现,这里我们采用CondenseQuestionChatEngine对话引擎+CitationQueryEngine 查询引擎。

其中查询引擎CitationQueryEngine 需要设置2个提示词模版,citation_qa_template和citation_refine_template。如何根据多语言设置呢?LlamaIndex默认已经帮我们实现一套英文版本的提示词,根据源码可以找到提示词模版,然后拿出来翻译成各种语言版本即可。

对话引擎CondenseQuestionChatEngine还有一个提示词模版condense_question_prompt,设置方法跟上面的一样。

最终在使用该引擎时候指定对自定义的提示词模版引擎。

    async def achat_stream(self, query: str, session_id: str,lang:str='en'):"""RAG-Base方法:param query:客户的提示:param session_id:对话的SessionId:param lang:客户的语言:return:"""logger.warning(f"query={query},lang={lang},session_id={session_id}")# 1- 初始化知识库索引muxue_vector=MuXueVectorStore()semantic_index = await muxue_vector.init_kbm_vector_index()# 2- 获取长期记忆和短期记忆memory = await self.get_session_memory(session_id)# logger.info(f"memory={memory}")# 获取提示词模版tcp = MuXueCitationQueryPrompt(lang)citation_qa_tmpl = tcp.get_citation_qa_prompt()citation_refine_tmpl = tcp.get_citation_refine_prompt()query_engine = CitationQueryEngine.from_args(semantic_index,similarity_top_k=3,citation_chunk_size=512,streaming=True,citation_qa_template=citation_qa_tmpl,citation_refine_template=citation_refine_tmpl,verbose=True,filters=MetadataFilters(filters=[MetadataFilter(key="lang", value=lang)]),node_postprocessors=[FallbackNodePostprocessor(threshold=0.6,verbose=True,lang=lang)]  #  过滤低分)cq_prompt_custom=MuXueCondenseQuestionPrompt(lang).get_prompt()chat_engine = CondenseQuestionChatEngine.from_defaults(query_engine=query_engine,condense_question_prompt=cq_prompt_custom,memory=memory,verbose=True,)resp = await chat_engine.astream_chat(query)async for delta in resp.async_response_gen():# print(f"delta:{delta}")yield delta# 结束后再读取引用(此时后台写历史已完成)sources = [{"id": getattr(n.node, "node_id", None),"text": n.node.get_content()[:200],"metadata": getattr(n.node, "metadata", {}),}for n in (resp.sources[0].raw_output.source_nodes if resp.sources else [])]yield {"type": "sources", "content": sources}

核心代码如上,filters还可以根据MetadateFilters中lang字段进行筛选。lang字段可以在搭建知识库Embeddings的时候,根据文档的语言设置。

http://www.xdnf.cn/news/18674.html

相关文章:

  • Claude Code 使用及配置智能体
  • MQTT协议详解:从基础原理到工业级实践指南
  • CANopen - DCF(Device Configuration File) 介绍
  • Apache Maven 3.1.1 (eclipse luna)
  • MATLAB 绘制根轨迹、Bode图的方法
  • 扭蛋机小程序系统开发:连接线上线下娱乐的新桥梁
  • 掌握C++ std::invoke_result_t:类型安全的函数返回值提取利器
  • 在Excel和WPS表格中拼接同行列对称的不连续数据
  • Docker Compose 部署 Elasticsearch 8.12.2 集成 IK 中文分词器完整指南
  • python面试题目100个(更新中预计10天更完)
  • LangChain4J-(2)-高阶API与低阶API
  • 汽车零部件工厂ESOP系统工业一体机如何选型
  • 基于51单片机红外避障车辆高速汽车测速仪表设计
  • 简述Myisam和Innodb的区别?
  • C++17 中std::any 详解和代码示例
  • 【LeetCode 热题 100】416. 分割等和子集——(解法一)记忆化搜索
  • ansible的搭建与安装
  • 在数字化转型过程中,如何确保数据安全和隐私保护?
  • Linux 软件编程(十一)网络编程:TCP 机制与 HTTP 协议
  • 我的项目管理之路-组织级项目管理(二)
  • 【spring进阶】spring应用内方法调用时长统计
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day13
  • Python之matplotlib 基础三:绘制折线图
  • 什么是JSON-RPC 2.0,在项目中应该怎么使用
  • Jenkins+docker 微服务实现自动化部署安装和部署过程
  • More Effective C++ 条款08:理解各种不同意义的new和delete
  • (操作系统)死锁是什么 必要条件 解决方式
  • 【Task05】:向量数据库实践(第三章3、4节)
  • Fory序列化与反序列化
  • ArcGIS JSAPI 高级教程 - 创建渐变色材质的自定义几何体