Skip to content

Commit 1d066ef

Browse files
authored
RAI simulator support for context in QA eval (#34617)
* Changed the parameter from max_count to limit * Add a method to have output in qa format from simulator * simulation_result_limit was missing from main * Return the right result variable for full_result * to json lines supports saving context to forward it to eval * Forward the context when context is available in full response * Removing metadata, ch_template_placeholders from chat_protocol * Update _utils.py Nit fix
1 parent a0c4de7 commit 1d066ef

File tree

3 files changed

+52
-8
lines changed

3 files changed

+52
-8
lines changed

sdk/ai/azure-ai-generative/azure/ai/generative/synthetic/simulator/simulator/_callback_conversation_bot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ async def generate_response(
4545

4646
self.logger.info("Parsed callback response")
4747

48-
return response, {}, time_taken, response
48+
return response, {}, time_taken, result
4949

5050
# pylint: disable=unused-argument
5151
def _to_chat_protocol(self, template, conversation_history, template_parameters):
Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,65 @@
11
# ---------------------------------------------------------
22
# Copyright (c) Microsoft Corporation. All rights reserved.
33
# ---------------------------------------------------------
4+
# pylint: disable=C0303
5+
"""
6+
This module contains a utility class for managing a list of JSON lines.
7+
"""
48
import json
59

610

711
class JsonLineList(list):
12+
"""
13+
A util to manage a list of JSON lines.
14+
"""
815
def to_json_lines(self):
16+
"""
17+
Converts the list to a string of JSON lines.
18+
Each item in the list is converted to a JSON string
19+
and appended to the result string with a newline.
20+
21+
:returns: A string of JSON lines, where each line is a JSON representation of an item in the list.
22+
:rtype: str
23+
"""
924
json_lines = ""
1025
for item in self:
1126
json_lines += json.dumps(item) + "\n"
1227
return json_lines
1328

1429
def to_eval_qa_json_lines(self):
30+
"""
31+
Converts the list to a string of JSON lines suitable for evaluation in a Q&A format.
32+
Each item in the list is expected to be a dictionary with
33+
'messages' key. The 'messages' value is a list of
34+
dictionaries, each with a 'role' key and a 'content' key.
35+
The 'role' value should be either 'user' or 'assistant',
36+
and the 'content' value should be a string.
37+
If a 'context' key is present in the message, its value is also included
38+
in the output.
39+
40+
:returns: A string of JSON lines.
41+
:rtype: str
42+
"""
1543
json_lines = ""
1644
for item in self:
1745
user_message = None
1846
assistant_message = None
19-
for message in item["messages"]:
20-
if message["role"] == "user":
21-
user_message = message["content"]
22-
elif message["role"] == "assistant":
23-
assistant_message = message["content"]
47+
context = None
48+
for message in item['messages']:
49+
if message['role'] == 'user':
50+
user_message = message['content']
51+
elif message['role'] == 'assistant':
52+
assistant_message = message['content']
53+
if 'context' in message:
54+
context = message.get("context", None)
2455
if user_message and assistant_message:
25-
json_lines += json.dumps({"question": user_message, "answer": assistant_message}) + "\n"
56+
if context:
57+
json_lines += json.dumps({
58+
'question': user_message,
59+
'answer': assistant_message,
60+
'context': context}) + "\n"
61+
else:
62+
json_lines += json.dumps({
63+
'question': user_message,
64+
'answer': assistant_message}) + "\n"
2665
return json_lines

sdk/ai/azure-ai-generative/azure/ai/generative/synthetic/simulator/simulator/simulator.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,13 +392,18 @@ def _get_callback_citations(self, callback_citations: dict, turn_num: Optional[i
392392

393393
def _to_chat_protocol(self, template, conversation_history, template_parameters):
394394
messages = []
395-
396395
for i, m in enumerate(conversation_history):
397396
message = {"content": m.message, "role": m.role.value}
398397
if len(template.context_key) > 0:
399398
citations = self._get_citations(template_parameters, template.context_key, i)
400399
message["context"] = citations
400+
elif "context" in m.full_response:
401+
# adding context for adv_qa
402+
message["context"] = m.full_response["context"]
401403
messages.append(message)
404+
template_parameters['metadata'] = {}
405+
if "ch_template_placeholder" in template_parameters:
406+
del template_parameters["ch_template_placeholder"]
402407

403408
return {
404409
"template_parameters": template_parameters,

0 commit comments

Comments
 (0)