使用 Instructor 增强带有时间过滤的 RAG¶
检索增强生成 (RAG) 系统通常需要处理带有时间约束的查询,例如“上个季度发布了哪些新功能?”或“显示过去一周的支持工单”。有效的时间过滤对于提供准确、相关的响应至关重要。
Instructor 是一个 Python 库,它简化了将大型语言模型 (LLMs) 与数据源和 API 集成。它允许使用 Pydantic 定义结构化输出模型,这些模型可用作 Prompt 或用于解析 LLM 输出。
建模时间过滤器¶
为了处理时间过滤器,我们可以定义一个表示时间范围的 Pydantic 模型
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
class TimeFilter(BaseModel):
start_date: Optional[datetime] = None
end_date: Optional[datetime] = None
TimeFilter
模型可以表示绝对日期范围或相对时间范围,例如“上周”或“上个月”。
然后我们可以将其与搜索查询字符串结合起来
Prompting LLM¶
使用 Instructor,我们可以 Prompt LLM 根据用户查询生成 SearchQuery
对象
import instructor
from openai import OpenAI
client = instructor.from_openai(OpenAI())
response = client.chat.completions.create(
model="gpt-4o",
response_model=SearchQuery,
messages=[
{
"role": "system",
"content": "You are a query generator for customer support tickets. The current date is 2024-02-17",
},
{
"role": "user",
"content": "Show me customer support tickets opened in the past week.",
},
],
)
# Example response:
{
"query": "Show me customer support tickets opened in the past week.",
"time_filter": {
"start_date": "2024-02-10T00:00:00",
"end_date": "2024-02-17T00:00:00",
},
}
日期和时区的细微差别¶
处理基于时间的查询时,考虑日期、时区和发布时间的细微差别非常重要。根据数据源、用户位置以及内容最初发布的时间,“过去一周”或“上个月”的定义可能会有所不同。
为了处理这个问题,你需要设计你的 TimeFilter
模型来智能地推断这些相对时间段。这可能包括
- 如果可用,默认使用用户的本地时区,或使用一致的默认时区(例如 UTC)
- 定义如何计算“周”或“月”等相对时间段开始和结束的明确规则
- 例如,“过去一周”是指过去 7 天还是指前一个周日至周六的范围?
- 允许用户灵活指定日期(精确的日期时间、仅日期、自然语言短语)
- 验证和标准化用户输入以符合预期的
TimeFilter
格式 - 考虑内容的原始发布时间戳,而不仅仅是当前日期
- 例如,“上个月发布的文章”应该查看发布日期,而不是查询日期
通过将此逻辑构建到 TimeFilter
模型中,你可以抽象掉复杂性,并为 RAG 系统的其余部分提供一致的接口,以便处理标准化的绝对日期时间范围
当然,可能存在难以通过编程解决的边缘情况或歧义。在这种情况下,你可能需要向用户寻求澄清,或根据可用信息进行最佳猜测。关键在于如何在处理基于时间的查询时努力实现灵活性和一致性之间的平衡,并在相关时考虑发布日期。
通过使用 Pydantic 对时间过滤器进行建模并利用 Instructor,RAG 系统可以有效地处理基于时间的查询。清晰的 Prompt、仔细的模型设计和适当的解析策略能够准确检索特定时间范围内的信息,从而提高系统的整体相关性和准确性。