// Slide 04: @traceable decorator -- the simplest way to instrument any function // Code slide: nested decorator pattern. const ds = require('./design-system'); function createSlide(pres, theme) { const slide = pres.addSlide(); ds.helpers.slideBase(slide, pres, theme); ds.helpers.addHeader(slide, pres, theme, { eyebrow: 'STAGE 5: ECOSYSTEM', section: 'Tracing', title: '@traceable -- декоратор для любой функции', sectionNumber: 5, titleSize: 24, }); ds.helpers.addCodeBlock(slide, pres, theme, { x: 0.5, y: 1.45, w: 9.0, h: 3.1, language: 'python', fontSize: 10, code: [ 'from langsmith import traceable', '', '# Декоратор превращает функцию в traced Run.', '# Все аргументы и return попадают в trace автоматически.', '@traceable(name="retrieve_docs", run_type="retriever")', 'def retrieve(query: str, k: int = 4) -> list[str]:', ' return vector_store.similarity_search(query, k=k)', '', '@traceable(name="generate_answer", run_type="chain")', 'def generate_answer(query: str) -> str:', ' docs = retrieve(query) # nested Run', ' context = "\\n".join(docs)', ' return llm.invoke(f"Q: {query}\\nCtx: {context}")', '', '# Дерево: generate_answer -> retrieve_docs -> ChatModel', 'print(generate_answer("What is LCEL?"))', ].join('\n'), }); // Bottom callout ds.helpers.addCallout(slide, pres, theme, { x: 0.5, y: 4.65, w: 9.0, h: 0.4, kind: 'success', text: 'Вложенные вызовы автоматически становятся дочерними Run-ами в дереве трассировки.', }); ds.helpers.addSourceLine(slide, pres, theme, { source: 'docs.smith.langchain.com Observability > Log traces > @traceable', }); ds.helpers.addPageNumber(slide, pres, theme, 4); } module.exports = { createSlide };