From b097b50613f1f25143e6721d71a187a4156650f2 Mon Sep 17 00:00:00 2001 From: Artur Laksberg <1875734+arturl@users.noreply.github.com> Date: Thu, 26 Dec 2024 19:00:54 -0800 Subject: [PATCH] Fix formula, add flow diagram --- content/blog/codegen-learnings/flow.png | Bin 0 -> 64244 bytes content/blog/codegen-learnings/flow.tldr | 267 +++++++++++++++++++++++ content/blog/codegen-learnings/index.md | 39 ++-- 3 files changed, 285 insertions(+), 21 deletions(-) create mode 100644 content/blog/codegen-learnings/flow.png create mode 100644 content/blog/codegen-learnings/flow.tldr diff --git a/content/blog/codegen-learnings/flow.png b/content/blog/codegen-learnings/flow.png new file mode 100644 index 0000000000000000000000000000000000000000..da41736787367ac469f77b609046695d8ff79a3e GIT binary patch literal 64244 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℘s&% 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

Xrc2cPb#xvhf_QRf7VZY5C{u4 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 aRIuSG`3RcqQs@=%=eelNvx28@JpTugDqHse literal 0 HcmV?d00001 diff --git a/content/blog/codegen-learnings/flow.tldr b/content/blog/codegen-learnings/flow.tldr new file mode 100644 index 000000000000..a0bbc8ded9c9 --- /dev/null +++ b/content/blog/codegen-learnings/flow.tldr @@ -0,0 +1,267 @@ +{ + "tldrawFileFormatVersion": 1, + "schema": { + "schemaVersion": 2, + "sequences": { + "com.tldraw.store": 4, + "com.tldraw.asset": 1, + "com.tldraw.camera": 1, + "com.tldraw.document": 2, + "com.tldraw.instance": 25, + "com.tldraw.instance_page_state": 5, + "com.tldraw.page": 1, + "com.tldraw.instance_presence": 6, + "com.tldraw.pointer": 1, + "com.tldraw.shape": 4, + "com.tldraw.asset.bookmark": 2, + "com.tldraw.asset.image": 5, + "com.tldraw.asset.video": 5, + "com.tldraw.shape.group": 0, + "com.tldraw.shape.text": 2, + "com.tldraw.shape.bookmark": 2, + "com.tldraw.shape.draw": 2, + "com.tldraw.shape.geo": 9, + "com.tldraw.shape.note": 8, + "com.tldraw.shape.line": 5, + "com.tldraw.shape.frame": 0, + "com.tldraw.shape.arrow": 5, + "com.tldraw.shape.highlight": 1, + "com.tldraw.shape.embed": 4, + "com.tldraw.shape.image": 4, + "com.tldraw.shape.video": 2, + "com.tldraw.binding.arrow": 0 + } + }, + "records": [ + { + "gridSize": 10, + "name": "", + "meta": {}, + "id": "document:document", + "typeName": "document" + }, + { + "meta": {}, + "id": "page:page", + "name": "Page 1", + "index": "a1", + "typeName": "page" + }, + { + "id": "pointer:pointer", + "typeName": "pointer", + "x": 357.43359375, + "y": 132.7734375, + "lastActivityTimestamp": 1735267617634, + "meta": {} + }, + { + "followingUserId": null, + "opacityForNextShape": 1, + "stylesForNextShape": { + "tldraw:size": "s", + "tldraw:font": "sans", + "tldraw:geo": "arrow-right" + }, + "brush": null, + "scribbles": [], + "cursor": { + "type": "cross", + "rotation": 0 + }, + "isFocusMode": false, + "exportBackground": true, + "isDebugMode": false, + "isToolLocked": false, + "screenBounds": { + "x": 0, + "y": 0, + "w": 1128, + "h": 978 + }, + "insets": [ + false, + false, + true, + false + ], + "zoomBrush": null, + "isGridMode": false, + "isPenMode": false, + "chatMessage": "", + "isChatting": false, + "highlightedUserIds": [], + "isFocused": true, + "devicePixelRatio": 2, + "isCoarsePointer": false, + "isHoveringCanvas": true, + "openMenus": [], + "isChangingStyle": false, + "isReadonly": false, + "meta": {}, + "duplicateProps": null, + "id": "instance:instance", + "currentPageId": "page:page", + "typeName": "instance" + }, + { + "editingShapeId": null, + "croppingShapeId": null, + "selectedShapeIds": [ + "shape:0vPmbhCIhdgPr7gYnOxm9" + ], + "hoveredShapeId": "shape:0vPmbhCIhdgPr7gYnOxm9", + "erasingShapeIds": [], + "hintingShapeIds": [], + "focusedGroupId": null, + "meta": {}, + "id": "instance_page_state:page:page", + "pageId": "page:page", + "typeName": "instance_page_state" + }, + { + "x": 49.0078125, + "y": 97.7109375, + "z": 1, + "meta": {}, + "id": "camera:page:page", + "typeName": "camera" + }, + { + "x": 40.28125, + "y": 79.8203125, + "rotation": 0, + "isLocked": false, + "opacity": 1, + "meta": {}, + "id": "shape:BJfJwAyLKVoUOGaixU2Xf", + "type": "text", + "props": { + "color": "black", + "size": "s", + "w": 252.359375, + "text": "User query:\n\n\"Generate code for S3 Bucket\"", + "font": "sans", + "textAlign": "start", + "autoSize": true, + "scale": 1 + }, + "parentId": "page:page", + "index": "a1", + "typeName": "shape" + }, + { + "x": 374.58203125, + "y": 54.3125, + "rotation": 0, + "isLocked": false, + "opacity": 1, + "meta": {}, + "id": "shape:z2gtvIBdf6_eCX2gzQ2L1", + "type": "text", + "props": { + "color": "black", + "size": "s", + "w": 310.2265625, + "text": "Search terms:\n\n\"AWS S3 bucket\",\n\"Pulumi AWS S3\",\n\"create S3 bucket Pulumi TypeScript\"", + "font": "sans", + "textAlign": "start", + "autoSize": true, + "scale": 1 + }, + "parentId": "page:page", + "index": "a22v7", + "typeName": "shape" + }, + { + "x": 25.6796875, + "y": 58.140625, + "rotation": 0, + "isLocked": false, + "opacity": 1, + "meta": {}, + "id": "shape:PGJKCoOonmat14xrifIp0", + "type": "geo", + "props": { + "w": 286.8671875, + "h": 132.9296875, + "geo": "rectangle", + "color": "black", + "labelColor": "black", + "fill": "none", + "dash": "draw", + "size": "s", + "font": "sans", + "text": "", + "align": "middle", + "verticalAlign": "middle", + "growY": 0, + "url": "", + "scale": 1 + }, + "parentId": "page:page", + "index": "a39Cr", + "typeName": "shape" + }, + { + "x": 362.58203125, + "y": 35.85546875000003, + "rotation": 0, + "isLocked": false, + "opacity": 1, + "meta": {}, + "id": "shape:hrkCX2QL0NyXDz_xl3n_i", + "type": "geo", + "props": { + "w": 342.9609375, + "h": 172.41015624999997, + "geo": "rectangle", + "color": "black", + "labelColor": "black", + "fill": "none", + "dash": "draw", + "size": "s", + "font": "sans", + "text": "", + "align": "middle", + "verticalAlign": "middle", + "growY": 0, + "url": "", + "scale": 1 + }, + "parentId": "page:page", + "index": "a40nT", + "typeName": "shape" + }, + { + "x": 322.2734375, + "y": 100.125, + "rotation": 0, + "isLocked": false, + "opacity": 1, + "meta": {}, + "id": "shape:0vPmbhCIhdgPr7gYnOxm9", + "type": "geo", + "props": { + "w": 35.16015625, + "h": 32.6484375, + "geo": "arrow-right", + "color": "black", + "labelColor": "black", + "fill": "none", + "dash": "draw", + "size": "s", + "font": "sans", + "text": "", + "align": "middle", + "verticalAlign": "middle", + "growY": 0, + "url": "", + "scale": 1 + }, + "parentId": "page:page", + "index": "a55Ml", + "typeName": "shape" + } + ] +} \ No newline at end of file diff --git a/content/blog/codegen-learnings/index.md b/content/blog/codegen-learnings/index.md index 9084b265e325..bbaccda18cb0 100644 --- a/content/blog/codegen-learnings/index.md +++ b/content/blog/codegen-learnings/index.md @@ -82,32 +82,16 @@ Because you were looking for the word "pie", you also retrieved a recipe for a S Now let's formalize this a bit. Recall measures the ratio of the relevant documents retrieved to the total number of relevant docuemtns in RAG: -TODO - -old: - -$$Recall = \frac{N(Retrieved\_documents \cap Relevant\_documents)}{N(Relevant\_documents)}$$ - -fixed1: - -$$Recall = \frac{N(\text{Retrieved\_documents} \cap \text{Relevant\_documents})}{N(\text{Relevant\_documents})}$$ - -fixed2: - -$$Recall = \frac{N(Retrieved\text{\_}documents \cap Relevant\text{\_}documents)}{N(Relevant\text{\_}documents)}$$ - -alternative - -$$Recall = \frac{N(\text{RetrievedDocuments} \cap \text{RelevantDocuments})}{N(\text{RelevantDocuments})}$$ +$$Recall = \frac{N(Retrieved \cap Relevant)}{N(Relevant)}$$ Where -- $N(Retrieved\_documents \cap Relevant\_documents)$ is the number of documents that are both retrieved and relevant. -- $N(Relevant\_documents)$ is the total number of relevant documents in the database. +- $N(Retrieved \cap Relevant)$ is the number of documents that are both retrieved and relevant. +- $N(Relevant)$ is the total number of relevant documents in the database. Good recall means that many documents relevant to the query were retrieved. -$$Precision = \frac{N(Retrieved\_documents \cap Relevant\_documents)}{N(Retrieved\_documents)}$$ +$$Precision = \frac{N(Retrieved \cap Relevant)}{N(Retrieved)}$$ Where $N(Retrieved\_documents)$ is the total number of documents that were retrieved. @@ -122,12 +106,25 @@ Precision and recall are essential in understanding the information retrieval qu Fortunately, other metrics that often can effectively estimate retrieval quality have been developed. We have found a metric that can predict, with some degree of accuracy, whether the generated code will successfully compile. For this metric, we compare the _tokens_ present in the prompted produced by the LLM with the number of tokens present in the actually generated code. (By token here we understand a compiler token - an identifier such as the name of a class, method or a field and not a traditional LLM token concept), Intuitively, if a token present in the prompt also appears in the generated program, we can assume that the token effectively contributed to the generated program. Tokens in the generated program that were not part of the prompt are not necessarily wrong but they are less trusted (they can come from the LLM built-in knowledge or were, ahem, hallucinated) -$$prompt \ coverage = \frac{N(Tokens\_in\_prompt \cap Tokens\_in\_code)}{N(Tokens\_in\_code)} $$ +1: +$$prompt \ coverage = \frac{N(Tokens\_in\_prompt \cap Tokens\_in\_code)}{N(Tokens\_in\_code)}$$ + +2: +$$prompt \ coverage = \frac{N(\text{Tokens\_in\_prompt} \cap \text{Tokens\_in\_code})}{N(\text{Tokens\_in\_code})}$$ Prompt coverage is a metric we can observe in production, and it's one of several metrics we use when updating providers to ensure we haven't regressed the quality of the RAG. + + + +

+ Flow of blah +
+ + +