Обновил структуру проекта

This commit is contained in:
Даниил Грабарь
2026-10-01 17:38:49 +10:00
parent 2e23b63689
commit 9e551a2ca9
5 changed files with 170 additions and 86 deletions
+75 -70
View File
@@ -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__":