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

使用YoutubeLoader.from_youtube_url遇元数据None值报错的解决咨询

问题解决:YoutubeLoader加载视频后Chroma构建向量库触发ValueError

问题场景

使用LangChain的YoutubeLoader.from_youtube_url方法加载YouTube视频(开启add_video_info=True),分割文档后通过Chroma构建向量库时,触发如下错误:

ValueError: Expected metadata value to be a str, int, or float, got None

报错原因

开启add_video_info=True后,YoutubeLoader会为文档附加视频的元数据(如标题、发布时间、标签等),但部分元数据字段可能为None值。而Chroma向量库要求所有元数据的值必须是字符串、整数或浮点数类型,不允许存在None,因此触发验证错误。

解决方法

方法1:清理文档中的None元数据

在分割文档后、构建向量库前,遍历所有文档,过滤掉元数据中值为None的字段:

# 分割文档后添加这段代码
for doc in documents:
    # 过滤元数据中的None值
    doc.metadata = {k: v for k, v in doc.metadata.items() if v is not None}

方法2:关闭视频信息添加(不推荐,会丢失元数据)

如果不需要视频元数据,可以将add_video_info设为False:

loader = YoutubeLoader.from_youtube_url(youtube_url="https://www.youtube.com/watch?v=7OPg-ksxZ4Y", add_video_info=False)

完整修复后的代码示例

import os,openai

from langchain.document_loaders import YoutubeLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import ConversationalRetrievalChain

from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate
)
os.environ["OPENAI_API_KEY"] = "apikey"
loader = YoutubeLoader.from_youtube_url(youtube_url="https://www.youtube.com/watch?v=7OPg-ksxZ4Y",add_video_info=True)
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 300,
    chunk_overlap = 20
)

documents = text_splitter.split_documents(documents)

# 新增:清理元数据中的None值
for doc in documents:
    doc.metadata = {k: v for k, v in doc.metadata.items() if v is not None}

embeddings = OpenAIEmbeddings()
vector_store = Chroma.from_documents(documents=documents,embedding=embeddings)
retriever = vector_store.as_retriever()

system_template = """
Use the following context to answer the user's question.
If you don't know the answer, say you don't, don't try to make it up. And answer in Chinese.
-----------
{context}
-----------
{chat_history}
"""

messages  =[
    SystemMessagePromptTemplate.from_template(system_template),
    HumanMessagePromptTemplate.from_template('{question}')
]

prompt = ChatPromptTemplate.from_messages(messages)

qa = ConversationalRetrievalChain.from_llm(ChatOpenAI(temperature=0.1,max_tokens=2048),retriever,qa_prompt=prompt)
chat_history = []
while True:
    question = input('问题:')
    result = qa({'question':question,'chat_history':chat_history})
    chat_history.append((question,result['answer']))
    print(result['answer'])

内容的提问来源于stack exchange,提问作者erosion wind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:27:38