RAG大语言模型无法检索自定义DSA数据问题求助
问题:自定义DSA术语在RAG系统中无法被检索到
我是RAG与LLM领域新手,正在搭建DSA(数据结构与算法)教学聊天机器人。将自定义DSA术语“SIT Ernest CK Travis Junxian tree”及描述加入维基百科爬取的DSA术语CSV文件后,两次迭代代码(首次用默认嵌入模型,第二次改用sentence-transformers/all-MiniLM-L6-v2并调整检索参数),询问该术语时LLM均回复无法识别,但已确认该数据块(第992块)已被Chroma向量库正确提取。
首次迭代代码与结果
from langchain.document_loaders import CSVLoader from langchain_text_splitters import CharacterTextSplitter from langchain_huggingface import HuggingFaceEmbeddings from langchain_chroma import Chroma from langchain.chains import RetrievalQA from langchain_community.llms import Ollama # Initialize the CSVLoader with your CSV file path loader = CSVLoader(file_path="dsa1.csv") # Load the documents docs = loader.load() # Initialize the CharacterTextSplitter text_splitter = CharacterTextSplitter( separator="\n", chunk_size=2000, chunk_overlap=200 ) # Split the documents into smaller chunks texts = text_splitter.split_documents(docs) embeddings = HuggingFaceEmbeddings() db = Chroma.from_documents(texts,embeddings) llm = Ollama(model="llama3.1") chain = RetrievalQA.from_chain_type( llm, retriever = db.as_retriever() ) question = "What is SIT Ernest CK Travis Junxian tree" result = chain({"query":question}) print(result)
首次回复:
{'query': 'What is SIT Ernest CK Travis Junxian tree', 'result': 'I don\'t know what a "SIT Ernest CK Travis Junxian tree" is, as the provided context only mentions it without providing any additional information or explanation. The descriptions seem to be cut off or incomplete. If you have more context or clarify what this term refers to, I\'d be happy to try and help!'}
第二次迭代代码与结果
from langchain.document_loaders import CSVLoader from langchain_text_splitters import CharacterTextSplitter from langchain_huggingface import HuggingFaceEmbeddings from langchain_chroma import Chroma from langchain.chains import RetrievalQA # 修正原代码的错误导入路径 from langchain_community.llms import Ollama # Enable detailed logging for debugging # langchain_logging.set_verbosity_debug() loader = CSVLoader(file_path="dsa1.csv") docs = loader.load() text_splitter = CharacterTextSplitter( separator="\n", chunk_size=2000, chunk_overlap=200 ) texts = text_splitter.split_documents(docs) embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") db = Chroma.from_documents(texts, embeddings, persist_directory="chroma_db_new") retriever = db.as_retriever( search_type="similarity", # Use similarity search search_kwargs={"k": 5} # Retrieve top 5 documents ) llm = Ollama(model="llama3.1") chain = RetrievalQA.from_chain_type( llm=llm, retriever=retriever ) question = "What is SIT Ernest CK Travis Junxian tree" result = chain.run(question) print(result)
第二次回复:
I don't know.
确认数据存在的代码与结果
for i, text in enumerate(texts): print(f"Chunk {i+1}:\n{text.page_content}\n{'-'*40}")
数据块内容:
Chunk 992: Term: SIT Ernest CK Travis Junxian tree Description: Possibly the best tree there is. Uses some kind of special LLM called Performance group LLM that will give O(log) complexity speed
原因分析
- 自定义术语名称过长且包含多个专有名词组合,嵌入模型对这类长专有名词的语义编码匹配度低,导致相似度检索无法命中目标数据块。
- 第二次代码存在导入路径错误(
langchain_chains应为langchain.chains),可能导致检索链初始化异常,影响正常检索逻辑。 - 默认的文本分割配置(chunk_size=2000)对单条术语+描述的短内容完全没必要,甚至可能破坏术语与描述的关联(虽然本次未出现,但属于冗余操作)。
- RetrievalQA默认的prompt未明确引导LLM从上下文提取术语描述,可能导致LLM忽略检索到的内容。
解决方法
1. 修正代码错误
确保RetrievalQA的导入路径正确:
from langchain.chains import RetrievalQA
2. 优化检索策略
改用MMR(最大边际相关性)搜索或相似度阈值检索,提升长专有名词的召回率:
# MMR搜索示例 retriever = db.as_retriever( search_type="mmr", search_kwargs={"k": 3, "fetch_k": 10} ) # 相似度阈值检索示例 retriever = db.as_retriever( search_type="similarity_score_threshold", search_kwargs={"k": 3, "score_threshold": 0.5} )
3. 优化CSV加载配置
指定source_column为术语列,让文档元数据包含术语名称,提升检索匹配度:
loader = CSVLoader(file_path="dsa1.csv", source_column="Term")
同时跳过不必要的文本分割,直接用原始文档构建向量库:
# 移除CharacterTextSplitter相关代码,直接用loader.load()的结果构建向量库 docs = loader.load() db = Chroma.from_documents(docs, embeddings, persist_directory="chroma_db_new")
4. 自定义检索提示词
明确引导LLM从上下文提取术语描述:
from langchain.prompts import PromptTemplate prompt_template = """使用下面的上下文回答问题,不知道答案就直说,不要编造。 {context} 问题:{question} 回答:""" PROMPT = PromptTemplate( template=prompt_template, input_variables=["context", "question"] ) chain = RetrievalQA.from_chain_type( llm=llm, retriever=retriever, chain_type_kwargs={"prompt": PROMPT} )
5. 调试检索环节
先手动测试检索器是否能返回目标数据块,定位问题出在检索还是LLM生成:
docs = retriever.get_relevant_documents("What is SIT Ernest CK Travis Junxian tree") for doc in docs: print(doc.page_content)
内容的提问来源于stack exchange,提问作者Benjamin67
相关产品推荐
相关产品推荐

