Skip to content

Commit 3de71da

Browse files
committed
Update tests
1 parent adf80e9 commit 3de71da

File tree

16 files changed

+78
-509
lines changed

16 files changed

+78
-509
lines changed

app/backend/app.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,6 @@ async def setup_clients():
471471
USE_CHAT_HISTORY_BROWSER = os.getenv("USE_CHAT_HISTORY_BROWSER", "").lower() == "true"
472472
USE_CHAT_HISTORY_COSMOS = os.getenv("USE_CHAT_HISTORY_COSMOS", "").lower() == "true"
473473
USE_AGENTIC_RETRIEVAL = os.getenv("USE_AGENTIC_RETRIEVAL", "").lower() == "true"
474-
# TODO: ENABLE_AGENTIC_RETRIEVAL_SOURCE_DATA = os.getenv("ENABLE_AGENTIC_RETRIEVAL_SOURCE_DATA", "").lower() == "true"
475474

476475
# WEBSITE_HOSTNAME is always set by App Service, RUNNING_IN_PRODUCTION is set in main.bicep
477476
RUNNING_ON_AZURE = os.getenv("WEBSITE_HOSTNAME") is not None or os.getenv("RUNNING_IN_PRODUCTION") is not None

app/backend/approaches/approach.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,15 +273,15 @@ async def run_agentic_retrieval(
273273
search_index_name: str,
274274
top: Optional[int] = None,
275275
filter_add_on: Optional[str] = None,
276+
minimum_reranker_score: Optional[float] = None,
276277
results_merge_strategy: Optional[str] = None,
277278
) -> tuple[KnowledgeAgentRetrievalResponse, list[Document]]:
278279
# STEP 1: Invoke agentic retrieval
279280
response = await agent_client.retrieve(
280281
retrieval_request=KnowledgeAgentRetrievalRequest(
281282
messages=[
282283
KnowledgeAgentMessage(
283-
role=str(msg["role"]),
284-
content=[KnowledgeAgentMessageTextContent(text=str(msg["content"]))],
284+
role=str(msg["role"]), content=[KnowledgeAgentMessageTextContent(text=str(msg["content"]))]
285285
)
286286
for msg in messages
287287
if msg["role"] != "system"
@@ -341,6 +341,9 @@ async def run_agentic_retrieval(
341341
if top and len(documents) >= top:
342342
break
343343

344+
if minimum_reranker_score is not None:
345+
documents = [doc for doc in documents if (doc.reranker_score or 0) >= minimum_reranker_score]
346+
344347
if results_merge_strategy == "interleaved":
345348
documents = sorted(
346349
documents,

app/backend/approaches/chatreadretrieveread.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ async def run_agentic_retrieval_approach(
389389
auth_claims: dict[str, Any],
390390
):
391391
search_index_filter = self.build_filter(overrides, auth_claims)
392+
minimum_reranker_score = overrides.get("minimum_reranker_score", 0)
392393
top = overrides.get("top", 3)
393394
results_merge_strategy = overrides.get("results_merge_strategy", "interleaved")
394395
send_text_sources = overrides.get("send_text_sources", True)
@@ -400,6 +401,7 @@ async def run_agentic_retrieval_approach(
400401
search_index_name=self.search_index_name,
401402
top=top,
402403
filter_add_on=search_index_filter,
404+
minimum_reranker_score=minimum_reranker_score,
403405
results_merge_strategy=results_merge_strategy,
404406
)
405407

@@ -417,6 +419,7 @@ async def run_agentic_retrieval_approach(
417419
"Use agentic retrieval",
418420
messages,
419421
{
422+
"reranker_threshold": minimum_reranker_score,
420423
"results_merge_strategy": results_merge_strategy,
421424
"filter": search_index_filter,
422425
},

app/backend/approaches/retrievethenread.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ async def run_agentic_retrieval_approach(
224224
overrides: dict[str, Any],
225225
auth_claims: dict[str, Any],
226226
) -> ExtraInfo:
227+
minimum_reranker_score = overrides.get("minimum_reranker_score", 0)
227228
search_index_filter = self.build_filter(overrides, auth_claims)
228229
top = overrides.get("top", 3)
229230
results_merge_strategy = overrides.get("results_merge_strategy", "interleaved")
@@ -236,6 +237,7 @@ async def run_agentic_retrieval_approach(
236237
search_index_name=self.search_index_name,
237238
top=top,
238239
filter_add_on=search_index_filter,
240+
minimum_reranker_score=minimum_reranker_score,
239241
results_merge_strategy=results_merge_strategy,
240242
)
241243

@@ -254,6 +256,7 @@ async def run_agentic_retrieval_approach(
254256
"Use agentic retrieval",
255257
messages,
256258
{
259+
"reranker_threshold": minimum_reranker_score,
257260
"results_merge_strategy": results_merge_strategy,
258261
"filter": search_index_filter,
259262
},

app/backend/prepdocslib/searchmanager.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -462,10 +462,7 @@ async def create_agent(self):
462462
name=self.search_info.agent_name,
463463
knowledge_sources=[
464464
KnowledgeSourceReference(
465-
name=knowledge_source.name,
466-
include_reference_source_data=True, # TODO: base on env var
467-
include_references=True,
468-
reranker_threshold=1.5,
465+
name=knowledge_source.name, include_references=True, include_reference_source_data=True
469466
)
470467
],
471468
models=[

docs/agentic_retrieval.md

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,15 @@ See the agentic retrieval documentation.
3434
azd env set AZURE_OPENAI_SEARCHAGENT_MODEL_VERSION 2025-04-14
3535
```
3636

37-
3. **(Optional) Enable extra field hydration**
38-
39-
By default, agentic retrieval only returns fields included in the semantic configuration.
40-
41-
You can enable this optional feature below, to include all fields from the search index in the result.
42-
⚠️ This feature is currently only compatible with indexes set up with integrated vectorization,
43-
or indexes that otherwise have an "id" field marked as filterable.
44-
45-
```shell
46-
azd env set ENABLE_AGENTIC_RETRIEVAL_SOURCE_DATA true
47-
```
48-
49-
4. **Update the infrastructure and application:**
37+
3. **Update the infrastructure and application:**
5038

5139
Execute `azd up` to provision the infrastructure changes (only the new model, if you ran `up` previously) and deploy the application code with the updated environment variables.
5240

53-
5. **Try out the feature:**
41+
4. **Try out the feature:**
5442

5543
Open the web app and start a new chat. Agentic retrieval will be used to find all sources.
5644

57-
6. **Review the query plan**
45+
5. **Review the query plan**
5846

5947
Agentic retrieval use additional billed tokens behind the scenes for the planning process.
6048
To see the token usage, select the lightbulb icon on a chat answer. This will open the "Thought process" tab, which shows the amount of tokens used by and the queries produced by the planning process

infra/main.bicep

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ param storageSkuName string // Set in main.parameters.json
4141

4242
param defaultReasoningEffort string // Set in main.parameters.json
4343
param useAgenticRetrieval bool // Set in main.parameters.json
44-
param enableAgenticRetrievalSourceData bool // Set in main.parameters.json
4544

4645
param userStorageAccountName string = ''
4746
param userStorageContainerName string = 'user-content'
@@ -424,7 +423,6 @@ var appEnvVariables = {
424423
USE_SPEECH_OUTPUT_BROWSER: useSpeechOutputBrowser
425424
USE_SPEECH_OUTPUT_AZURE: useSpeechOutputAzure
426425
USE_AGENTIC_RETRIEVAL: useAgenticRetrieval
427-
ENABLE_AGENTIC_RETRIEVAL_SOURCE_DATA: enableAgenticRetrievalSourceData
428426
// Chat history settings
429427
USE_CHAT_HISTORY_BROWSER: useChatHistoryBrowser
430428
USE_CHAT_HISTORY_COSMOS: useChatHistoryCosmos

infra/main.parameters.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,6 @@
338338
"useAgenticRetrieval": {
339339
"value": "${USE_AGENTIC_RETRIEVAL=false}"
340340
},
341-
"enableAgenticRetrievalSourceData": {
342-
"value": "${ENABLE_AGENTIC_RETRIEVAL_SOURCE_DATA=false}"
343-
},
344341
"ragSearchTextEmbeddings": {
345342
"value": "${RAG_SEARCH_TEXT_EMBEDDINGS=true}"
346343
},

tests/conftest.py

Lines changed: 6 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@
4949
MockResponse,
5050
MockTransport,
5151
mock_retrieval_response,
52-
mock_retrieval_response_with_duplicates,
53-
mock_retrieval_response_with_missing_doc_key,
5452
mock_retrieval_response_with_sorting,
5553
mock_retrieval_response_with_top_limit,
5654
mock_speak_text_cancelled,
@@ -90,31 +88,23 @@ async def mock_search(self, *args, **kwargs):
9088
def create_mock_retrieve(response_type="default"):
9189
"""Create a mock_retrieve function that returns different response types.
9290
93-
Args:
94-
response_type: Type of response to return. Options:
95-
- "default": mock_retrieval_response()
96-
- "sorting": mock_retrieval_response_with_sorting()
97-
- "duplicates": mock_retrieval_response_with_duplicates()
98-
- "missing_doc_key": mock_retrieval_response_with_missing_doc_key()
99-
- "top_limit": mock_retrieval_response_with_top_limit()
91+
Supported response_type values:
92+
- "default": single reference response
93+
- "sorting": multiple refs to test ordering / interleaving
94+
- "top_limit": many refs to test early breaking via top limit
10095
"""
10196

10297
async def mock_retrieve_parameterized(self, *args, **kwargs):
10398
retrieval_request = kwargs.get("retrieval_request")
10499
assert retrieval_request is not None
105-
# New API uses knowledge_sources instead of target_index_params
106100
assert retrieval_request.knowledge_source_params is not None
107101
assert len(retrieval_request.knowledge_source_params) == 1
108-
params = retrieval_request.knowledge_source_params
109-
# parameters may have filter_add_on attribute in new SDK
102+
params_list = retrieval_request.knowledge_source_params
103+
params = params_list[0]
110104
self.filter = getattr(params, "filter_add_on", None)
111105

112106
if response_type == "sorting":
113107
return mock_retrieval_response_with_sorting()
114-
elif response_type == "duplicates":
115-
return mock_retrieval_response_with_duplicates()
116-
elif response_type == "missing_doc_key":
117-
return mock_retrieval_response_with_missing_doc_key()
118108
elif response_type == "top_limit":
119109
return mock_retrieval_response_with_top_limit()
120110
else: # default
@@ -465,7 +455,6 @@ async def mock_exists(*args, **kwargs):
465455
"AZURE_OPENAI_SEARCHAGENT_MODEL": "gpt-4.1-mini",
466456
"AZURE_OPENAI_SEARCHAGENT_DEPLOYMENT": "gpt-4.1-mini",
467457
"USE_AGENTIC_RETRIEVAL": "true",
468-
"ENABLE_AGENTIC_RETRIEVAL_SOURCE_DATA": "true",
469458
}
470459
]
471460

@@ -479,7 +468,6 @@ async def mock_exists(*args, **kwargs):
479468
"AZURE_OPENAI_SEARCHAGENT_MODEL": "gpt-4.1-mini",
480469
"AZURE_OPENAI_SEARCHAGENT_DEPLOYMENT": "gpt-4.1-mini",
481470
"USE_AGENTIC_RETRIEVAL": "true",
482-
"ENABLE_AGENTIC_RETRIEVAL_SOURCE_DATA": "true",
483471
"AZURE_USE_AUTHENTICATION": "true",
484472
"AZURE_SERVER_APP_ID": "SERVER_APP",
485473
"AZURE_SERVER_APP_SECRET": "SECRET",
@@ -1178,37 +1166,3 @@ def chat_approach():
11781166
credential=MockAzureCredential(),
11791167
),
11801168
)
1181-
1182-
1183-
@pytest.fixture
1184-
def chat_approach_with_hydration():
1185-
return ChatReadRetrieveReadApproach(
1186-
search_client=SearchClient(endpoint="", index_name="", credential=AzureKeyCredential("")),
1187-
search_index_name=None,
1188-
agent_model=None,
1189-
agent_deployment=None,
1190-
agent_client=None,
1191-
auth_helper=None,
1192-
openai_client=None,
1193-
chatgpt_model="gpt-4.1-mini",
1194-
chatgpt_deployment="chat",
1195-
embedding_deployment="embeddings",
1196-
embedding_model=MOCK_EMBEDDING_MODEL_NAME,
1197-
embedding_dimensions=MOCK_EMBEDDING_DIMENSIONS,
1198-
embedding_field="embedding3",
1199-
sourcepage_field="",
1200-
content_field="",
1201-
query_language="en-us",
1202-
query_speller="lexicon",
1203-
prompt_manager=PromptyManager(),
1204-
user_blob_manager=AdlsBlobManager(
1205-
endpoint="https://test-userstorage-account.dfs.core.windows.net",
1206-
container="test-userstorage-container",
1207-
credential=MockAzureCredential(),
1208-
),
1209-
global_blob_manager=BlobManager( # on normal Azure storage
1210-
endpoint="https://test-globalstorage-account.blob.core.windows.net",
1211-
container="test-globalstorage-container",
1212-
credential=MockAzureCredential(),
1213-
),
1214-
)

0 commit comments

Comments
 (0)