Skip to content

Commit ccc28e5

Browse files
committed
Remove max subqueries option, fix sort order
1 parent 10a2c49 commit ccc28e5

File tree

13 files changed

+36
-57
lines changed

13 files changed

+36
-57
lines changed

app/backend/approaches/approach.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
KnowledgeAgentMessageTextContent,
1111
KnowledgeAgentRetrievalRequest,
1212
KnowledgeAgentRetrievalResponse,
13+
KnowledgeAgentSearchIndexActivityRecord,
1314
KnowledgeAgentSearchIndexReference,
1415
SearchIndexKnowledgeSourceParams,
1516
)
@@ -287,21 +288,37 @@ async def run_agentic_retrieval(
287288
],
288289
knowledge_source_params=[
289290
SearchIndexKnowledgeSourceParams(
290-
knowledge_source_name="default-knowledge-source",
291+
knowledge_source_name=search_index_name,
291292
filter_add_on=filter_add_on,
292293
)
293294
],
294295
)
295296
)
296297

298+
# Map activity id -> agent's internal search query
299+
activities = response.activity
300+
activity_mapping: dict[int, str] = (
301+
{
302+
activity.id: activity.search_index_arguments.search
303+
for activity in activities
304+
if (
305+
isinstance(activity, KnowledgeAgentSearchIndexActivityRecord)
306+
and activity.search_index_arguments
307+
and activity.search_index_arguments.search is not None
308+
)
309+
}
310+
if activities
311+
else {}
312+
)
313+
297314
# No refs? we're done
298315
if not (response and response.references):
299316
return response, []
300317

301318
# Extract references
302319
refs = [r for r in response.references if isinstance(r, KnowledgeAgentSearchIndexReference)]
303-
304320
documents: list[Document] = []
321+
doc_to_ref_id: dict[str, str] = {}
305322

306323
# Create documents from reference source data
307324
for ref in refs:
@@ -317,11 +334,18 @@ async def run_agentic_retrieval(
317334
groups=ref.source_data.get("groups"),
318335
reranker_score=ref.reranker_score,
319336
images=ref.source_data.get("images"),
337+
search_agent_query=activity_mapping[ref.activity_source],
320338
)
321339
)
340+
doc_to_ref_id[ref.source_data.get("id")] = ref.id
322341
if top and len(documents) >= top:
323342
break
324343

344+
if results_merge_strategy == "interleaved":
345+
documents = sorted(
346+
documents,
347+
key=lambda d: int(doc_to_ref_id.get(d.id, 0)) if d.id and doc_to_ref_id.get(d.id) else 0,
348+
)
325349
return response, documents
326350

327351
async def get_sources_content(

app/backend/prepdocslib/searchmanager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ async def create_agent(self):
470470
field_names.append("images")
471471
async with self.search_info.create_search_index_client() as search_index_client:
472472
knowledge_source = SearchIndexKnowledgeSource(
473-
name="default-knowledge-source",
473+
name=self.search_info.index_name, # Use the same name for convenience
474474
description="Default knowledge source using the main search index",
475475
search_index_parameters=SearchIndexKnowledgeSourceParameters(
476476
search_index_name=self.search_info.index_name,

app/frontend/src/api/models.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ export type ChatAppRequestOverrides = {
1414
exclude_category?: string;
1515
seed?: number;
1616
top?: number;
17-
max_subqueries?: number;
1817
results_merge_strategy?: string;
1918
temperature?: number;
2019
minimum_search_score?: number;

app/frontend/src/components/AnalysisPanel/AgentPlan.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ SyntaxHighlighter.registerLanguage("json", json);
88

99
type ModelQueryPlanningStep = {
1010
id: number;
11-
type: "ModelQueryPlanning";
11+
type: "modelQueryPlanning";
1212
input_tokens: number;
1313
output_tokens: number;
1414
};
1515

1616
type AzureSearchQueryStep = {
1717
id: number;
18-
type: "AzureSearchQuery";
19-
target_index: string;
20-
query: { search: string };
18+
type: "searchIndex";
19+
knowledge_source_name: string;
20+
search_index_arguments: { search: string };
2121
query_time: string;
2222
count: number;
2323
elapsed_ms: number;
@@ -32,10 +32,10 @@ interface Props {
3232

3333
export const AgentPlan: React.FC<Props> = ({ query_plan, description }) => {
3434
// find the planning step
35-
const planning = query_plan.find((step): step is ModelQueryPlanningStep => step.type === "ModelQueryPlanning");
35+
const planning = query_plan.find((step): step is ModelQueryPlanningStep => step.type === "modelQueryPlanning");
3636

3737
// collect all search query steps
38-
const queries = query_plan.filter((step): step is AzureSearchQueryStep => step.type === "AzureSearchQuery");
38+
const queries = query_plan.filter((step): step is AzureSearchQueryStep => step.type === "searchIndex");
3939

4040
return (
4141
<div>
@@ -65,7 +65,7 @@ export const AgentPlan: React.FC<Props> = ({ query_plan, description }) => {
6565
<tbody>
6666
{queries.map(q => (
6767
<tr key={q.id}>
68-
<td>{q.query.search}</td>
68+
<td>{q.search_index_arguments.search}</td>
6969
<td>{q.count}</td>
7070
<td>{q.elapsed_ms}</td>
7171
</tr>

app/frontend/src/components/Settings/Settings.tsx

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ export interface SettingsProps {
1313
promptTemplate: string;
1414
temperature: number;
1515
retrieveCount: number;
16-
maxSubqueryCount: number;
1716
resultsMergeStrategy: string;
1817
seed: number | null;
1918
minimumSearchScore: number;
@@ -55,7 +54,6 @@ export const Settings = ({
5554
promptTemplate,
5655
temperature,
5756
retrieveCount,
58-
maxSubqueryCount,
5957
resultsMergeStrategy,
6058
seed,
6159
minimumSearchScore,
@@ -109,8 +107,6 @@ export const Settings = ({
109107
const rerankerScoreFieldId = useId("rerankerScoreField");
110108
const retrieveCountId = useId("retrieveCount");
111109
const retrieveCountFieldId = useId("retrieveCountField");
112-
const maxSubqueryCountId = useId("maxSubqueryCount");
113-
const maxSubqueryCountFieldId = useId("maxSubqueryCountField");
114110
const resultsMergeStrategyFieldId = useId("resultsMergeStrategy");
115111
const includeCategoryId = useId("includeCategory");
116112
const includeCategoryFieldId = useId("includeCategoryField");
@@ -209,20 +205,6 @@ export const Settings = ({
209205
onRenderLabel={props => renderLabel(props, rerankerScoreId, rerankerScoreFieldId, t("helpTexts.rerankerScore"))}
210206
/>
211207
)}
212-
{showAgenticRetrievalOption && useAgenticRetrieval && (
213-
<TextField
214-
id={maxSubqueryCountFieldId}
215-
className={styles.settingsSeparator}
216-
label={t("labels.maxSubqueryCount")}
217-
type="number"
218-
min={2}
219-
max={40}
220-
defaultValue={maxSubqueryCount.toString()}
221-
onChange={(_ev, val) => onChange("maxSubqueryCount", parseInt(val || "10"))}
222-
aria-labelledby={maxSubqueryCountId}
223-
onRenderLabel={props => renderLabel(props, maxSubqueryCountId, maxSubqueryCountFieldId, t("helpTexts.maxSubqueryCount"))}
224-
/>
225-
)}
226208
{showAgenticRetrievalOption && useAgenticRetrieval && (
227209
<Dropdown
228210
id={resultsMergeStrategyFieldId}

app/frontend/src/locales/en/translation.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@
8383
"minimumSearchScore": "Minimum search score",
8484
"minimumRerankerScore": "Minimum reranker score",
8585
"retrieveCount": "Retrieve this many search results:",
86-
"maxSubqueryCount": "Max subqueries",
8786
"resultsMergeStrategy": "Results merge strategy",
8887
"resultsMergeStrategyOptions": {
8988
"interleaved": "Interleaved",
@@ -144,8 +143,6 @@
144143
"Sets a minimum score for search results coming back from the semantic reranker. The score always ranges between 0-4. The higher the score, the more semantically relevant the result is to the question.",
145144
"retrieveNumber":
146145
"Sets the number of search results to retrieve from Azure AI search. More results may increase the likelihood of finding the correct answer, but may lead to the model getting 'lost in the middle'.",
147-
"maxSubqueryCount":
148-
"Sets the maximum number of subqueries to use for the agentic retrieval query plan.",
149146
"resultsMergeStrategy":
150147
"Sets the strategy for merging results from multiple subqueries. Interleaved picks the top results from each subquery in round robin order, while descending sorts all results by reranker score.",
151148
"includeCategory":

app/frontend/src/locales/ja/translation.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@
8383
"minimumSearchScore": "最小検索スコア",
8484
"minimumRerankerScore": "最小リランキング・スコア",
8585
"retrieveCount": "ここで指定する検索結果数を取得:",
86-
"maxSubqueryCount": "最大サブクエリ数",
8786
"resultsMergeStrategy": "結果マージ戦略",
8887
"resultsMergeStrategyOptions": {
8988
"interleaved": "インターリーブ",
@@ -144,8 +143,6 @@
144143
"セマンティック・リランカーから返される検索結果の最小スコアを設定します。スコアの値は0から4の範囲で変更できます。スコアの値が大きいほど、質問に対する結果の意味的な関連性が高まります。",
145144
"retrieveNumber":
146145
"Azure AI Searchの検索結果から取得する数を設定します。結果が多ければ多いほど、正しい答えを見つける可能性は高まるかもしれませんが、モデルが「途中で迷子になる」可能性もあります。",
147-
"maxSubqueryCount":
148-
"エージェント型リトリーバルのクエリプランで使用する最大サブクエリ数を設定します。",
149146
"resultsMergeStrategy":
150147
"複数のサブクエリからの結果をマージする戦略を設定します。インターリーブは各サブクエリから上位結果をラウンドロビン順で選択し、降順はすべての結果をリランカースコアで並び替えます。",
151148
"includeCategory": "検索結果に含めるカテゴリを指定します。デフォルトのデータセットはカテゴリを使用していません。",

app/frontend/src/pages/ask/Ask.tsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export function Component(): JSX.Element {
3030
const [minimumSearchScore, setMinimumSearchScore] = useState<number>(0);
3131
const [retrievalMode, setRetrievalMode] = useState<RetrievalMode>(RetrievalMode.Hybrid);
3232
const [retrieveCount, setRetrieveCount] = useState<number>(3);
33-
const [maxSubqueryCount, setMaxSubqueryCount] = useState<number>(10);
3433
const [resultsMergeStrategy, setResultsMergeStrategy] = useState<string>("interleaved");
3534
const [useSemanticRanker, setUseSemanticRanker] = useState<boolean>(true);
3635
const [useSemanticCaptions, setUseSemanticCaptions] = useState<boolean>(false);
@@ -149,7 +148,6 @@ export function Component(): JSX.Element {
149148
include_category: includeCategory.length === 0 ? undefined : includeCategory,
150149
exclude_category: excludeCategory.length === 0 ? undefined : excludeCategory,
151150
top: retrieveCount,
152-
max_subqueries: maxSubqueryCount,
153151
results_merge_strategy: resultsMergeStrategy,
154152
temperature: temperature,
155153
minimum_reranker_score: minimumRerankerScore,
@@ -209,9 +207,6 @@ export function Component(): JSX.Element {
209207
case "retrieveCount":
210208
setRetrieveCount(value);
211209
break;
212-
case "maxSubqueryCount":
213-
setMaxSubqueryCount(value);
214-
break;
215210
case "resultsMergeStrategy":
216211
setResultsMergeStrategy(value);
217212
break;
@@ -370,7 +365,6 @@ export function Component(): JSX.Element {
370365
promptTemplateSuffix={promptTemplateSuffix}
371366
temperature={temperature}
372367
retrieveCount={retrieveCount}
373-
maxSubqueryCount={maxSubqueryCount}
374368
resultsMergeStrategy={resultsMergeStrategy}
375369
seed={seed}
376370
minimumSearchScore={minimumSearchScore}

app/frontend/src/pages/chat/Chat.tsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ const Chat = () => {
3535
const [minimumRerankerScore, setMinimumRerankerScore] = useState<number>(0);
3636
const [minimumSearchScore, setMinimumSearchScore] = useState<number>(0);
3737
const [retrieveCount, setRetrieveCount] = useState<number>(3);
38-
const [maxSubqueryCount, setMaxSubqueryCount] = useState<number>(10);
3938
const [resultsMergeStrategy, setResultsMergeStrategy] = useState<string>("interleaved");
4039
const [retrievalMode, setRetrievalMode] = useState<RetrievalMode>(RetrievalMode.Hybrid);
4140
const [useSemanticRanker, setUseSemanticRanker] = useState<boolean>(true);
@@ -213,7 +212,6 @@ const Chat = () => {
213212
include_category: includeCategory.length === 0 ? undefined : includeCategory,
214213
exclude_category: excludeCategory.length === 0 ? undefined : excludeCategory,
215214
top: retrieveCount,
216-
max_subqueries: maxSubqueryCount,
217215
results_merge_strategy: resultsMergeStrategy,
218216
temperature: temperature,
219217
minimum_reranker_score: minimumRerankerScore,
@@ -310,9 +308,6 @@ const Chat = () => {
310308
case "retrieveCount":
311309
setRetrieveCount(value);
312310
break;
313-
case "maxSubqueryCount":
314-
setMaxSubqueryCount(value);
315-
break;
316311
case "resultsMergeStrategy":
317312
setResultsMergeStrategy(value);
318313
break;
@@ -543,7 +538,6 @@ const Chat = () => {
543538
promptTemplate={promptTemplate}
544539
temperature={temperature}
545540
retrieveCount={retrieveCount}
546-
maxSubqueryCount={maxSubqueryCount}
547541
resultsMergeStrategy={resultsMergeStrategy}
548542
seed={seed}
549543
minimumSearchScore={minimumSearchScore}

docs/agentic_retrieval.md

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,7 @@ See the agentic retrieval documentation.
5454

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

57-
6. **Experiment with max subqueries:**
58-
59-
Select the developer options in the web app and change max subqueries to any value between 1 and 20. This controls the maximum amount of subqueries that can be created in the query plan.
60-
61-
![Max subqueries screenshot](./images/max-subqueries.png)
62-
63-
7. **Review the query plan**
57+
6. **Review the query plan**
6458

6559
Agentic retrieval use additional billed tokens behind the scenes for the planning process.
6660
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

0 commit comments

Comments
 (0)