feature: adds the concept of now to the qa for temporal queries (#1685)

<!-- .github/pull_request_template.md -->

## Description
 Adds the concept of now to the qa for temporal queries

## Type of Change
<!-- Please check the relevant option -->
- [ ] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Documentation update
- [x] Code refactoring
- [ ] Performance improvement
- [ ] Other (please specify):

## Screenshots/Videos (if applicable)
<!-- Add screenshots or videos to help explain your changes -->

## Pre-submission Checklist
<!-- Please check all boxes that apply before submitting your PR -->
- [ ] **I have tested my changes thoroughly before submitting this PR**
- [ ] **This PR contains minimal changes necessary to address the
issue/feature**
- [ ] My code follows the project's coding standards and style
guidelines
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have added necessary documentation (if applicable)
- [ ] All new and existing tests pass
- [ ] I have searched existing PRs to ensure this change hasn't been
submitted already
- [ ] I have linked any relevant issues in the description
- [ ] My commits have clear and descriptive messages

## DCO Affirmation
I affirm that all code in every commit of this pull request conforms to
the terms of the Topoteretes Developer Certificate of Origin.
This commit is contained in:
hajdul88 2025-10-28 15:27:29 +01:00 committed by GitHub
parent abb1aba517
commit 221a0dba01
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 20 additions and 19 deletions

View file

@ -1,15 +1,13 @@
For the purposes of identifying timestamps in a query, you are tasked with extracting relevant timestamps from the query. You are tasked with identifying relevant time periods where the answer to a given query should be searched.
## Timestamp requirements Current date is: `{{ time_now }}`. Determine relevant period(s) and return structured intervals.
- If the query contains interval extrack both starts_at and ends_at properties
- If the query contains an instantaneous timestamp, starts_at and ends_at should be the same Extraction rules:
- If the query its open-ended (before 2009 or after 2009), the corresponding non defined end of the time should be none
-For example: "before 2009" -- starts_at: None, ends_at: 2009 or "after 2009" -- starts_at: 2009, ends_at: None 1. Query without specific timestamp: use the time period with starts_at set to None and ends_at set to now.
- Put always the data that comes first in time as starts_at and the timestamps that comes second in time as ends_at 2. Explicit time intervals: If the query specifies a range (e.g., from 2010 to 2020, between January and March 2023), extract both start and end dates. Always assign the earlier date to starts_at and the later date to ends_at.
- If starts_at or ends_at cannot be extracted both of them has to be None 3. Single timestamp: If the query refers to one specific moment (e.g., in 2015, on March 5, 2022), set starts_at and ends_at to that same timestamp.
## Output Format 4. Open-ended time references: For phrases such as "before X" or "after X", represent the unspecified side as None. For example: before 2009 → starts_at: None, ends_at: 2009; after 2009 → starts_at: 2009, ends_at: None.
Your reply should be a JSON: list of dictionaries with the following structure: 5. Current-time references ("now", "current", "today"): If the query explicitly refers to the present, set both starts_at and ends_at to now (the ingestion timestamp).
```python 6. "Who is" and "Who was" questions: These imply a general identity or biographical inquiry without a specific temporal scope. Set both starts_at and ends_at to None.
class QueryInterval(BaseModel): 7. Ordering rule: Always ensure the earlier date is assigned to starts_at and the later date to ends_at.
starts_at: Optional[Timestamp] = None 8. No temporal information: If no valid or inferable time reference is found, set both starts_at and ends_at to None.
ends_at: Optional[Timestamp] = None
```

View file

@ -1,7 +1,7 @@
import os import os
import asyncio import asyncio
from typing import Any, Optional, List, Type from typing import Any, Optional, List, Type
from datetime import datetime
from operator import itemgetter from operator import itemgetter
from cognee.infrastructure.databases.vector import get_vector_engine from cognee.infrastructure.databases.vector import get_vector_engine
@ -79,7 +79,11 @@ class TemporalRetriever(GraphCompletionRetriever):
else: else:
base_directory = None base_directory = None
system_prompt = render_prompt(prompt_path, {}, base_directory=base_directory) time_now = datetime.now().strftime("%d-%m-%Y")
system_prompt = render_prompt(
prompt_path, {"time_now": time_now}, base_directory=base_directory
)
interval = await LLMGateway.acreate_structured_output(query, system_prompt, QueryInterval) interval = await LLMGateway.acreate_structured_output(query, system_prompt, QueryInterval)
@ -108,8 +112,6 @@ class TemporalRetriever(GraphCompletionRetriever):
graph_engine = await get_graph_engine() graph_engine = await get_graph_engine()
triplets = []
if time_from and time_to: if time_from and time_to:
ids = await graph_engine.collect_time_ids(time_from=time_from, time_to=time_to) ids = await graph_engine.collect_time_ids(time_from=time_from, time_to=time_to)
elif time_from: elif time_from:

View file

@ -77,6 +77,7 @@ async def main():
"What happened between 2000 and 2006?", "What happened between 2000 and 2006?",
"What happened between 1903 and 1995, I am interested in the Selected Works of Arnulf Øverland Ole Peter Arnulf Øverland?", "What happened between 1903 and 1995, I am interested in the Selected Works of Arnulf Øverland Ole Peter Arnulf Øverland?",
"Who is Attaphol Buspakom Attaphol Buspakom?", "Who is Attaphol Buspakom Attaphol Buspakom?",
"Who was Arnulf Øverland?",
] ]
for query_text in queries: for query_text in queries: