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

Llama 2与LangChain结合使用时的输出解析及纯结果提取问题求助

Llama 2与LangChain结合使用时的输出解析及纯结果提取问题求助

我刚上手Llama 2 + LangChain的时候也踩过一模一样的坑!模型总忍不住加些“好的,这是你的关键词...”这类多余的开场白,导致输出解析器直接报错。结合你的代码,给你几个实用的解决方向:

一、把Prompt指令写得更明确、更强硬

模型的听话程度很大程度取决于prompt的清晰度,你可以把要求写死,甚至加上带有约束性的提示,同时给明确的示例。修改你的PromptTemplate:

from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate

output_parser = CommaSeparatedListOutputParser()
format_instructions = output_parser.get_format_instructions()

prompt = PromptTemplate(
    template="""请严格按照要求处理:为以下产品标题提取上下文关键词,**仅输出逗号分隔的关键词列表,绝对不要添加任何开场白、解释或总结**。
产品标题:{product_title}
格式要求:{format_instructions}""",
    input_variables=["product_title"],
    partial_variables={"format_instructions": format_instructions}
)

question = prompt.format(product_title="Trottinette électrique pure air pro 2ème gén")
output = llm(question)
# 先打印原始输出排查问题,再进行解析
print("原始输出:", output)
try:
    parsed_output = output_parser.parse(output)
    print("解析结果:", parsed_output)
except Exception as e:
    print(f"解析失败:{e}")

二、改用更严格的Pydantic输出解析器

CommaSeparatedListOutputParser对多余文本的容错性很差,换成PydanticOutputParser可以强制模型输出符合结构的内容,即使有少量多余文本,也能通过字段提取出来:

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from langchain.prompts import PromptTemplate

# 定义Pydantic模型,明确我们要的是关键词列表
class ProductKeywords(BaseModel):
    keywords: list[str] = Field(description="产品的上下文关键词列表")

output_parser = PydanticOutputParser(pydantic_object=ProductKeywords)
format_instructions = output_parser.get_format_instructions()

prompt = PromptTemplate(
    template="""为以下产品标题提取上下文关键词,**仅输出符合要求的JSON格式内容,不要添加任何额外文本**。
产品标题:{product_title}
格式要求:{format_instructions}""",
    input_variables=["product_title"],
    partial_variables={"format_instructions": format_instructions}
)

question = prompt.format(product_title="Trottinette électrique pure air pro 2ème gén")
output = llm(question)
# 先做简单的字符串清理,剥离多余内容
cleaned_output = output.split("{")[-1].split("}")[0]
cleaned_output = "{" + cleaned_output + "}"
try:
    parsed_output = output_parser.parse(cleaned_output)
    print("提取的关键词:", parsed_output.keywords)
except Exception as e:
    print(f"解析失败:{e}")

三、适配Llama 2的专用Prompt格式

如果你用的是Llama 2的聊天模型(比如llama-2-7b-chat),它有固定的对话格式要求,必须用<s>[INST] 指令 [/INST]包裹你的prompt,不然模型可能不遵守输出规则。比如:

# 构建符合Llama 2聊天格式的prompt
llama_prompt = f"""<s>[INST]请为以下产品标题提取上下文关键词,仅输出逗号分隔的关键词列表,不要添加任何额外内容。产品标题:Trottinette électrique pure air pro 2ème gén[/INST]"""
output = llm(llama_prompt)
# 直接处理输出得到纯列表
cleaned_keywords = [k.strip() for k in output.strip().split(",")]
print("纯关键词列表:", cleaned_keywords)

四、兜底的字符串清理方案

如果以上方法还是偶尔失效,可以用简单的字符串处理或者正则表达式来提取核心内容,比如:

import re

# 假设输出是"Sure, your keywords are: Trottinette électrique, pure air pro, 2ème gén"
output = llm(question)
# 用正则提取冒号后面的核心内容
match = re.search(r":\s*(.*)", output)
if match:
    keywords = [k.strip() for k in match.group(1).split(",")]
    print("提取的关键词:", keywords)

这些方法我自己测试过,基本能解决模型输出多余内容的问题,你可以根据自己的场景调整~

备注:内容来源于stack exchange,提问作者Udemytur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 14:29:34