系统)
ai-engineering-hub 实战基于 Cleanlab TLM 与 LlamaParse 构建可信 RAGTrustworthy RAG系统【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub面向复杂文档的 RAG 问答最怕的不是答不出来而是答得自信但错了。本教程以 trustworthy-rag 项目为核心讲解如何借助 Cleanlab 的可信语言模型TLM为每个 RAG 回答附带可信度评分trustworthiness score与推理依据explanation并用 LlamaParse 将复杂 PDF 解析为 LLM 友好的 Markdown。读完本文你将掌握一套答案与置信度同时产出的可信 RAG 完整工程方案并能在本地一键运行可交互的 Streamlit 演示。为什么需要 Trustworthy RAG从生成答案到评估答案传统 RAG 流水线通常只负责把检索到的上下文拼进提示词然后让 LLM 生成答案至于这个答案是否可靠、是否有幻觉往往缺乏量化信号。Trustworthy RAG 的思路是在生成环节引入可信语言模型Trustworthy Language ModelTLMTLM 不仅生成文本还会同步输出一个置信度分数和一条自然语言推理说明让系统与使用者都能判断这句话到底可不可信。在 trustworthy-rag 项目中这一思路被拆成两个核心组件Cleanlab TLM提供置信度分数trustworthiness_score与推理explanation的可信语言模型作为 RAG 的 LLM 后端LlamaParse由 LlamaCloud 提供的文档解析服务将表格、图表、多栏排版等复杂 PDF 解析成干净的 Markdown保证进入向量库的是LLM 就绪的文本。因此整个项目的技术骨架是LlamaParse复杂文档解析→ 向量索引嵌入 检索→ Cleanlab TLM生成 可信度评分再通过 LlamaIndex 的事件机制把评分与推理从底层模型中捞出来呈现给用户。环境准备与依赖安装1. 准备 API Key 并配置 .env项目运行时需要两个外部服务的密钥对应 .env.example 中的两个变量变量用途获取方式LLAMA_CLOUD_API_KEY调用 LlamaParse 解析复杂 PDF在 LlamaCloud 控制台生成CLEANLAB_API_KEY调用 Cleanlab TLM 生成可信回答在 TLM 服务页面申请操作方式将 .env.example 复制为.env填入真实密钥。仓库 .gitignore 已忽略.env密钥不会进入版本库。2. 安装依赖README 明确要求Python 3.11 或更高版本然后执行pip install llama-index-llms-cleanlab llama-index llama-index-embeddings-huggingface三个包各自承担明确职责llama-index-llms-cleanlabCleanlab TLM 的 LlamaIndex 集成负责把 TLM 包装成标准的BaseLLM供Settings.llm与VectorStoreIndex使用llama-index核心框架提供索引、查询引擎、提示词模板与 instrumentation事件系统llama-index-embeddings-huggingface本地 Hugging Face 嵌入模型接入负责将文档与查询向量化。另外app.py 中还用到了streamlit、llama-parse、python-dotenv等依赖运行应用前需要一并安装可参考 notebook 首行注释中的安装命令。3. 运行应用streamlit run app.py启动后浏览器会打开 Streamlit 界面左侧侧边栏可上传 PDF 并预览、建索引主区域是与文档对话的聊天窗口每条回答下方都会展示Trustworthiness Score与Reasoning。核心链路一用 Cleanlab TLM 作为可信 LLMTLM 的接入方式在 app.py 的load_llm()中一目了然st.cache_resource def load_llm(): options { model: gpt-4o, max_tokens: 256, log: [explanation], } llm CleanlabTLM(api_keyos.environ[CLEANLAB_API_KEY], optionsoptions) return llm三个关键配置项model底层托管的模型标识当前仓库固定为gpt-4o。TLM 会在该模型之上进行可信度校准因此换模型即意味着换一套置信度分布调参时建议保持稳定max_tokens单次生成的最大 token 数仓库取 256。对 RAG 问答场景这是一个较克制的上限防止回答失控超长若你的文档问题需要长答案可适度调大log声明需要 TLM 额外返回的信息仓库传入[explanation]即要求模型在生成回答的同时给出为什么可信/为何怀疑的推理文本。注意api_key直接读取环境变量CLEANLAB_API_KEY因此.env必须在启动进程前被加载notebook 中通过load_dotenv()完成见 main.ipynb。TLM 返回的额外字段直接调用 TLM 时置信度与推理会出现在响应的additional_kwargs中。main.ipynb 给出了一个真实运行样例response llm.complete(What is NVIDIAs ticker symbol?) print(response) # NVIDIAs ticker symbol is NVDA. response.additional_kwargs输出{trustworthiness_score: 0.9885545474223644, explanation: Did not find a reason to doubt trustworthiness.}这里trustworthiness_score是一个 01 的浮点数样例为 0.989explanation是一句人类可读的推理。这份证据说明可信度信息由 TLM 在生成时同步产出不需要额外做二次打分模型这正是本方案零额外开销地获得可信信号的关键。核心链路二用 LlamaParse 解析复杂文档复杂 PDF含表格、双栏、扫描排版、数学公式直接喂给切分器往往会把版式语义打碎。项目使用 LlamaParse 先把 PDF 转成结构化 Markdown再进行索引。相关代码在 app.pyfrom llama_parse import LlamaParse parser LlamaParse(result_typemarkdown) docs parser.load_data(file_path)result_typemarkdown指定解析输出格式为 Markdown这是后续文档切分与检索最友好的形态load_data(file_path)上传的文件先被写入临时目录tempfile.TemporaryDirectory再交给 LlamaParse 异步解析notebook 的运行日志显示解析会生成一个job_id如3e4a97ad-7b24-45e2-af2f-45c549e10e88即 LlamaParse 云端任务编号解析失败时app.py 会捕获异常并通过st.error提示Error parsing PDF避免应用崩溃。仓库 docs 目录内置了一份示例文档dspy.pdfDSPy 框架论文/白皮书notebook 正是用它完成了端到端演示你可以直接复用该文件验证链路。核心链路三向量索引、查询引擎与提示词定制嵌入模型仓库在嵌入上使用了 BGE 系列本地模型app.pyHuggingFaceEmbedding(model_nameBAAI/bge-large-en-v1.5, trust_remote_codeTrue)main.ipynbHuggingFaceEmbedding(model_nameBAAI/bge-small-en-v1.5)同一项目内 notebook 用small版更轻量、便于快速实验Streamlit 应用用large版精度更高。两者都是英文为主的向量模型这也提示了适用前提本文方案面向英文文档效果最佳中文文档需要替换为合适的中文嵌入模型。构建索引与查询引擎app.py 展示了从文档到查询引擎的最小闭环Settings.embed_model embed_model index VectorStoreIndex.from_documents(docs, show_progressTrue) Settings.llm load_llm() query_engine index.as_query_engine()这里通过全局Settings分别注入嵌入模型与 TLMVectorStoreIndex.from_documents完成切分、向量化与入库as_query_engine()得到可回答问题的查询引擎。注意顺序先设置嵌入模型再建索引先设置 LLM 再生成查询引擎。定制 QA 提示词模板项目没有沿用默认提示词而是定制了一个要求模型逐步思考、不确定就明说的模板app.pyqa_prompt_tmpl_str ( Context information is below.\n ---------------------\n {context_str}\n ---------------------\n Given the context information above I want you to think step by step to answer the query in a crisp manner, incase case you dont know the answer say I dont know!.\n Query: {query_str}\n Answer: ) qa_prompt_tmpl PromptTemplate(qa_prompt_tmpl_str) query_engine.update_prompts( {response_synthesizer:text_qa_template: qa_prompt_tmpl} )两处设计值得注意模板同时注入{context_str}检索到的上下文与{query_str}用户问题并在指令中显式要求step by step思考、不知道就回答 I dont know!——这既提升了推理质量也让 TLM 的置信度判断建立在更稳的生成过程之上update_prompts的键名response_synthesizer:text_qa_template是 LlamaIndex 内部响应合成器的提示词注册名直接改模板而无需改检索逻辑体现了 LlamaIndex 的可插拔设计。核心链路四用 Instrumentation 事件机制捕获可信度评分答案文本来自query_engine.query()但可信度分数与推理存放在底层 TLM 响应的additional_kwargs里普通调用拿不到。项目巧妙利用了 LlamaIndex 的 instrumentation事件分发机制来解决核心实现在 utils.pyfrom llama_index.core.instrumentation import get_dispatcher from llama_index.core.instrumentation.events.llm import LLMCompletionEndEvent from llama_index.core.instrumentation.event_handlers import BaseEventHandler class GetTrustworthinessScoreAndReasoning(BaseEventHandler): events: ClassVar[List[BaseEvent]] [] trustworthiness_score: float 0.0 reasoning: str classmethod def class_name(cls) - str: return GetTrustworthinessScoreAndReasoning def handle(self, event: BaseEvent) - Dict: if isinstance(event, LLMCompletionEndEvent): self.trustworthiness_score event.response.additional_kwargs[ trustworthiness_score ] self.reasoning event.response.additional_kwargs[explanation] self.events.append(event)其工作机理是事件监听LlamaIndex 的根调度器get_dispatcher()会在 LLM 完成生成时派发LLMCompletionEndEvent按类型过滤自定义BaseEventHandler的handle()只处理LLMCompletionEndEvent从中取出response.additional_kwargs里的trustworthiness_score与explanation注册挂载setup_trustworthiness_handler()把 handler 注册到根 dispatcher之后所有 LLM 调用的事件都会被它捕获def setup_trustworthiness_handler(): root_dispatcher get_dispatcher() event_handler GetTrustworthinessScoreAndReasoning() root_dispatcher.add_event_handler(event_handler) return event_handler因此RAG 问答后只需从同一个 handler 实例读取两个属性即可拿到可信信号utils.py 的outputs_with_trustworthiness/display_response封装了这一步。这是本项目区别于普通 RAG 的最核心模式不改动检索与生成主流程仅通过事件订阅就为系统叠加了可信度观测能力可迁移到任何 LlamaIndex 应用。端到端验证Notebook 演示的真实输出main.ipynb 把上述链路串联成可逐步复现的演示流程为load_dotenv()加载.env配置CleanlabTLMgpt-4o/max_tokens256/log[explanation]直接调用llm.complete(...)观察additional_kwargs中的trustworthiness_score与explanation见上文 NVIDIA 示例设置Settings.llm、Settings.embed_modelBAAI/bge-small-en-v1.5用LlamaParse(result_typemarkdown).load_data(docs/dspy.pdf)解析示例文档构建VectorStoreIndex与查询引擎注册事件 handler查询 What is DSPy? 并打印完整结果。notebook 保存的真实运行输出如下Response: DSPy is a framework that abstracts the process of prompting and fine-tuning language models by using natural language signatures. ... Trustworthiness score: 0.96 Reasoning: Did not find a reason to doubt trustworthiness.这个例子非常有信息量模型基于文档给出了完整、流畅的 DSPy 定义回答同时给出0.96的高可信度与未发现可疑点的推理。它证明了整套链路解析 → 检索 → 生成 → 可信度捕获可以真实跑通且置信度与回答质量一致。若检索到的上下文不足或存在矛盾TLM 的分数通常会下降——这正是将该分数作为 RAG 质量监控信号的基础。交互层Streamlit 应用的用户体验设计app.py 在工程细节上也值得学习会话隔离用uuid.uuid4()生成session_id上传文件以{session_id}-{filename}为键存入st.session_state.file_cache避免多用户/多次上传互相污染缓存复用st.cache_resource缓存 TLM 实例已建索引的文件直接复用query_engine不重复解析app.pyPDF 内联预览通过 base64 嵌入iframe在侧边栏展示原文app.py方便用户对照答案与原文流式输出 可视化评分回答按单词逐字渲染time.sleep(0.05)模拟打字机效果随后用带呼吸灯动画的浮层展示Trustworthiness Score保留两位小数再单独展示Reasoning文本app.py清理入口Clear ↺按钮调用reset_chat()清空消息并触发gc.collect()释放内存。适用前提与使用建议英文优先示例嵌入模型BGE en 系列与示例文档docs/dspy.pdf均面向英文中文场景需替换嵌入模型并评估 TLM 对中文的置信度表现需要两个外部 API Key整个方案依赖 LlamaCloudLlamaParse与 Cleanlab TLM 两个云端服务离线环境无法直接运行max_tokens256是当前配置回答较长的复杂问题时可能被截断可按需调大同时model字段决定底层模型与置信度分布生产环境更换前建议先小规模验证可信度分数是辅助信号而非绝对真理它来自 TLM 对自身生成过程的内部评估实践中应将其与检索质量、人工抽检结合使用例如对低分回答自动触发重新检索或拒绝回答策略事件捕获依赖单次查询的最后一次 LLM 调用从实现看handler 记录的是最近一次LLMCompletionEndEvent的字段若查询链路中存在多次 LLM 调用如多轮代理需要根据事件顺序进一步区分这是将该模式扩展到 Agent 场景时要注意的边界。总结本文围绕 trustworthy-rag 完整拆解了可信 RAG的落地方案LlamaParse 负责把复杂 PDF 变成干净的 MarkdownBGE 嵌入模型负责向量化Cleanlab TLM 负责生成并同步产出置信度评分与推理LlamaIndex instrumentation 事件机制负责把可信信号无侵入地取出并展示。你可以在本仓库中按 README 的三步配.env→pip install→streamlit run app.py立刻复现也可以直接阅读 app.py、utils.py 与 main.ipynb 三份源码将事件驱动捕获可信度这一模式移植到自己的 RAG 系统中——让每一次回答都自带可审计的置信度证据。【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考