基于LangChain的RAG实现相似/重复控件识别失败问题排查
RAG驱动模型POC问题排查与修正方案
一、数据加载与预处理问题排查
- 验证
CSVLoader加载完整性:检查是否正确指定控件ID、名称、描述的列,打印loader.load()的返回长度确认3500+数据是否全部加载。若CSV存在特殊分隔符、引号格式,需调整delimiter、quotechar参数适配。 - 移除不合理的
CharacterTextSplitter:控件数据是单条结构化记录(ID+名称+描述),拆分后会破坏单条控件的完整上下文,直接用整条记录作为向量嵌入单位即可。
二、向量库构建问题修正
- 更换适配的嵌入模型:默认嵌入模型可能对专业控件描述的语义捕捉不足,建议使用
text-embedding-3-large这类更适合结构化文本的模型,确保嵌入维度与Chroma兼容。 - 完善元数据关联:加载数据时给每条文档绑定完整元数据,比如
metadata={"控件ID": id, "名称": name, "描述": desc},保证检索时能返回完整的控件信息,而非碎片化内容。
三、RAG链逻辑调整
- 适配全量两两对比需求:常规RAG的查询-检索模式不适合全量控件两两对比场景,需先从Chroma中提取所有向量及对应元数据,执行全量两两相似度计算后筛选符合得分区间的控件对。
- 自定义链执行逻辑:基于LangChain构建自定义链,先批量提取所有控件数据,再调用LLM进行两两对比评分,替代默认的检索-生成流程。
四、提示词与模型适配优化
- 复用有效提示词并明确约束:直接调用OpenAI有效的提示词,需明确要求基于全量控件数据做两两对比,指定80-87为相似、95+为重复的评分规则,以及清晰的输出格式。
- 使用大上下文模型:3500+数据量较大,需切换到
gpt-3.5-turbo-16k或gpt-4-turbo这类大上下文窗口模型,避免因上下文截断导致输出无效。
代码修正示例
from langchain.document_loaders import CSVLoader from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chat_models import ChatOpenAI from langchain.prompts import PromptTemplate # 1. 加载完整结构化数据 loader = CSVLoader(file_path="your_controls.csv", metadata_columns=["控件ID", "名称", "描述"]) documents = loader.load() # 2. 构建向量库(若无需检索可跳过,直接用原始文档) embeddings = OpenAIEmbeddings(model="text-embedding-3-large") db = Chroma.from_documents(documents, embeddings) # 3. 整理全量控件数据文本 all_controls = "\n".join([f"控件ID: {doc.metadata['控件ID']}, 名称: {doc.metadata['名称']}, 描述: {doc.page_content}" for doc in documents]) # 4. 构建明确约束的提示词 prompt = PromptTemplate( input_variables=["controls"], template="基于以下所有控件数据,两两对比每个控件的ID、名称与描述,计算相似度得分,列出得分在80-87之间的相似控件对,以及得分95分以上的重复控件对:\n{controls}\n输出格式要求:\n相似控件对(80-87分):\n- [控件ID1]与[控件ID2]:{名称1}/{名称2},得分XX\n重复控件对(95+分):\n- [控件ID3]与[控件ID4]:{名称3}/{名称4},得分XX" ) # 5. 调用大上下文模型生成结果 llm = ChatOpenAI(model="gpt-3.5-turbo-16k") chain = prompt | llm result = chain.invoke({"controls": all_controls}) print(result.content)
内容的提问来源于stack exchange,提问作者priyanka
相关产品推荐
相关产品推荐

