mirror of
https://github.com/langchain-ai/langgraph.git
synced 2026-07-19 14:33:37 -04:00
693 lines
108 KiB
Plaintext
693 lines
108 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"attachments": {
|
|
"a7336696-1044-4f8a-b4c6-79d3eb619cd7.png": {
|
|
"image/png": "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eGlmOlBpeGVsWERpbWVuc2lvbj4xMDkxPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+U2NyZWVuc2hvdDwvZXhpZjpVc2VyQ29tbWVudD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Ct2duFgAAEAASURBVHgB7J0HfFRl1safmfTeQxqhdykK0lRUVBQVyyq6rmV17X6fq9g/14a6rgXX3hV7AawoVkQURQQV6b0kISSQ3idt5jvnDXeYhAABJphknvfHMLe+977/O7/Jneee8xybSxrYSIAESIAESIAESIAESIAESIAESIAESMBHCNh9ZJwcJgmQAAmQAAmQAAmQAAmQAAmQAAmQAAkYAhRD+EEgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIAES8CkCFEN86nJzsCRAAiRAAiRAAiRAAiRAAiRAAiRAAhRD+BkgARIgARIgARIgARIgARIgARIgARLwKQIUQ3zqcnOwJEACJEACJEACJEACJEACJEACJEACFEP4GSABEiABEiABEiABEiABEiABEiABEvApAhRDfOpyc7AkQAIkQAIkQAIkQAIkQAIkQAIkQAIUQ/gZIAESIAESIAESIAESIAESIAESIIFmCLhcLmzZsgVz587Fxx9/jBUrVsDhcDSz5f4tuu+++9C/f3988803+9cB99pvAv77vSd3JAESIAESIAESIAESIAESIAESIIEOSmDr1q2YNGkSFixY0GiEcXFxePXVVzF48OBGy/dnpqKiAvqqqanZn925zwEQoBhyAPC4KwmQAAmQAAmQAAmQAAmQAAmQQMcjUFRUhOOPP94IFd27d8fEiRMRHR2Nzz//HPPmzcMnn3ziFTGk45FrPyOiGNJ+rhXPlARIgARIgARIgARIgARIgARI4CAQeOaZZ4wQMnLkSEydOhVhYWHmqOeccw4+++wznHbaaY3OoqqqCmvWrEFeXh66detmXn5+fo220ZmCggKTahMYGIhhw4btst5a4HQ6sXnzZmzYsAGxsbHo06cPwsPDrdV89wIBiiFegMguSIAESIAESIAESIAESIAESIAEOgYBFSJeeuklM5i77rrLLYToAn9/f5xxxhmNBrpw4UJcddVVRuiwVowePRpPPvkkEhISrEX44IMPcMMNN7jn09PTMXToUPe8NbFt2zb885//bJSeo2LMU089heOOO87ajO8HSIAGqgcIkLuTAAmQAAmQAAmQAAmQAAmQAAl0HAIa3aFNvUEGDBiwx4GVlZXh4osvNkJIcnIyzj33XLP9/Pnzcffdd7v3zczMdAshl112mZmura3FRx995N7GmrjtttuMEKLHv/zyy6HCivqK/OMf/0B+fr61Gd8PkAAjQw4QIHcnARIgARIgARIgARIgARIgARLoOATUOFWbprvsrc2cOdPtK/Lll18iKCgIl1xyCU466STMmjUL2ldKSoqJCtG+NL3mzjvvNN2qiDJo0KBGh1i3bh3mzJljolF+/PFHhIaGmvW33HILpk2bhq+++grnn39+o304s38EKIbsHzfuRQIkQAIkQAIkQAIkQAIkQAIk0AEJqJ+HNo3G2FvbuHGj2eSoo44yQojO9OvXz0SVqD9IRkaGEUM2bdpkthsxYoR51/+ioqJM1IdGkVjN2m7gwIFYunSptdj0pzMaYcLmHQIUQ7zDkb2QAAmQAAmQAAmQAAmQAAmQAAl0AAIayaFt1apVqK+vR3NGqNYwVfDQ1qNHD2uRee/Vq5dJnSksLDTzVupN02iTLl26wFMMKS4uNttrOV8r5caz48rKSs9ZTh8AAYohBwCPu5IACZAACZAACZAACZAACZAACXQsAjExMSZNRSNDNNWlaeUYz9GqT4g2zyiOuro6t/lpUlKSWW8ZqWp1mCOOOMIsa+6/tLQ0s1j9Qh5//HHY7Y1tPq3jNbcvl+0bgcZk921fbk0CJEACJEACJEACJEACJEACJEACHY7ApEmTzJjuueceaLUYz6Zih5qfatOUGG3fffedO4Xliy++MMv0PysSRCNFtH377beorq420zU1NZg7d66Ztv7TErraNOJE/UZGjRqFI4880v1qGoFi7cf3fSdgc0nb9924BwmQAAmQAAmQAAmQAAmQAAmQAAl0TAIOh8OU0NVUGW2DBw82qTBbtmwx4siUKVMwceJEqDBy7LHHuoWQ7t27w/IR0Uowd9xxh9l/+/btOPzww820Rn2MGTPGRI/k5OSYZc8++yxOOeUUM61lfe+//34zrSV1tX/1MVE/kRkzZiAgIMCs438HRoCRIQfGj3uTAAmQAAmQAAmQAAmQAAmQAAl0MALBwcH49NNPTQnc9PR0LFmyBB9++KERQlQYsXxE/P39MX36dKiBqjZLCLn66qtx6623uqkkJiaa7TTNRaM+tKRuz549ods1bVp696mnnoIeV1N1PvvsM3PsxYsXIzc3t+nmnN9PAowM2U9w3I0ESIAESIAESIAESIAESIAESMA3CFRVVaGoqAgqaqgA0lzTaBJrG0ssaW47FUNUbNGoD02ZcTqdCAkJaW5T6HHz8/ON+BIfH28iRJrdkAv3mQDFkH1Gxh1IgARIgARIgARIgARIgARIgARIgATaMwGmybTnq8dzJwESIAESIAESIAESIAESIAESIAES2GcCFEP2GRl3IAESIAESIAESIAESIAESIAESIAESaM8EKIa056vHcycBEiABEiABEiABEiABEiABEiABEthnAhRD9hkZdyABEiABEiABEiABEiABEiABEiABEmjPBCiGtOerx3MnARIgARIgARIgARIgARIgARIgARLYZwIUQ/YZGXcgARIgARIgARIgARIgARIgARIggdYnUFdXh8rKytY/kA8egWKID150DpkESIAESIAESIAESIAESIAEOiKBFStWYNasWea1Zs0aqJiwr23OnDno379/o9eCBQv2tZsD3r6iogLDhw9Hv379sG7dugPujx00JuDfeJZzJEACJEACJEACJEACJEACJEACJNC+CJSWluLyyy9HU9HikEMOweOPP45evXq1eEBRUVE4/PDDzfaLFi2CihL7I6o0d8ALLrgAK1euxMcff4z09PTmNnEv27ZtGwoKCsz8xo0b92kM7k44sVsCFEN2i4YrSIAESIAESIAESIAESIAESIAE2gOBRx55xAghKjCcc845UEHj/fffx5IlS/DWW29h8uTJLR7G0KFD8frrr5vtr7rqKnzxxRct3ndvG+bn5xuBoyXiSvfu3fHcc89BhZ7jjjtub11z/T4SoBiyj8C4OQmQAAmQAAmQAAmQAAmQAAmQQNsi8OOPP5oTuu+++3DMMceY6b/97W/46quvcNJJJ+1yslu2bMHatWsRFhaGvn37GvFkl41asEDFjby8PHTq1AmxsbFmD6fTCU3R8ff3N9Ec9fX15li6UqNMtK1fvx7V1dVmWv/r2rUrQkJCzLyeW1lZmZnu1q2bedc+d9f2NpatW7eipKQEPXr0gMPhwO+//47Q0FAMGjQIwcHBu+u2wy+nGNLhLzEHSAIkQAIkQAIkQAIkQAIkQAIdm4AKEZpK4ikwqBhxyimnNBq4igH33HMP3n333UbL//vf/+Kss85qtKwlM++88w4effRR3HXXXbj00kvNLlVVVUaAUaFFU2JUiGgqyGhKj2fTKBYrNefOO++E+pZ4tm+++Qa9e/f2XGSEjZaM5eGHH8ZHH32Ee++915yn1YlGnujy6Ohoa5FPvVMM8anLzcGSAAmQAAmQAAmQAAmQAAmQQMcjcPrpp+PXX3/FFVdcgZtuugkXXXRRs9EeU6dOdQshp556KjZv3ozly5fjhhtuMIapalbq7aaiiIol2p555hmTJnP11VcjISHBfShP/xBN8xk5cqRZ98ILL7h9Q9wb75jY17E89NBDGDx4sDFl/fDDD4149O233+6XCNT0XNrjPKvJtMerxnMmARIgARIgARIgARIgARIgARJwE1ABwYrMmDJlikkBeeWVV9A0veTpp582+6ipqgoTn376qTt6RL1FWqMFBQWZc9PzS0xMNIewzleX6UvTbKw2fvx4XHnlleaV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tBomQIAAAQIECBAgQIAAAQIE8iigGJLHrIiJAAECBAgQIECAAAECBAgQyExAMSQzWg0TIECAAAECBAgQIECAAAECeRRQDMljVsREgAABAgQIECBAgAABAgQIZCagGJIZrYYJECBAgAABAgQIECBAgACBPAoohuQxK2IiQIAAAQIECBAgQIAAAQIEMhNQDMmMVsMECBAgQIAAAQIECBAgQIBAHgUUQ/KYFTERIECAAAECBAgQIECAAAECmQkohmRGq2ECBAgQIECAAAECBAgQIEAgjwKKIXnMipgIECBAgAABAgQIECBAgACBzAQUQzKj1TABAgQIECBAgAABAgQIECCQRwHFkDxmRUwECBAgQIAAAQIECBAgQIBAZgKKIZnRapgAAQIECBAgQIAAAQIECBDIo4BiSB6zIiYCBAgQIECAAAECBAgQIEAgMwHFkMxoNUyAAAECBAgQIECAAAECBAjkUUAxJI9ZERMBAgQIECBAgAABAgQIECCQmYBiSGa0GiZAgAABAgQIECBAgAABAgTyKKAYksesiIkAAQIECBAgQIAAAQIECBDITEAxJDNaDRMgQIAAAQIECBAgQIAAAQJ5FFAMyWNWxESAAAECBAgQIECAAAECBAhkJqAYkhmthgkQIECAAAECBAgQIECAAIE8CiiG5DErYiJAgAABAgQIECBAgAABAgQyE1AMyYxWwwQIECBAgAABAgQIECBAgEAeBRRD8pgVMREgQIAAAQIECBAgQIAAAQKZCSiGZEarYQIECBAgQIAAAQIECBAgQCCPAoohecyKmAgQIECAAAECBAgQIECAAIHMBBRDMqPVMAECBAgQIECAAAECBAgQIJBHAcWQPGZFTAQIECBAgAABAgQIECBAgEBmAoohmdFqmAABAgQIECBAgAABAgQIEMijgGJIHrMiJgIECBAgQIAAAQIECBAgQCAzAcWQzGg1TIAAAQIECBAgQIAAAQIECORRQDEkj1kREwECBAgQIECAAAECBAgQIJCZgGJIZrQaJkCAAAECBAgQIECAAAECBPIooBiSx6yIiQABAgQIECBAgAABAgQIEMhMQDEkM1oNEyBAgAABAgQIECBAgAABAnkUUAzJY1bERIAAAQIECBAgQIAAAQIECGQm8P8B4AYqZi/BhN8AAAAASUVORK5CYII="
|
|
}
|
|
},
|
|
"cell_type": "markdown",
|
|
"id": "16dc0e41-80bd-4453-b421-dcf315741bf4",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Code generation with flow\n",
|
|
"\n",
|
|
"AlphaCodium presented an approach for code generation that uses control flow.\n",
|
|
"\n",
|
|
"Main idea: [construct an answer to a coding question iteratively.](https://x.com/karpathy/status/1748043513156272416?s=20). \n",
|
|
"\n",
|
|
"[AlphaCodium](https://github.com/Codium-ai/AlphaCodium) iteravely tests and improves an answer on public and AI-generated tests for a particular question. \n",
|
|
"\n",
|
|
"We will implement some of these ideas from scratch using [LangGraph](https://python.langchain.com/docs/langgraph):\n",
|
|
"\n",
|
|
"1. We start with a set of documentation specified by a user\n",
|
|
"2. We use a long context LLM to ingest it, and answer a question based upon it \n",
|
|
"3. We perform two unit tests: Check imports and code execution\n",
|
|
"\n",
|
|
""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "e3900420",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
" ! pip install -U langchain_community langchain-openai langchain-anthropic langchain langgraph bs4"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "38330223-d8c8-4156-82b6-93e63343bc01",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Docs\n",
|
|
"\n",
|
|
"Load [LangChain Expression Language](https://python.langchain.com/docs/expression_language/) (LCEL) docs as an example."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "c2eb35d1-4990-47dc-a5c4-208bae588a82",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from bs4 import BeautifulSoup as Soup\n",
|
|
"from langchain_community.document_loaders.recursive_url_loader import RecursiveUrlLoader\n",
|
|
"\n",
|
|
"# LCEL docs\n",
|
|
"url = \"https://python.langchain.com/docs/expression_language/\"\n",
|
|
"loader = RecursiveUrlLoader(\n",
|
|
" url=url, max_depth=20, extractor=lambda x: Soup(x, \"html.parser\").text\n",
|
|
")\n",
|
|
"docs = loader.load()\n",
|
|
"\n",
|
|
"# Sort the list based on the URLs and get the text\n",
|
|
"d_sorted = sorted(docs, key=lambda x: x.metadata[\"source\"])\n",
|
|
"d_reversed = list(reversed(d_sorted))\n",
|
|
"concatenated_content = \"\\n\\n\\n --- \\n\\n\\n\".join(\n",
|
|
" [doc.page_content for doc in d_reversed]\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "662d4ff4-1709-412f-bfed-5eb2b8d3d3dc",
|
|
"metadata": {},
|
|
"source": [
|
|
"## LLMs\n",
|
|
"\n",
|
|
"### Code solution\n",
|
|
"\n",
|
|
"Try OpenAI and [Claude3](https://docs.anthropic.com/claude/docs/models-overview) with function calling."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "3ba3df70-f6b4-4ea5-a210-e10944960bc6",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from langchain_openai import ChatOpenAI\n",
|
|
"from langchain_core.prompts import ChatPromptTemplate\n",
|
|
"from langchain_core.pydantic_v1 import BaseModel, Field\n",
|
|
"\n",
|
|
"### OpenAI\n",
|
|
"\n",
|
|
"# Grader prompt \n",
|
|
"code_gen_prompt = ChatPromptTemplate.from_messages(\n",
|
|
" [(\"system\",\"\"\"You are a coding assistant with expertise in LCEL, LangChain expression language. \\n \n",
|
|
" Here is a full set of LCEL documentation: \\n ------- \\n {context} \\n ------- \\n Answer the user \n",
|
|
" question based on the above provided documentation. Ensure any code you provide can be executed \\n \n",
|
|
" with all required imports and variables defined. Structure your answer with a description of the code solution. \\n\n",
|
|
" Then list the imports. And finally list the functioning code block. Here is the user question:\"\"\"),\n",
|
|
" (\"placeholder\", \"{messages}\")]\n",
|
|
")\n",
|
|
"\n",
|
|
"# Data model\n",
|
|
"class code(BaseModel):\n",
|
|
" \"\"\"Code output\"\"\"\n",
|
|
"\n",
|
|
" prefix: str = Field(description=\"Description of the problem and approach\")\n",
|
|
" imports: str = Field(description=\"Code block import statements\")\n",
|
|
" code: str = Field(description=\"Code block not including import statements\")\n",
|
|
" description = \"Schema for code solutions to questions about LCEL.\"\n",
|
|
"\n",
|
|
"expt_llm = \"gpt-4-0125-preview\"\n",
|
|
"llm = ChatOpenAI(temperature=0, model=expt_llm)\n",
|
|
"code_gen_chain = code_gen_prompt | llm.with_structured_output(code)\n",
|
|
"question = \"How do I build a RAG chain in LCEL?\"\n",
|
|
"# solution = code_gen_chain_oai.invoke({\"context\":concatenated_content,\"messages\":[(\"user\",question)]})"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "cd30b67d-96db-4e51-a540-ae23fcc1f878",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from langchain_anthropic import ChatAnthropic\n",
|
|
"from langchain_core.prompts import ChatPromptTemplate\n",
|
|
"from langchain_core.pydantic_v1 import BaseModel, Field\n",
|
|
"\n",
|
|
"### Anthropic\n",
|
|
"\n",
|
|
"# Prompt to enforce tool use\n",
|
|
"code_gen_prompt_claude = ChatPromptTemplate.from_messages(\n",
|
|
" [(\"system\",\"\"\"<instructions> You are a coding assistant with expertise in LCEL, LangChain expression language. \\n \n",
|
|
" Here is the LCEL documentation: \\n ------- \\n {context} \\n ------- \\n Answer the user question based on the \\n \n",
|
|
" above provided documentation. Ensure any code you provide can be executed with all required imports and variables \\n\n",
|
|
" defined. Structure your answer: 1) a prefix describing the code solution, 2) the imports, 3) the functioning code block. \\n\n",
|
|
" Invoke the code tool to structure the output correctly. </instructions> \\n Here is the user question:\"\"\",),\n",
|
|
" (\"placeholder\", \"{messages}\"),])\n",
|
|
"\n",
|
|
"# Data model\n",
|
|
"class code(BaseModel):\n",
|
|
" \"\"\"Code output\"\"\"\n",
|
|
"\n",
|
|
" prefix: str = Field(description=\"Description of the problem and approach\")\n",
|
|
" imports: str = Field(description=\"Code block import statements\")\n",
|
|
" code: str = Field(description=\"Code block not including import statements\")\n",
|
|
" description = \"Schema for code solutions to questions about LCEL.\"\n",
|
|
"\n",
|
|
"\n",
|
|
"# LLM\n",
|
|
"# expt_llm = \"claude-3-haiku-20240307\" \n",
|
|
"expt_llm = \"claude-3-opus-20240229\" \n",
|
|
"llm = ChatAnthropic(\n",
|
|
" model=expt_llm,\n",
|
|
" default_headers={\"anthropic-beta\": \"tools-2024-04-04\"},\n",
|
|
")\n",
|
|
"\n",
|
|
"structured_llm_claude = llm.with_structured_output(code, include_raw=True)\n",
|
|
"\n",
|
|
"# Optional: Check for errors in case tool use is flaky\n",
|
|
"def check_claude_output(tool_output):\n",
|
|
" \"\"\"Check for parse error or failure to call the tool\"\"\"\n",
|
|
"\n",
|
|
" # Error with parsing\n",
|
|
" if tool_output[\"parsing_error\"]:\n",
|
|
" # Report back output and parsing errors\n",
|
|
" print(\"Parsing error!\")\n",
|
|
" raw_output = str(code_output[\"raw\"].content)\n",
|
|
" error = tool_output[\"parsing_error\"]\n",
|
|
" raise ValueError(\n",
|
|
" f\"Error parsing your output! Be sure to invoke the tool. Output: {raw_output}. \\n Parse error: {error}\"\n",
|
|
" )\n",
|
|
"\n",
|
|
" # Tool was not invoked \n",
|
|
" elif not tool_output[\"parsed\"]:\n",
|
|
" print(\"Failed to invoke tool!\")\n",
|
|
" raise ValueError(\n",
|
|
" f\"You did not use the provided tool! Be sure to invoke the tool to structure the output.\"\n",
|
|
" )\n",
|
|
" return tool_output\n",
|
|
"\n",
|
|
"# Chain with output check\n",
|
|
"code_chain_claude_raw = code_gen_prompt_claude | structured_llm_claude | check_claude_output\n",
|
|
"\n",
|
|
"def insert_errors(inputs):\n",
|
|
" \"\"\"Insert errors for tool parsing in the messages\"\"\"\n",
|
|
" \n",
|
|
" # Get errors\n",
|
|
" error = inputs[\"error\"]\n",
|
|
" messages = inputs[\"messages\"]\n",
|
|
" messages += [\n",
|
|
" (\n",
|
|
" \"assistant\",\n",
|
|
" f\"Retry. You are required to fix the parsing errors: {error} \\n\\n You must invoke the provided tool.\",\n",
|
|
" )\n",
|
|
" ]\n",
|
|
" return {\n",
|
|
" \"messages\": messages,\n",
|
|
" \"context\": inputs[\"context\"],\n",
|
|
" }\n",
|
|
"\n",
|
|
"# This will be run as a fallback chain\n",
|
|
"fallback_chain = insert_errors | code_chain_claude_raw\n",
|
|
"N = 3 # Max re-tries\n",
|
|
"code_gen_chain_re_try = code_chain_claude_raw.with_fallbacks(fallbacks=[fallback_chain] * N, exception_key=\"error\")\n",
|
|
"\n",
|
|
"def parse_output(solution):\n",
|
|
" \"\"\"When we add 'include_raw=True' to structured output, \n",
|
|
" it will return a dict w 'raw', 'parsed', 'parsing_error'. \"\"\"\n",
|
|
" \n",
|
|
" return solution['parsed']\n",
|
|
"\n",
|
|
"# Wtih re-try to correct for failure to invoke tool\n",
|
|
"# TODO: Annoying errors w/ \"user\" vs \"assistant\" \n",
|
|
"# Roles must alternate between \"user\" and \"assistant\", but found multiple \"user\" roles in a row\n",
|
|
"code_gen_chain = code_gen_chain_re_try | parse_output\n",
|
|
"\n",
|
|
"# No re-try\n",
|
|
"code_gen_chain = code_gen_prompt_claude | structured_llm_claude | parse_output"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "9f14750f-dddc-485b-ba29-5392cdf4ba43",
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Test\n",
|
|
"question = \"How do I build a RAG chain in LCEL?\"\n",
|
|
"solution = code_gen_chain.invoke({\"context\":concatenated_content,\"messages\":[(\"user\",question)]})\n",
|
|
"solution"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "131f2055-2f64-4d19-a3d1-2d3cb8b42894",
|
|
"metadata": {},
|
|
"source": [
|
|
"## State \n",
|
|
"\n",
|
|
"Our state is a dict that will contain keys (errors, question, code generation) relevant to code generation."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "c185f1a2-e943-4bed-b833-4243c9c64092",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from typing import Dict, TypedDict, List\n",
|
|
"\n",
|
|
"class GraphState(TypedDict):\n",
|
|
" \"\"\"\n",
|
|
" Represents the state of our graph.\n",
|
|
"\n",
|
|
" Attributes:\n",
|
|
" error : Binary flag for control flow to indicate whether test error was tripped\n",
|
|
" messages : With user question, error messages, reasoning\n",
|
|
" generation : Code solution\n",
|
|
" iterations : Number of tries \n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" error : str\n",
|
|
" messages : List\n",
|
|
" generation : str\n",
|
|
" iterations : int"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "64454465-26a3-40de-ad85-bcf59a2c3086",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Graph \n",
|
|
"\n",
|
|
"Our graph lays out the logical flow shown in the figure above."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "b70e8301-63ae-4f7e-ad8f-c9a052fe3566",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from operator import itemgetter\n",
|
|
"from langchain.prompts import PromptTemplate\n",
|
|
"from langchain_core.pydantic_v1 import BaseModel, Field\n",
|
|
"from langchain_core.runnables import RunnablePassthrough\n",
|
|
"\n",
|
|
"### Parameter\n",
|
|
"\n",
|
|
"# Max tries\n",
|
|
"max_iterations = 3\n",
|
|
"# Reflect\n",
|
|
"# flag = 'reflect'\n",
|
|
"flag = 'do not reflect'\n",
|
|
" \n",
|
|
"### Nodes\n",
|
|
"\n",
|
|
"def generate(state: GraphState):\n",
|
|
" \"\"\"\n",
|
|
" Generate a code solution\n",
|
|
"\n",
|
|
" Args:\n",
|
|
" state (dict): The current graph state\n",
|
|
"\n",
|
|
" Returns:\n",
|
|
" state (dict): New key added to state, generation\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" print(\"---GENERATING CODE SOLUTION---\")\n",
|
|
" \n",
|
|
" # State\n",
|
|
" messages = state[\"messages\"]\n",
|
|
" iterations = state[\"iterations\"]\n",
|
|
" error = state[\"error\"]\n",
|
|
"\n",
|
|
" # We have been routed back to generation with an error\n",
|
|
" if error == \"yes\":\n",
|
|
" messages += [(\"user\",\"Now, try again. Invoke the code tool to structure the output with a prefix, imports, and code block:\")]\n",
|
|
" \n",
|
|
" # Solution\n",
|
|
" code_solution = code_gen_chain.invoke({\"context\": concatenated_content, \"messages\" : messages})\n",
|
|
" messages += [(\"assistant\",f\"{code_solution.prefix} \\n Imports: {code_solution.imports} \\n Code: {code_solution.code}\")]\n",
|
|
" \n",
|
|
" # Increment\n",
|
|
" iterations = iterations + 1\n",
|
|
" return {\"generation\": code_solution, \"messages\": messages, \"iterations\": iterations}\n",
|
|
"\n",
|
|
"def code_check(state: GraphState):\n",
|
|
" \"\"\"\n",
|
|
" Check code\n",
|
|
"\n",
|
|
" Args:\n",
|
|
" state (dict): The current graph state\n",
|
|
"\n",
|
|
" Returns:\n",
|
|
" state (dict): New key added to state, error\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" print(\"---CHECKING CODE---\")\n",
|
|
" \n",
|
|
" # State\n",
|
|
" messages = state[\"messages\"]\n",
|
|
" code_solution = state[\"generation\"]\n",
|
|
" iterations = state[\"iterations\"]\n",
|
|
"\n",
|
|
" # Get solution components\n",
|
|
" prefix = code_solution.prefix\n",
|
|
" imports = code_solution.imports\n",
|
|
" code = code_solution.code\n",
|
|
"\n",
|
|
" # Check imports\n",
|
|
" try:\n",
|
|
" exec(imports)\n",
|
|
" except Exception as e:\n",
|
|
" print(\"---CODE IMPORT CHECK: FAILED---\")\n",
|
|
" error_message = [(\"user\", f\"Your solution failed the import test: {e}\")]\n",
|
|
" messages += error_message\n",
|
|
" return {\"generation\": code_solution, \"messages\": messages, \"iterations\": iterations, \"error\": \"yes\"}\n",
|
|
" \n",
|
|
" # Check execution\n",
|
|
" try:\n",
|
|
" exec(imports + \"\\n\" + code)\n",
|
|
" except Exception as e:\n",
|
|
" print(\"---CODE BLOCK CHECK: FAILED---\")\n",
|
|
" error_message = [(\"user\", f\"Your solution failed the code execution test: {e}\")]\n",
|
|
" messages += error_message\n",
|
|
" return {\"generation\": code_solution, \"messages\": messages, \"iterations\": iterations, \"error\": \"yes\"}\n",
|
|
" \n",
|
|
" # No errors\n",
|
|
" print(\"---NO CODE TEST FAILURES---\")\n",
|
|
" return {\"generation\": code_solution, \"messages\": messages, \"iterations\": iterations, \"error\": \"no\"}\n",
|
|
"\n",
|
|
"def reflect(state: GraphState):\n",
|
|
" \"\"\"\n",
|
|
" Reflect on errors\n",
|
|
"\n",
|
|
" Args:\n",
|
|
" state (dict): The current graph state\n",
|
|
"\n",
|
|
" Returns:\n",
|
|
" state (dict): New key added to state, generation\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" print(\"---GENERATING CODE SOLUTION---\")\n",
|
|
" \n",
|
|
" # State\n",
|
|
" messages = state[\"messages\"]\n",
|
|
" iterations = state[\"iterations\"]\n",
|
|
" code_solution = state[\"generation\"]\n",
|
|
"\n",
|
|
" # Prompt reflection\n",
|
|
" reflection_message = [(\"user\", \"\"\"You tried to solve this problem and failed a unit test. Reflect on this failure\n",
|
|
" given the provided documentation. Write a few key suggestions based on the \n",
|
|
" documentation to avoid making this mistake again.\"\"\")]\n",
|
|
" \n",
|
|
" # Add reflection\n",
|
|
" reflections = code_gen_chain.invoke({\"context\" : concatenated_content, \"messages\" : messages})\n",
|
|
" messages += [(\"assistant\" , f\"Here are reflections on the error: {reflections}\")]\n",
|
|
" return {\"generation\": code_solution, \"messages\": messages, \"iterations\": iterations}\n",
|
|
"\n",
|
|
"### Edges\n",
|
|
"\n",
|
|
"def decide_to_finish(state: GraphState):\n",
|
|
" \"\"\"\n",
|
|
" Determines whether to finish.\n",
|
|
"\n",
|
|
" Args:\n",
|
|
" state (dict): The current graph state\n",
|
|
"\n",
|
|
" Returns:\n",
|
|
" str: Next node to call\n",
|
|
" \"\"\"\n",
|
|
" error = state[\"error\"]\n",
|
|
" iterations = state[\"iterations\"]\n",
|
|
"\n",
|
|
" if error == \"no\" or iterations == max_iterations:\n",
|
|
" print(\"---DECISION: FINISH---\")\n",
|
|
" return \"end\"\n",
|
|
" else:\n",
|
|
" print(\"---DECISION: RE-TRY SOLUTION---\")\n",
|
|
" if flag == 'reflect':\n",
|
|
" return \"reflect\"\n",
|
|
" else:\n",
|
|
" return \"generate\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "f66b4e00-4731-42c8-bc38-72dd0ff7c92c",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from langgraph.graph import END, StateGraph\n",
|
|
"\n",
|
|
"workflow = StateGraph(GraphState)\n",
|
|
"\n",
|
|
"# Define the nodes\n",
|
|
"workflow.add_node(\"generate\", generate) # generation solution\n",
|
|
"workflow.add_node(\"check_code\", code_check) # check code\n",
|
|
"workflow.add_node(\"reflect\", reflect) # reflect\n",
|
|
"\n",
|
|
"# Build graph\n",
|
|
"workflow.set_entry_point(\"generate\")\n",
|
|
"workflow.add_edge(\"generate\", \"check_code\")\n",
|
|
"workflow.add_conditional_edges(\n",
|
|
" \"check_code\",\n",
|
|
" decide_to_finish,\n",
|
|
" {\n",
|
|
" \"end\": END,\n",
|
|
" \"reflect\": \"reflect\",\n",
|
|
" \"generate\": \"generate\",\n",
|
|
" },\n",
|
|
")\n",
|
|
"workflow.add_edge(\"reflect\", \"generate\")\n",
|
|
"app = workflow.compile()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "9bcaafe4-ddcf-4fab-8620-2d9b6c508f98",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"question = \"How can I directly pass a string to a runnable and use it to construct the input needed for my prompt?\"\n",
|
|
"app.invoke({\"messages\":[(\"user\",question)],\"iterations\":0})"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "744f48a5-9ad3-4342-899f-7dd4266a9a15",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Eval"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "89852874-b538-4c8d-a4c3-1d68302db492",
|
|
"metadata": {},
|
|
"source": [
|
|
"[Here](https://smith.langchain.com/public/326674a6-62bd-462d-88ae-eea49d503f9d/d) is a public dataset of LCEL questions. \n",
|
|
"\n",
|
|
"I saved this as `test-LCEL-code-gen`.\n",
|
|
"\n",
|
|
"You can also find the csv [here](https://github.com/langchain-ai/lcel-teacher/blob/main/eval/eval.csv)."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "678e8954-56b5-4cc6-be26-f7f2a060b242",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import langsmith\n",
|
|
"client = langsmith.Client()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "ef7cf662-7a6f-4dee-965c-6309d4045feb",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Clone the dataset to your tenant to use it\n",
|
|
"public_dataset = (\"https://smith.langchain.com/public/326674a6-62bd-462d-88ae-eea49d503f9d/d\")\n",
|
|
"client.clone_public_dataset(public_dataset)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "9d171396-022b-47ec-a741-c782aff9fdae",
|
|
"metadata": {},
|
|
"source": [
|
|
"Custom evals."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "455a34ea-52cb-4ae5-9f4a-7e4a08cd0c09",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from langsmith.schemas import Example, Run\n",
|
|
"\n",
|
|
"def check_import(run: Run, example: Example) -> dict: \n",
|
|
" imports = run.outputs.get(\"imports\")\n",
|
|
" try:\n",
|
|
" exec(imports)\n",
|
|
" return {\"key\": \"import_check\" , \"score\": 1} \n",
|
|
" except:\n",
|
|
" return {\"key\": \"import_check\" , \"score\": 0} \n",
|
|
"\n",
|
|
"def check_execution(run: Run, example: Example) -> dict: \n",
|
|
" imports = run.outputs.get(\"imports\")\n",
|
|
" code = run.outputs.get(\"code\")\n",
|
|
" try:\n",
|
|
" exec(imports + \"\\n\" + code)\n",
|
|
" return {\"key\": \"code_execution_check\" , \"score\": 1} \n",
|
|
" except:\n",
|
|
" return {\"key\": \"code_execution_check\" , \"score\": 0} "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c90bf261-0d94-4779-bbde-c76adeefe3d7",
|
|
"metadata": {},
|
|
"source": [
|
|
"Compare LangGraph to Context Stuffing."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"id": "c8fa6bcb-b245-4422-b79a-582cd8a7d7ea",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def predict_base_case(example: dict):\n",
|
|
" \"\"\" Context stuffing \"\"\"\n",
|
|
" solution = code_gen_chain.invoke({\"context\" : concatenated_content, \"messages\" : [(\"user\",example[\"question\"])]})\n",
|
|
" solution_structured = structured_code_formatter.invoke([(\"code\",solution)])\n",
|
|
" return {\"imports\": solution_structured.imports, \"code\": solution_structured.code}\n",
|
|
"\n",
|
|
"def predict_langgraph(example: dict):\n",
|
|
" \"\"\" LangGraph \"\"\"\n",
|
|
" graph = app.invoke({\"messages\":[(\"user\",example[\"question\"])],\"iterations\":0})\n",
|
|
" solution = graph[\"generation\"]\n",
|
|
" return {\"imports\": solution.imports, \"code\": solution.code}"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "d9c57468-97f6-47d6-a5e9-c09b53bfdd83",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from langsmith.evaluation import evaluate\n",
|
|
"\n",
|
|
"# Evaluator\n",
|
|
"code_evalulator = [check_import,check_execution]\n",
|
|
"\n",
|
|
"# Dataset\n",
|
|
"dataset_name = \"test-LCEL-code-gen\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "2dacccf0-d73f-4017-aaf0-9806ffe5bd2c",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Run base case\n",
|
|
"experiment_results_ = evaluate(\n",
|
|
" predict_base_case,\n",
|
|
" data=dataset_name,\n",
|
|
" evaluators=code_evalulator,\n",
|
|
" experiment_prefix=f\"test-without-langgraph-{expt_llm}\", \n",
|
|
" max_concurrency=2,\n",
|
|
" metadata={\n",
|
|
" \"llm\": expt_llm,\n",
|
|
" },\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "71d90f9e-9dad-410c-a709-093d275029ae",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Run with langgraph\n",
|
|
"experiment_results = evaluate(\n",
|
|
" predict_langgraph,\n",
|
|
" data=dataset_name,\n",
|
|
" evaluators=code_evalulator,\n",
|
|
" experiment_prefix=f\"test-with-langgraph-{expt_llm}-{flag}\",\n",
|
|
" max_concurrency=2,\n",
|
|
" metadata={\n",
|
|
" \"llm\": expt_llm,\n",
|
|
" \"feedback\": flag,\n",
|
|
" },\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d69da747-b4ea-455d-9314-60c3d9d30549",
|
|
"metadata": {},
|
|
"source": [
|
|
"`Results:`\n",
|
|
"\n",
|
|
"* `LangGraph outperforms base case`: adding re-try loop improve performance\n",
|
|
"* `Reflection did not help`: reflection prior to re-try regression vs just passing errors directly back to the LLM\n",
|
|
"* `GPT-4 outperforms Claude3`: Claude3 had 3 and 1 run fail due to tool-use error for Opus and Haiku, repspectively\n",
|
|
"\n",
|
|
"https://smith.langchain.com/public/78a3d858-c811-4e46-91cb-0f10ef56260b/d"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "a42333c3-c098-4576-ae2a-0258de64ece2",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.11.8"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|