更智能的聊天机器人:使用 LangChain 修复数据缺失和幻觉问题
构建强大的对话式人工智能系统通常需要解决两个基础性问题:
优雅地处理缺失或不完整的用户输入(例如,“加 3”而不是“加 3 和 4”)。
减少幻觉:确保模型不会生成听起来合理但实际上错误的响应。
让我们通过一个简单的例子——一个计算两个数字之和的智能体——来看看如何使用 LangChain 和 OpenAI 的 API(以及“结构化工具”)来解决这些痛点。
🤔 问题
假设你部署了一个基于 OpenAI 的助手,它可以通过工具函数执行算术运算。一个简单的实现方式可能会在用户省略参数(例如“加 3”)时失败,更糟糕的是,模型可能会出现幻觉——编造数字或答案。
我们想要:
缺失值检测:
系统应提示输入所需的任何参数。
缓解幻觉:
如果需要澄清,应通过交互方式向用户获取信息,而不是让模型猜测。
🧱 解决方案:LangChain、结构化工具和相似性检查
借助 LangChain 的代理系统,您可以将业务逻辑(例如 Python 函数)封装成一流工具。结构化输入模型允许您强制执行参数模式(使用 Pydantic),从而轻松捕获缺失数据。
为了进一步减少幻觉,你可以使用 spaCy 的语义相似度功能,将智能体的响应与预期的澄清提示进行比较。如果智能体的响应看起来像是在请求澄清,则提示用户提供缺失的信息。
以下是它的样子(已标注):
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, Tool
from langchain.tools import StructuredTool
from langchain.memory import ConversationBufferMemory
from pydantic.v1 import BaseModel, Field
import spacy
为你的工具的参数定义一个模式。
class MathInput(BaseModel):
a: int = Field(…, description=”First number”)
b: int = Field(…, description=”Second number”)
您实际添加的业务逻辑。
def add_numbers(a: int, b: int=None) -> str:
return str(a + b)
#Wrap the function in a LangChain StructuredTool, providing schema.
add_tool = StructuredTool.from_function(
add_numbers,
name=”AddTwoNumbers”,
description=”Add two numbers (even if not all arguments are passed).”,
args_schema=MathInput
)
memory = ConversationBufferMemory(memory_key=”chat_history”, return_messages=True)
import os
os.environ[“OPENAI_API_KEY”] = “sk-…” # Set your API key
llm = ChatOpenAI(temperature=0)
使用您的工具和内存初始化代理。
agent = initialize_agent(
tools=[add_tool],
llm=llm,
agent=AgentType.OPENAI_FUNCTIONS,
memory=memory,
verbose=True
)
使用 spaCy 进行响应相似性检查(澄清检测)。
def similarity_check(input1, input2):
nlp = spacy.load(“en_core_web_md”) # Make sure to download this model!
doc1 = nlp(input1)
doc2 = nlp(input2)
print(“spaCy similarity:”, doc1.similarity(doc2))
return doc1.similarity(doc2)
对话循环:询问、处理缺失的参数、避免出现幻觉。
input1 = “Add 3”
result1 = agent.run(input1)
print(result1)
if similarity_check(“needs another argument or parameter”, result1) > .50:
print(agent.run({“input”: “What was the first number?”}))
input2 = “Second number is 4”
为了减少幻觉,请重新提出最初的问题,现在需要澄清缺失的信息。
result2 = agent.run(input1 + input2)
print(result2)`
⚡️要点
结构化工具和模式:这些工具和模式强制模型(以及 LangChain 代理)遵循必需的参数,并在接口边界处捕获缺失值。
通过相似性进行澄清:使用语义相似性(spaCy 或 OpenAI 嵌入)来检测模型是在寻求澄清,还是在产生幻觉或编造数字。
上下文感知历史记录:如果您只是告诉模型“第二个数字是 4”,它可能会产生幻觉。通过始终重新发送带有澄清的原始问题,您可以帮助 LLM 保持正确。
🛠️最佳实践
切勿在缺乏上下文的情况下拼接含糊不清的说明(例如“第二个数字是 4”)。务必与用户的原始意图保持一致。
调整相似度检查的阈值,以平衡覆盖率和误报率(尝试 0.4 到 0.6)。
结构化的工具描述至关重要——明确描述当字段缺失时工具应如何运行。
⚡️总结
结合结构化论证验证(LangChain + Pydantic)和响应相似性检查,您可以构建能够优雅地处理缺失数据并最大限度减少虚假内容的对话式 OpenAI 代理。这些工具对于生产级对话式 AI 至关重要!
还想了解更多?
尝试使用更多工具、更强大的释义检测或其他语言语言模型(例如 Anthropic、Azure 等)。请参阅
LangChain 文档
和 spaCy 相似度文档。
如果您喜欢我的帖子,请在 LinkedIn 上关注我:https://www.linkedin.com/in/chandrani-mukherjee-usa-nj/