Обновил структуру проекта
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
llm:
|
||||
provider: codex # openai, codex
|
||||
# model: gpt-6-Astra
|
||||
model: gpt-6-astra
|
||||
# model: qwen/qwen3-8b
|
||||
|
||||
generation:
|
||||
@@ -8,7 +8,7 @@ generation:
|
||||
max_tokens: 4096
|
||||
|
||||
runtime:
|
||||
concurrency: 1 # Колличество одновременных запросов
|
||||
concurrency: 5 # Колличество одновременных запросов
|
||||
|
||||
prompts:
|
||||
instructions: |
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import asyncio
|
||||
from pathlib import Path
|
||||
|
||||
import pandas as pd
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# from pydantic import BaseModel
|
||||
@@ -9,61 +7,56 @@ from pydantic_ai import Agent
|
||||
from pydantic_ai.settings import ModelSettings
|
||||
|
||||
from llm.config import load_config
|
||||
from llm.factory import LLMModelProvider
|
||||
from llm.schemas import DatasetRecord, Message, RobotPlan, SFTFormat
|
||||
from llm.factory import LLMModelProvider, DatasetWriter
|
||||
from llm.schemas import (RobotPlan, RobotDatasetRecord,
|
||||
Prompts, ModelResponse,
|
||||
ModelInfo, GenerationSettings)
|
||||
|
||||
load_dotenv()
|
||||
|
||||
|
||||
def save_to_csv(record: DatasetRecord,
|
||||
path: str | Path):
|
||||
path = Path(path)
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
exists = path.exists()
|
||||
|
||||
df = pd.DataFrame([record.model_dump()])
|
||||
df.to_csv(path,
|
||||
mode="a" if exists else "w",
|
||||
header=not exists,
|
||||
index=False,
|
||||
encoding="utf-8")
|
||||
|
||||
def save_to_jsonl(sft_format: SFTFormat,
|
||||
path: str | Path):
|
||||
path = Path(path)
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
with path.open("a", encoding="utf-8") as file:
|
||||
file.write(sft_format.model_dump_json())
|
||||
file.write("\n")
|
||||
|
||||
|
||||
def record_to_sft(record: DatasetRecord) -> SFTFormat:
|
||||
return SFTFormat(
|
||||
message=[
|
||||
Message(
|
||||
role="system",
|
||||
content=record.system_prompt
|
||||
),
|
||||
Message(
|
||||
role="user",
|
||||
content=record.user_prompt
|
||||
),
|
||||
Message(
|
||||
role="assistant",
|
||||
content=record.assistant_content
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
def format_robot_plan(plan: RobotPlan):
|
||||
return "\n".join(
|
||||
f"{index}. {step}"
|
||||
for index, step in enumerate(plan.steps, start=1)
|
||||
f"{step}"
|
||||
for step in plan.steps
|
||||
)
|
||||
|
||||
|
||||
async def generate_record(task: str,
|
||||
agent: Agent,
|
||||
settings: ModelSettings,
|
||||
config,
|
||||
semaphore: asyncio.Semaphore) -> RobotDatasetRecord:
|
||||
|
||||
async with semaphore:
|
||||
user_prompt = config.prompts.user.format(task=task)
|
||||
|
||||
result = await agent.run(user_prompt,
|
||||
model_settings=settings)
|
||||
assistant_content = format_robot_plan(result.output)
|
||||
|
||||
return RobotDatasetRecord(
|
||||
task=task,
|
||||
prompts=Prompts(
|
||||
system_prompt=config.prompts.system,
|
||||
instructions=config.prompts.instructions,
|
||||
user_prompt=user_prompt
|
||||
),
|
||||
response=ModelResponse(
|
||||
model_response=result.output.model_dump_json(),
|
||||
assistant_content=assistant_content
|
||||
),
|
||||
model_info=ModelInfo(
|
||||
provider=config.llm.provider,
|
||||
model=config.llm.model
|
||||
),
|
||||
generation=GenerationSettings(
|
||||
temperature=config.generation.temperature,
|
||||
max_tokens=config.generation.max_tokens
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def main():
|
||||
config = load_config("./build-dataset/config.yml")
|
||||
model = await LLMModelProvider.create_from_config(config.llm)
|
||||
@@ -81,30 +74,42 @@ async def main():
|
||||
**config.generation.model_dump()
|
||||
)
|
||||
|
||||
task="Перемести деталь A из точки PICK_A в точку PLACE_A. Безопасная высота подъема — 200 мм."
|
||||
user_prompt = config.prompts.user.format(task=task)
|
||||
result = await agent.run(user_prompt,
|
||||
model_settings=settings)
|
||||
tasks = [
|
||||
(
|
||||
"Перемести деталь A из точки PICK_A в точку PLACE_A. "
|
||||
"Безопасная высота подъема — 200 мм."
|
||||
),
|
||||
(
|
||||
"Перемести деталь B из точки PICK_B в точку PLACE_B. "
|
||||
"Безопасная высота подъема — 150 мм."
|
||||
),
|
||||
(
|
||||
"Возьми крышку из точки COVER_PICK и перемести "
|
||||
"ее в точку COVER_PLACE."
|
||||
),
|
||||
]
|
||||
|
||||
assistant_content = format_robot_plan(result.output)
|
||||
record = DatasetRecord(
|
||||
task=task,
|
||||
system_prompt=config.prompts.system,
|
||||
instructions=config.prompts.instructions,
|
||||
user_prompt=user_prompt,
|
||||
model_response=result.output.model_dump_json(),
|
||||
assistant_content=assistant_content,
|
||||
provider=config.llm.provider,
|
||||
model=config.llm.model,
|
||||
temperature=config.generation.temperature,
|
||||
max_tokens=config.generation.max_tokens
|
||||
)
|
||||
semaphore = asyncio.Semaphore(config.runtime.concurrency)
|
||||
|
||||
save_to_csv(record=record,
|
||||
path="./dataset/robot-move.csv")
|
||||
sft_format = record_to_sft(record)
|
||||
save_to_jsonl(sft_format=sft_format,
|
||||
path="./dataset/robot-move.jsonl")
|
||||
records = await asyncio.gather(*[
|
||||
generate_record(
|
||||
task,
|
||||
agent,
|
||||
settings,
|
||||
config,
|
||||
semaphore,
|
||||
)
|
||||
for task in tasks
|
||||
])
|
||||
|
||||
for record in records:
|
||||
dataset = DatasetWriter(
|
||||
dataset_record=record,
|
||||
base_path="./dataset"
|
||||
)
|
||||
|
||||
dataset.to_csv(filename="robot-plan.csv")
|
||||
dataset.to_jsonl(filename="robotplan.jsonl")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user