본문으로 건너뛰기
cccskills
무료GitHub에 공개

dspy

Construa sistemas de IA complexos com programação declarativa, otimize prompts automaticamente, crie sistemas RAG modulares e agentes com DSPy - framework de Programação Sistemática de Modelos de Linguagem da Stanford NLP

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

연동 도구DiscordOpenAI
설치 방법 보기

포함된 파일(4)

  • SKILL.md15.6 KB
  • references/examples.md18.5 KB
  • references/modules.md12.1 KB
  • references/optimizers.md14.6 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

DSPy: Programação Declarativa de Modelos de Linguagem

Quando Usar Esta Skill

Use DSPy quando você precisar:

  • Construir sistemas de IA complexos com múltiplos componentes e workflows
  • Programar LMs declarativamente em vez de engenharia manual de prompts
  • Otimizar prompts automaticamente usando métodos orientados por dados
  • Criar pipelines de IA modulares que sejam mantíveis e portáveis
  • Melhorar sistematicamente saídas de modelos com otimizadores
  • Construir sistemas RAG, agentes ou classificadores com melhor confiabilidade

GitHub Stars: 22.000+ | Criado Por: Stanford NLP

Instalação

# Versão estável
pip install dspy

# Versão mais recente de desenvolvimento
pip install git+https://github.com/stanfordnlp/dspy.git

# Com provedores de LM específicos
pip install dspy[openai]        # OpenAI
pip install dspy[anthropic]     # Anthropic Claude
pip install dspy[all]           # Todos os provedores

Início Rápido

Exemplo Básico: Resposta a Perguntas

import dspy

# Configure seu modelo de linguagem
lm = dspy.Claude(model="claude-sonnet-4-5-20250929")
dspy.settings.configure(lm=lm)

# Defina uma signature (entrada → saída)
class QA(dspy.Signature):
    """Responda perguntas com respostas factuais breves."""
    question = dspy.InputField()
    answer = dspy.OutputField(desc="frequentemente entre 1 e 5 palavras")

# Crie um módulo
qa = dspy.Predict(QA)

# Use-o
response = qa(question="Qual é a capital da França?")
print(response.answer)  # "Paris"

Raciocínio com Cadeia de Pensamento

import dspy

lm = dspy.Claude(model="claude-sonnet-4-5-20250929")
dspy.settings.configure(lm=lm)

# Use ChainOfThought para melhor raciocínio
class MathProblem(dspy.Signature):
    """Resolva problemas matemáticos em linguagem natural."""
    problem = dspy.InputField()
    answer = dspy.OutputField(desc="resposta numérica")

# ChainOfThought gera passos de raciocínio automaticamente
cot = dspy.ChainOfThought(MathProblem)

response = cot(problem="Se João tem 5 maçãs e dá 2 para Maria, quantas ele tem?")
print(response.rationale)  # Mostra passos de raciocínio
print(response.answer)     # "3"

Conceitos Principais

1. Signatures

Signatures definem a estrutura da sua tarefa de IA (entradas → saídas):

# Signature inline (simples)
qa = dspy.Predict("question -> answer")

# Signature de classe (detalhada)
class Summarize(dspy.Signature):
    """Resuma texto em pontos-chave."""
    text = dspy.InputField()
    summary = dspy.OutputField(desc="pontos em bullet, 3-5 itens")

summarizer = dspy.ChainOfThought(Summarize)

Quando usar cada:

  • Inline: Prototipagem rápida, tarefas simples
  • Classe: Tarefas complexas, type hints, melhor documentação

2. Módulos

Módulos são componentes reutilizáveis que transformam entradas em saídas:

dspy.Predict

Módulo de predição básico:

predictor = dspy.Predict("context, question -> answer")
result = predictor(context="Paris é a capital da França",
                   question="Qual é a capital?")

dspy.ChainOfThought

Gera passos de raciocínio antes de responder:

cot = dspy.ChainOfThought("question -> answer")
result = cot(question="Por que o céu é azul?")
print(result.rationale)  # Passos de raciocínio
print(result.answer)     # Resposta final

dspy.ReAct

Raciocínio tipo agente com ferramentas:

from dspy.predict import ReAct

class SearchQA(dspy.Signature):
    """Responda perguntas usando busca."""
    question = dspy.InputField()
    answer = dspy.OutputField()

def search_tool(query: str) -> str:
    """Busque na Wikipédia."""
    # Sua implementação de busca
    return results

react = ReAct(SearchQA, tools=[search_tool])
result = react(question="Quando Python foi criado?")

dspy.ProgramOfThought

Gera e executa código para raciocínio:

pot = dspy.ProgramOfThought("question -> answer")
result = pot(question="Quanto é 15% de 240?")
# Gera: answer = 240 * 0.15

3. Otimizadores

Otimizadores melhoram seus módulos automaticamente usando dados de treinamento:

BootstrapFewShot

Aprende a partir de exemplos:

from dspy.teleprompt import BootstrapFewShot

# Dados de treinamento
trainset = [
    dspy.Example(question="Quanto é 2+2?", answer="4").with_inputs("question"),
    dspy.Example(question="Quanto é 3+5?", answer="8").with_inputs("question"),
]

# Defina métrica
def validate_answer(example, pred, trace=None):
    return example.answer == pred.answer

# Otimize
optimizer = BootstrapFewShot(metric=validate_answer, max_bootstrapped_demos=3)
optimized_qa = optimizer.compile(qa, trainset=trainset)

# Agora optimized_qa funciona melhor!

MIPRO (Most Important Prompt Optimization)

Melhora iterativamente prompts:

from dspy.teleprompt import MIPRO

optimizer = MIPRO(
    metric=validate_answer,
    num_candidates=10,
    init_temperature=1.0
)

optimized_cot = optimizer.compile(
    cot,
    trainset=trainset,
    num_trials=100
)

BootstrapFinetune

Cria datasets para fine-tuning de modelos:

from dspy.teleprompt import BootstrapFinetune

optimizer = BootstrapFinetune(metric=validate_answer)
optimized_module = optimizer.compile(qa, trainset=trainset)

# Exporta dados de treinamento para fine-tuning

4. Construindo Sistemas Complexos

Pipeline Multi-Estágio

import dspy

class MultiHopQA(dspy.Module):
    def __init__(self):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=3)
        self.generate_query = dspy.ChainOfThought("question -> search_query")
        self.generate_answer = dspy.ChainOfThought("context, question -> answer")

    def forward(self, question):
        # Estágio 1: Gere query de busca
        search_query = self.generate_query(question=question).search_query

        # Estágio 2: Recupere contexto
        passages = self.retrieve(search_query).passages
        context = "\n".join(passages)

        # Estágio 3: Gere resposta
        answer = self.generate_answer(context=context, question=question).answer
        return dspy.Prediction(answer=answer, context=context)

# Use o pipeline
qa_system = MultiHopQA()
result = qa_system(question="Quem escreveu o livro que inspirou o filme Blade Runner?")

Sistema RAG com Otimização

import dspy
from dspy.retrieve.chromadb_rm import ChromadbRM

# Configure o recuperador
retriever = ChromadbRM(
    collection_name="documents",
    persist_directory="./chroma_db"
)

class RAG(dspy.Module):
    def __init__(self, num_passages=3):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=num_passages)
        self.generate = dspy.ChainOfThought("context, question -> answer")

    def forward(self, question):
        context = self.retrieve(question).passages
        return self.generate(context=context, question=question)

# Crie e otimize
rag = RAG()

# Otimize com dados de treinamento
from dspy.teleprompt import BootstrapFewShot

optimizer = BootstrapFewShot(metric=validate_answer)
optimized_rag = optimizer.compile(rag, trainset=trainset)

Configuração de Provedor de LM

Anthropic Claude

import dspy

lm = dspy.Claude(
    model="claude-sonnet-4-5-20250929",
    api_key="your-api-key",  # Ou defina a variável de ambiente ANTHROPIC_API_KEY
    max_tokens=1000,
    temperature=0.7
)
dspy.settings.configure(lm=lm)

OpenAI

lm = dspy.OpenAI(
    model="gpt-4",
    api_key="your-api-key",
    max_tokens=1000
)
dspy.settings.configure(lm=lm)

Modelos Locais (Ollama)

lm = dspy.OllamaLocal(
    model="llama3.1",
    base_url="http://localhost:11434"
)
dspy.settings.configure(lm=lm)

Múltiplos Modelos

# Diferentes modelos para diferentes tarefas
cheap_lm = dspy.OpenAI(model="gpt-3.5-turbo")
strong_lm = dspy.Claude(model="claude-sonnet-4-5-20250929")

# Use modelo barato para recuperação, modelo forte para raciocínio
with dspy.settings.context(lm=cheap_lm):
    context = retriever(question)

with dspy.settings.context(lm=strong_lm):
    answer = generator(context=context, question=question)

Padrões Comuns

Padrão 1: Saída Estruturada

from pydantic import BaseModel, Field

class PersonInfo(BaseModel):
    name: str = Field(description="Nome completo")
    age: int = Field(description="Idade em anos")
    occupation: str = Field(description="Profissão atual")

class ExtractPerson(dspy.Signature):
    """Extraia informações de pessoa do texto."""
    text = dspy.InputField()
    person: PersonInfo = dspy.OutputField()

extractor = dspy.TypedPredictor(ExtractPerson)
result = extractor(text="João Silva é um engenheiro de software de 35 anos.")
print(result.person.name)  # "João Silva"
print(result.person.age)   # 35

Padrão 2: Otimização Orientada por Assertions

import dspy
from dspy.primitives.assertions import assert_transform_module, backtrack_handler

class MathQA(dspy.Module):
    def __init__(self):
        super().__init__()
        self.solve = dspy.ChainOfThought("problem -> solution: float")

    def forward(self, problem):
        solution = self.solve(problem=problem).solution

        # Assert que solução é numérica
        dspy.Assert(
            isinstance(float(solution), float),
            "A solução deve ser um número",
            backtrack=backtrack_handler
        )

        return dspy.Prediction(solution=solution)

Padrão 3: Auto-Consistência

import dspy
from collections import Counter

class ConsistentQA(dspy.Module):
    def __init__(self, num_samples=5):
        super().__init__()
        self.qa = dspy.ChainOfThought("question -> answer")
        self.num_samples = num_samples

    def forward(self, question):
        # Gere múltiplas respostas
        answers = []
        for _ in range(self.num_samples):
            result = self.qa(question=question)
            answers.append(result.answer)

        # Retorne resposta mais comum
        most_common = Counter(answers).most_common(1)[0][0]
        return dspy.Prediction(answer=most_common)

Padrão 4: Recuperação com Reranking

class RerankedRAG(dspy.Module):
    def __init__(self):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=10)
        self.rerank = dspy.Predict("question, passage -> relevance_score: float")
        self.answer = dspy.ChainOfThought("context, question -> answer")

    def forward(self, question):
        # Recupere candidatos
        passages = self.retrieve(question).passages

        # Faça rerank das passagens
        scored = []
        for passage in passages:
            score = float(self.rerank(question=question, passage=passage).relevance_score)
            scored.append((score, passage))

        # Pegue top 3
        top_passages = [p for _, p in sorted(scored, reverse=True)[:3]]
        context = "\n\n".join(top_passages)

        # Gere resposta
        return self.answer(context=context, question=question)

Avaliação e Métricas

Métricas Personalizadas

def exact_match(example, pred, trace=None):
    """Métrica de correspondência exata."""
    return example.answer.lower() == pred.answer.lower()

def f1_score(example, pred, trace=None):
    """F1 score para sobreposição de texto."""
    pred_tokens = set(pred.answer.lower().split())
    gold_tokens = set(example.answer.lower().split())

    if not pred_tokens:
        return 0.0

    precision = len(pred_tokens & gold_tokens) / len(pred_tokens)
    recall = len(pred_tokens & gold_tokens) / len(gold_tokens)

    if precision + recall == 0:
        return 0.0

    return 2 * (precision * recall) / (precision + recall)

Avaliação

from dspy.evaluate import Evaluate

# Crie um avaliador
evaluator = Evaluate(
    devset=testset,
    metric=exact_match,
    num_threads=4,
    display_progress=True
)

# Avalie modelo
score = evaluator(qa_system)
print(f"Acurácia: {score}")

# Compare otimizado vs não otimizado
score_before = evaluator(qa)
score_after = evaluator(optimized_qa)
print(f"Melhora: {score_after - score_before:.2%}")

Melhores Práticas

1. Comece Simples, Itere

# Comece com Predict
qa = dspy.Predict("question -> answer")

# Adicione raciocínio se necessário
qa = dspy.ChainOfThought("question -> answer")

# Adicione otimização quando tiver dados
optimized_qa = optimizer.compile(qa, trainset=data)

2. Use Signatures Descritivas

# ❌ Ruim: Vago
class Task(dspy.Signature):
    input = dspy.InputField()
    output = dspy.OutputField()

# ✅ Bom: Descritivo
class SummarizeArticle(dspy.Signature):
    """Resuma artigos de notícias em 3-5 pontos-chave."""
    article = dspy.InputField(desc="texto do artigo completo")
    summary = dspy.OutputField(desc="pontos em bullet, 3-5 itens")

3. Otimize com Dados Representativos

# Crie exemplos de treinamento diversos
trainset = [
    dspy.Example(question="fatorial", answer="...").with_inputs("question"),
    dspy.Example(question="raciocínio", answer="...").with_inputs("question"),
    dspy.Example(question="cálculo", answer="...").with_inputs("question"),
]

# Use conjunto de validação para métrica
def metric(example, pred, trace=None):
    return example.answer in pred.answer

4. Salve e Carregue Modelos Otimizados

# Salve
optimized_qa.save("models/qa_v1.json")

# Carregue
loaded_qa = dspy.ChainOfThought("question -> answer")
loaded_qa.load("models/qa_v1.json")

5. Monitore e Depure

# Ative rastreamento
dspy.settings.configure(lm=lm, trace=[])

# Execute predição
result = qa(question="...")

# Inspecione rastreamento
for call in dspy.settings.trace:
    print(f"Prompt: {call['prompt']}")
    print(f"Resposta: {call['response']}")

Comparação com Outras Abordagens

RecursoPrompting ManualLangChainDSPy
Engenharia de PromptsManualManualAutomática
OtimizaçãoTentativa e erroNenhumaOrientada por dados
ModularidadeBaixaMédiaAlta
Type SafetyNãoLimitadoSim (Signatures)
PortabilidadeBaixaMédiaAlta
Curva de AprendizadoBaixaMédiaMédia-Alta

Quando escolher DSPy:

  • Você tem dados de treinamento ou pode gerá-los
  • Precisa de melhoria sistemática de prompts
  • Está construindo sistemas multi-estágio complexos
  • Quer otimizar em diferentes LMs

Quando escolher alternativas:

  • Protótipos rápidos (prompting manual)
  • Cadeias simples com ferramentas existentes (LangChain)
  • Lógica de otimização customizada necessária

Recursos

Veja Também

  • references/modules.md - Guia detalhado de módulos (Predict, ChainOfThought, ReAct, ProgramOfThought)
  • references/optimizers.md - Algoritmos de otimização (BootstrapFewShot, MIPRO, BootstrapFinetune)
  • references/examples.md - Exemplos do mundo real (RAG, agentes, classificadores)

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Especialista em construir experiências 3D para a web - Three.js, React Three Fiber, Spline, WebGL e cenas 3D interativas. Cobre configuradores de produtos, portfólios 3D, websites imersivos e adição de profundidade às experiências web. Use quando: website 3D, three.js, WebGL, react three fiber, experiência 3D.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Quando o usuário quer planejar, projetar ou implementar um teste A/B ou experimento. Também use quando o usuário menciona "teste A/B", "split test", "experimento", "testar essa mudança", "copy variante", "teste multivariado" ou "hipótese". Para implementação de rastreamento, veja analytics-tracking.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Auditar e melhorar a acessibilidade web seguindo as diretrizes WCAG 2.1. Use quando solicitado para "melhorar acessibilidade", "auditoria a11y", "conformidade WCAG", "suporte a leitor de tela", "navegação por teclado" ou "tornar acessível".

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Testes e benchmarking de agentes LLM incluindo testes comportamentais, avaliação de capacidades, métricas de confiabilidade e monitoramento em produção—onde até os melhores agentes alcançam menos de 50% em benchmarks do mundo real. Use quando: testes de agentes, avaliação de agentes, benchmark de agentes, confiabilidade de agentes, teste de agentes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Criar, gerenciar e orquestrar agentes de IA usando o CLI AI Maestro. Use quando o usuário pedir para "criar agente", "listar agentes", "deletar agente", "hibernar agente", "despertar agente", "instalar plugin", "mostrar agente", "reiniciar agente" ou qualquer tarefa de gerenciamento do ciclo de vida do agente.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

Gerencie múltiplos agentes CLI locais via sessões tmux (iniciar/parar/monitorar/atribuir) com agendamento compatível com cron.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

artubss/SKILLS-CLAUDE-CODE112026년 5월 17일 업데이트

artubss의 스킬 모두 보기

이 스킬의 문제 신고