|
import asyncio |
|
import json |
|
import time |
|
|
|
from datasets import load_dataset |
|
|
|
from lagent.agents import AsyncMathCoder |
|
from lagent.agents.aggregator import InternLMToolAggregator |
|
from lagent.llms import AsyncGPTAPI |
|
from lagent.prompts.parsers import ToolParser |
|
|
|
loop = asyncio.new_event_loop() |
|
asyncio.set_event_loop(loop) |
|
|
|
interpreter_prompt = ( |
|
'Below is a math problem. Please solve it step by step with the assistance of Python programming. Consider using Sympy or Numpy library ' |
|
'to facilitate your derivation, calculation and equation solving. Utilize the "pi" symbol and "Rational" from Sympy ' |
|
'for $$\pi$$ and fractions, and simplify all fractions and square roots without converting them to decimal values. ' |
|
'Please encapsulate each generated Jupyter Python code block with tags "{begin}" and "{end}". Conclude the ' |
|
r'final answer when observations are sufficient and encapsulate the numerical result with LaTeX syntax "\boxed{{}}" ' |
|
'without any unit, and end your conclusion with the special token "[END]" to denote the completion of your response. ' |
|
'Keep the following points in mind:\n' |
|
'- You must alternately use human and programming languages in the chain of thought;\n' |
|
'- The number of your reasoning steps should not exceed **three**, which means you may merge some intermediate steps when the original answer is tedious.' |
|
) |
|
|
|
async_llm = dict( |
|
type=AsyncGPTAPI, |
|
model='gpt-4o-2024-05-13', |
|
retry=50, |
|
key='', |
|
max_new_tokens=2048, |
|
stop_words=['</python'], |
|
proxies=dict(), |
|
) |
|
async_agent = AsyncMathCoder( |
|
llm=async_llm, |
|
output_format=ToolParser( |
|
tool_type='interpreter', |
|
template=interpreter_prompt, |
|
begin='<python>\n', |
|
end='\n</python>'), |
|
aggregator=InternLMToolAggregator( |
|
environment_role='system', |
|
environment_begin='<output>\n', |
|
environment_end='\n</output>'), |
|
finish_condition=lambda m: '[END]' in m.content, |
|
) |
|
|
|
ds = load_dataset('lighteval/MATH', split='train') |
|
problems = [item['problem'] for item in ds.select(range(30))] |
|
|
|
tic = time.time() |
|
coros = [async_agent(q, session_id=i) for i, q in enumerate(problems)] |
|
res = loop.run_until_complete(asyncio.gather(*coros)) |
|
print(time.time() - tic) |
|
with open('tmp_6.json', 'w') as f: |
|
json.dump([async_agent.get_steps(i) for i in range(len(problems))], |
|
f, |
|
ensure_ascii=False, |
|
indent=4) |
|
|