Создание и настройка AI-агентов в Colab с Microsoft Agent-Lightning
Что вы запустите в Colab
В этом руководстве показано, как настроить продвинутый конвейер AI-агента с Microsoft Agent-Lightning прямо в Google Colab. Вы можете запускать сервер и клиент в одном рантайме, определить простой QA-агент, отправлять задачи на сервер, обновлять общий system_prompt и оценивать, какой промпт работает лучше.
Установка и импорт зависимостей
Запустите в Colab установку библиотек и настройку ключа OpenAI и модели:
!pip -q install agentlightning openai nest_asyncio python-dotenv > /dev/null
import os, threading, time, asyncio, nest_asyncio, random
from getpass import getpass
from agentlightning.litagent import LitAgent
from agentlightning.trainer import Trainer
from agentlightning.server import AgentLightningServer
from agentlightning.types import PromptTemplate
import openai
if not os.getenv("OPENAI_API_KEY"):
try:
os.environ["OPENAI_API_KEY"] = getpass(" Enter OPENAI_API_KEY (leave blank if using a local/proxy base): ") or ""
except Exception:
pass
MODEL = os.getenv("MODEL", "gpt-4o-mini")
Определение простого QA-агента
Создайте подкласс LitAgent, который выполняет training_rollout, отправляет запрос LLM с system_prompt от сервера и вычисляет награду. Функция вознаграждения объединяет точное совпадение, перекрытие токенов и краткость:
class QAAgent(LitAgent):
def training_rollout(self, task, rollout_id, resources):
"""Given a task {'prompt':..., 'answer':...}, ask LLM using the server-provided system prompt and return a reward in [0,1]."""
sys_prompt = resources["system_prompt"].template
user = task["prompt"]; gold = task.get("answer","").strip().lower()
try:
r = openai.chat.completions.create(
model=MODEL,
messages=[{"role":"system","content":sys_prompt},
{"role":"user","content":user}],
temperature=0.2,
)
pred = r.choices[0].message.content.strip()
except Exception as e:
pred = f"[error]{e}"
def score(pred, gold):
P = pred.lower()
base = 1.0 if gold and gold in P else 0.0
gt = set(gold.split()); pr = set(P.split());
inter = len(gt & pr); denom = (len(gt)+len(pr)) or 1
overlap = 2*inter/denom
brevity = 0.2 if base==1.0 and len(P.split())<=8 else 0.0
return max(0.0, min(1.0, 0.7*base + 0.25*overlap + brevity))
return float(score(pred, gold))
Подготовка задач и кандидатов промптов
Определите небольшой бенчмарк и набор системных промптов, которые хотите протестировать. Примените nest_asyncio, чтобы можно было одновременно запускать асинхронный сервер и синхронные клиентские потоки:
TASKS = [
{"prompt":"Capital of France?","answer":"Paris"},
{"prompt":"Who wrote Pride and Prejudice?","answer":"Jane Austen"},
{"prompt":"2+2 = ?","answer":"4"},
]
PROMPTS = [
"You are a terse expert. Answer with only the final fact, no sentences.",
"You are a helpful, knowledgeable AI. Prefer concise, correct answers.",
"Answer as a rigorous evaluator; return only the canonical fact.",
"Be a friendly tutor. Give the one-word answer if obvious."
]
nest_asyncio.apply()
HOST, PORT = "127.0.0.1", 9997
Запуск сервера и оценка промптов
Запустите Agent-Lightning сервер, итеративно обновляйте system_prompt, ставьте задачи в очередь и опрашивайте завершенные rollout’ы. Вычисляйте средние награды, чтобы выбрать лучший промпт:
async def run_server_and_search():
server = AgentLightningServer(host=HOST, port=PORT)
await server.start()
print(" Server started")
await asyncio.sleep(1.5)
results = []
for sp in PROMPTS:
await server.update_resources({"system_prompt": PromptTemplate(template=sp, engine="f-string")})
scores = []
for t in TASKS:
tid = await server.queue_task(sample=t, mode="train")
rollout = await server.poll_completed_rollout(tid, timeout=40) # waits for a worker
if rollout is None:
print(" Timeout waiting for rollout; continuing...")
continue
scores.append(float(getattr(rollout, "final_reward", 0.0)))
avg = sum(scores)/len(scores) if scores else 0.0
print(f" Prompt avg: {avg:.3f} | {sp}")
results.append((sp, avg))
best = max(results, key=lambda x: x[1]) if results else ("<none>",0)
print("n BEST PROMPT:", best[0], " | score:", f"{best[1]:.3f}")
await server.stop()
Запуск клиента и оркестрация обучения
Запустите клиент-агента в фоновом потоке с несколькими воркерами, чтобы он мог опрашивать сервер и параллельно обрабатывать задачи. Затем выполните серверную поисковую петлю:
def run_client_in_thread():
agent = QAAgent()
trainer = Trainer(n_workers=2)
trainer.fit(agent, backend=f"http://{HOST}:{PORT}")
client_thr = threading.Thread(target=run_client_in_thread, daemon=True)
client_thr.start()
asyncio.run(run_server_and_search())
Как это работает и что можно попробовать
Agent-Lightning разделяет оркестрацию (сервер) и исполнение (клиенты). Сервер хранит общие ресурсы, такие как system_prompt, и ставит задачи в очередь; клиенты выполняют rollout’ы и возвращают награды. В этом шаблоне вы можете:
- Быстро сравнивать несколько системных промптов и выбирать лучший по средней награде.
- Масштабировать количество воркеров локально или на нескольких машинах для ускорения.
- Настраивать функцию вознаграждения под ваши метрики (точность, краткость, стиль).
Такой подход удобен для поиска промптов, автоматизированных циклов оценки и итеративной разработки агентов в одном Colab-окружении.