You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:35:38