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
相关产品推荐
相关产品推荐

