You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于LangChain/Llama的RAG系统中获取原始输入文档来源的技术咨询

基于LangChain/Llama的RAG系统中获取原始输入文档来源的技术咨询

嘿,我完全懂你的困扰!这确实是刚玩RAG时很容易踩的小坑——你要的是自己上传的那批txt文件的编号(比如doc0357.txt),但现在返回的是文档内容里提到的外部引用(docA、docB),对吧?

别担心,解决方法其实就在你拿到的source_documents里,只是你没用到它的另一个关键部分:metadata(元数据)。

核心思路

当你用LangChain加载本地txt文件时,每个生成的Document对象都会自带metadata字段,里面默认就包含了原始文件的路径/文件名(比如doc0001.txt)。你之前只提取了page_content(文档里的文字),自然拿不到自己要的源文件信息。

具体操作步骤

  1. 先确认加载文档时的metadata是否正确
    不管你是单个加载还是批量加载,LangChain的加载器(比如TextLoader、DirectoryLoader)都会自动把文件路径存入metadata['source']里。你可以先验证一下:

    from langchain.document_loaders import TextLoader
    loader = TextLoader("doc0001.txt")
    doc = loader.load()[0]
    print(doc.metadata)  # 输出应该包含'source': 'doc0001.txt'
    
  2. 修改查询代码,提取原始文档来源
    把你原来的代码改成从metadata里取文件名,而不是从page_content里找引用:

    prompt = "Tell me about artificial intelligence in medicine"
    output = qa_llm({'query': prompt})
    
    # 从每个源文档的metadata里提取原始文件名
    original_sources = [doc.metadata['source'] for doc in output['source_documents']]
    # 去重(避免同一个文档被多次检索到重复输出)
    unique_sources = list(set(original_sources))
    
    # 打印结果和原始来源文档
    print(output["result"])
    print("原始来源文档:", "|".join(unique_sources))
    
  3. 如果是批量加载文档
    如果你用DirectoryLoader批量加载所有txt文件,同样会自动给每个文档加上正确的source元数据,直接用上面的代码就行:

    from langchain.document_loaders import DirectoryLoader
    
    # 加载指定目录下的所有txt文件
    loader = DirectoryLoader("./your_text_files_folder/", glob="*.txt")
    all_docs = loader.load()
    

额外说明

你之前看到的docA、docB是文档内容里的文本,属于文档本身提到的引用;而metadata里的source是你自己上传的原始文件标识,这两者完全是两回事。只要加载文档时没刻意修改或删除metadata,就能轻松拿到你要的doc0357.txt这类文件名列表。

备注:内容来源于stack exchange,提问作者elbillaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 03:38:01