如何使用LangChain加载多CSV文件并实现跨文件问答?
多CSV文件加载至LangChain并实现问答查询
需求与现有代码
我有一个包含多个CSV文件的文件夹,希望将所有文件加载到LangChain中并实现问答查询。以下是我当前编写的代码:
from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.text_splitter import CharacterTextSplitter from langchain import OpenAI, VectorDBQA from langchain.document_loaders import DirectoryLoader from langchain.document_loaders.csv_loader import CSVLoader import magic import os import nltk os.environ['OPENAI_API_KEY'] = '...' loader = DirectoryLoader('../data/', glob='**/*.csv', loader_cls=CSVLoader) documents = loader.load() text_splitter = CharacterTextSplitter(chunk_size=400, chunk_overlap=0) texts = text_splitter.split_documents(documents) embeddings = OpenAIEmbeddings(openai_api_key=os.environ['OPENAI_API_KEY']) docsearch = Chroma.from_documents(texts, embeddings) qa = VectorDBQA.from_chain_type(llm=OpenAI(), chain_type="stuff", vectorstore=docsearch) query = "how many females are present?" qa.run(query)
优化建议
CSVLoader默认将每行数据作为单个文档,若CSV包含表头,可通过csv_args参数明确指定,例如:CSVLoader(file_path=..., csv_args={'delimiter': ',', 'header': 0})- 针对CSV这类结构化文本,
CharacterTextSplitter的拆分效果可能不够理想,推荐使用RecursiveCharacterTextSplitter,它能更好地处理换行、逗号等分隔符,避免内容断裂 - 建议调整
chunk_overlap参数(如设为50),让相邻文本块保留部分重叠内容,提升问答时的上下文连贯性 VectorDBQA在LangChain新版本中已被标记为弃用,建议替换为RetrievalQA,示例代码如下:
from langchain.chains import RetrievalQA # 替换原QA初始化逻辑 qa = RetrievalQA.from_chain_type( llm=OpenAI(), chain_type="stuff", retriever=docsearch.as_retriever(search_kwargs={"k": 3}) )
内容的提问来源于stack exchange,提问作者Dave Kalu
相关产品推荐
相关产品推荐

