如何通过LangChain优化Llama2-2b地址实体提取,解决无实体误返回问题?
问题:Llama2-2b地址拆分时错误补全缺失实体
使用Llama2-2b模型执行地址拆分任务,需从输入字符串中提取城市、州/邦、国家三类实体。当前问题是:当输入字符串中不存在某类实体时,模型仍会自动补全该实体(期望返回Not present)。
示例
输入:
"32, Panaji Beach Road, Panaji, Goa"
当前错误输出:
City: Panaji State: Goa Country: India # 此处应返回"Not present"
期望输出:
City: Panaji State: Goa Country: Not present
现有代码
address_template = """ Answer the question without explanation. What is city, state and country in "{address_string}". """ prompt = PromptTemplate( input_variables = ['address_string'], template=address_template, ) from langchain.chains import LLMChain chain = LLMChain(llm=llm, prompt=prompt, verbose=True) string1 = "32, Panaji Beach Road, Panaji, 403001, India" # Run the chain only specifying the input variable. print(chain.run(string1))
解决方案:优化Prompt模板
Llama2-2b作为小参数模型,对模糊指令的理解能力较弱,需要更明确、结构化的约束来纠正错误补全行为:
基础优化版Prompt
address_template = """ 严格遵循以下规则处理地址字符串: 1. 仅从输入的"{address_string}"中提取城市、州/邦、国家实体,**绝对不能补全输入中未提及的内容**。 2. 若某类实体在输入中不存在,必须返回`Not present`。 3. 输出格式固定为: City: [提取结果或Not present] State: [提取结果或Not present] Country: [提取结果或Not present] 4. 不得添加任何额外解释或说明。 处理地址字符串:"{address_string}" """
进阶Few-Shot引导版(若基础版仍失效)
加入示例进一步明确规则,降低模型理解偏差:
address_template = """ 按照以下示例和规则处理地址字符串: 示例1: 输入:"32, Panaji Beach Road, Panaji, Goa" 输出: City: Panaji State: Goa Country: Not present 示例2: 输入:"123 Main St, New York, USA" 输出: City: New York State: Not present Country: USA 规则: 1. 仅从输入的"{address_string}"中提取内容,绝不补全未提及的实体。 2. 缺失的实体必须返回`Not present`。 3. 严格遵循上述输出格式,不要添加额外内容。 处理地址字符串:"{address_string}" """
关键优化说明
- 用强约束词汇(如绝对不能)明确禁止补全行为
- 固定输出格式,压缩模型自由发挥的空间
- 小参数模型对列表式规则和示例的理解远优于模糊的自然语言描述
内容的提问来源于stack exchange,提问作者AP J
相关产品推荐
相关产品推荐

