基于LangChain与Azure OpenAI的产品属性评论汇总成本优化问询
解决方案:低成本且无遗漏的属性评论汇总
针对你遇到的检索参数困境,这里提供几个实用的优化方向,既保证不遗漏相关评论,又能控制LLM调用成本:
1. 基于相似度阈值的精准检索(替代固定k值)
不要用固定的k值限制返回的chunk数量,而是设置相似度阈值,只保留与当前属性语义相似度高于阈值的所有chunk。这样既不会漏掉相关内容,又能过滤掉无关的chunk,减少送入LLM的内容量。
修改检索部分的代码:
# 把retriever改为带相似度阈值的过滤 retriever = db_disk.as_retriever( search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.7, "k": 10} # k设为足够大的上限,阈值根据实际调整 )
score_threshold:根据你的embedding模型调整,比如ada-002的相似度得分一般在0-1之间,0.7以上基本是强相关内容。k设为一个足够大的数(比如10),确保所有相关chunk都能被检索到,再通过阈值过滤掉无关的。
2. 分层汇总:先局部再全局
先对每个相关chunk生成针对当前属性的简短局部汇总,再将所有局部汇总合并成最终的全局汇总。这样每次LLM处理的内容量小,总成本更低,且不会遗漏信息。
代码示例:
from langchain.chains.summarize import load_summarize_chain from langchain.prompts import PromptTemplate # 局部汇总的prompt LOCAL_SUMM_PROMPT = PromptTemplate( template="从以下评论片段中,仅提取并汇总与{attr}相关的内容,保持简洁:\n\n{text}", input_variables=["attr", "text"] ) # 全局汇总的prompt GLOBAL_SUMM_PROMPT = PromptTemplate( template="将以下多个针对{attr}的局部汇总整合成一个连贯、全面的最终汇总:\n\n{local_summaries}", input_variables=["attr", "local_summaries"] ) sonuc = {} for attr in attributes: print(f"处理属性:{attr}") # 1. 检索所有相关chunk retriever = db_disk.as_retriever( search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.7, "k": 10} ) relevant_docs = retriever.get_relevant_documents(PROMPT_TEMPLATE.format(content=attr)) # 2. 生成局部汇总 local_summaries = [] for doc in relevant_docs: # 用LLM处理单个chunk的局部汇总 local_sum = llm.predict(LOCAL_SUMM_PROMPT.format(attr=attr, text=doc.page_content)) local_summaries.append(local_sum) # 3. 生成全局汇总 if local_summaries: global_sum = llm.predict(GLOBAL_SUMM_PROMPT.format(attr=attr, local_summaries="\n---\n".join(local_summaries))) sonuc[attr] = global_sum else: sonuc[attr] = "暂无相关评论" print(sonuc)
3. 优化文档分割策略
如果你的原始文档是多条评论的集合,建议将每条评论单独分割为一个chunk,而不是按固定字符数分割。这样检索时能精准定位到单条评论,避免无关内容混入。
修改分割代码:
# 自定义文本分割器,优先按评论分隔符分割 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, # 单条评论一般不会太长,设小一点 chunk_overlap=0, separators=["\n\n", "\n", " ", ""] # 根据实际评论分隔符调整 )
4. 批量处理减少LLM调用
如果多个属性的相关chunk数量不多,可以尝试在一次LLM调用中处理多个属性的局部汇总,但需要注意控制总token数不超过模型的上下文窗口。这种方式适合属性数量少、每个属性相关内容不多的场景。
内容的提问来源于stack exchange,提问作者Utku Can
相关产品推荐
相关产品推荐

