使用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
相关产品推荐
相关产品推荐

