趋近智
大型语言模型(LLM)有时会生成听起来合理但事实不符、毫无意义或与所给背景信息无关的回答。这些编造的内容通常被称为“幻觉 (hallucination)”。提示对LLM的输出有很大影响,细致的提示工程 (prompt engineering)是抵御这些不准确生成内容的主要方法。虽然完全消除幻觉很困难,但一些在您的Python代码中实施的方法可以大大降低它们的发生频率和影响。
预防幻觉 (hallucination)最有效的方式之一是向LLM提供回答问题所需的具体信息,而不是仅仅依靠其内部训练数据。这种被称为“基于事实”的方法通常涉及检索增强生成(RAG),我们已经在第7章中介绍过。
核心思路是根据用户的查询检索相关文档或数据片段,并将它们直接包含在提示中。这为模型提供了明确的原始材料来构建其答案。
# 假设 'retrieve_relevant_docs' 根据查询获取文本
# 假设 'llm_client' 是一个已初始化的LLM API客户端
def answer_query_with_context(query: str, llm_client) -> str:
"""使用检索到的背景信息回答查询,以减少幻觉。"""
context_docs = retrieve_relevant_docs(query) # 获取相关信息
context_str = "\n\n".join(context_docs)
prompt = f"""
*仅*根据以下背景信息回答问题。
请勿使用任何现有知识。如果在背景信息中找不到答案,请说明无法根据所提供的信息回答。
背景信息:
{context_str}
问题:{query}
答案:
"""
# 进行API调用(具体细节取决于所使用的客户端库)
response = llm_client.generate(prompt=prompt, max_tokens=150)
return response.text
# 示例用法(示意)
# query = "Flobnar 的首都是哪里?"
# 假设 retrieve_relevant_docs 未找到关于 "Flobnar" 的信息:
# answer = answer_query_with_context(query, my_llm_client)
# print(answer)
# 预期输出可能为:“我无法根据所提供的信息回答。”
通过明确指示模型仅使用提供的背景信息,您可以避免它编造答案。
流程图说明了检索增强生成(RAG)如何通过基于用户查询检索相关背景信息来使LLM的回答基于事实,从而与直接查询相比,降低了出现幻觉的可能性。
在提供背景信息时,您可以明确告知模型在事实准确性方面应如何表现。
NOT_FOUND。# 使用 LangChain 的 PromptTemplate 构建结构示例
from langchain_core.prompts import PromptTemplate
template_str = """
严格根据以下背景信息回答用户的问题。
如果信息在背景信息中不可用,请回答“信息不可用”。
不要添加任何文本中未明确说明的信息。
背景信息:
{context}
问题:{question}
答案:"""
prompt_template = PromptTemplate(
input_variables=["context", "question"],
template=template_str
)
# 接下来,您将使用实际的背景信息和问题来格式化此提示
# formatted_prompt = prompt_template.format(context="...", question="...")
这些指示限制了模型用编造的细节填补空白的倾向。
大多数LLM API提供参数来控制输出的随机性和创造性。temperature(温度)参数在管理幻觉 (hallucination)方面尤其重要。
对于需要高事实准确性的任务,通常建议设置较低的温度。
# 使用 OpenAI 客户端的示例
# 确保已安装 'openai' 库并配置了API密钥
# from openai import OpenAI
# client = OpenAI() # 假设 OPENAI_API_KEY 已在环境变量中设置
# response = client.chat.completions.create(
# model="gpt-4o",
# messages=[
# {"role": "system", "content": "仅根据提供的背景信息回答。"},
# {"role": "user", "content": "背景信息:天空是蓝色的。问题:天空是什么颜色?"}
# ],
# temperature=0.1 # 低温度设置,用于基于事实的回答
# )
# print(response.choices[0].message.content)
# 预期输出:天空是蓝色的。
尝试不同的温度值,为您的特定应用找到合适的平衡点。
如前所述,在提示中提供示例(少样本学习 (few-shot learning))可以引导模型的行为。您可以专门使用这种方法来阻止幻觉 (hallucination),方法是包含模型正确识别缺失信息的示例。
prompt = """
*仅*根据所提供的文本片段回答问题。如果答案不在其中,请说“未找到信息”。
文本:该报告讨论了阿尔法项目和贝塔项目。阿尔法项目侧重于可再生能源。
问题:阿尔法项目的重点是什么?
答案:阿尔法项目侧重于可再生能源。
文本:本手册涵盖了X1型号的安装和故障排除。
问题:X1型号的保修期是多久?
答案:未找到信息。
文本:{provided_text}
问题:{user_question}
答案:"""
# 在发送给LLM之前填充 {provided_text} 和 {user_question}
这些示例展示了所需的行为:尽可能地如实回答,并在信息缺失时明确说明。
指示模型引用其来源,即使“来源”只是您提供的背景信息的片段。这使得模型必须将其陈述与特定信息关联起来。
prompt = f"""
阅读以下文本片段并回答问题。对于答案中的每个陈述,请在方括号中引用其来源文本片段的编号,例如 [1]。如果信息不存在,请直接说明。
游隼是速度最快的动物,在俯冲时速度可达240英里/小时以上。
[2] 猎豹是陆地上跑得最快的动物,冲刺速度可达70英里/小时。
[3] 总部位于斯普林菲尔德。
问题:速度最快的动物是什么?总部位于哪里?
答案:速度最快的动物是游隼 [1]。总部位于斯普林菲尔德 [3]。
"""
尽管模型有时仍可能错误归因信息,但这种方法增加了一层可追溯性,并使得在审查或自动化检查期间更容易发现幻觉 (hallucination)。
请求以JSON等结构化格式输出有时可以隐含地减少幻觉 (hallucination),特别是在信息提取任务中。通过定义一个模式,您可以约束模型的输出空间。如果模型找不到所需字段的信息,它更可能会省略该字段或使用空值(如果已指示),而不是编造一个值。
prompt = """
将文本中请求的信息提取为JSON对象。
如果未找到某条信息,请使用 `null` 作为其值。
文本:活动将于2024年10月26日在大会堂举行。联系人是简·多。
所需JSON格式:
{
"event_date": "YYYY-MM-DD 格式或 null",
"location": "字符串或 null",
"contact_email": "字符串或 null"
}
提取的信息:
"""
# 预期LLM输出(如果温度较低且遵循指示):
# {
# "event_date": "2024-10-26",
# "location": "Grand Hall",
# "contact_email": null
# }
减少幻觉 (hallucination)并非一次性解决,而是一个持续的过程。在开发应用程序时:
请记住,这些方法会大大减少幻觉的可能性,但可能无法完全消除它们,特别是对于复杂的查询或模糊的背景信息。持续的监控和可靠的评估策略仍然是构建LLM应用程序的重要组成部分。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•