diff --git a/examples/lats/lats.ipynb b/examples/lats/lats.ipynb index 8b5dedec6..858761d38 100644 --- a/examples/lats/lats.ipynb +++ b/examples/lats/lats.ipynb @@ -38,7 +38,7 @@ "metadata": {}, "outputs": [], "source": [ - "# %pip install -U --quiet langchain langgraph langchain_openai\n", + "# %pip install -U --quiet langchain langgraph langchain_openai\n", "# %pip install -U --quiet tavily-python" ] }, @@ -86,7 +86,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 2, "id": "54c6f319-3966-4f66-aa7b-50e249189111", "metadata": {}, "outputs": [], @@ -94,15 +94,16 @@ "from __future__ import annotations\n", "\n", "import math\n", - "from typing import List, Optional\n", + "from typing import Optional\n", "\n", "from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, ToolMessage\n", + "from collections import deque\n", "\n", "\n", "class Node:\n", " def __init__(\n", " self,\n", - " messages: List[BaseMessage],\n", + " messages: list[BaseMessage],\n", " reflection: Reflection,\n", " parent: Optional[Node] = None,\n", " ):\n", @@ -180,7 +181,7 @@ " return self.messages + [self.reflection.as_message()]\n", " return self.messages\n", "\n", - " def get_trajectory(self, include_reflections: bool = True) -> List[BaseMessage]:\n", + " def get_trajectory(self, include_reflections: bool = True) -> list[BaseMessage]:\n", " \"\"\"Get messages representing this search branch.\"\"\"\n", " messages = []\n", " node = self\n", @@ -232,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "id": "e10c94ba-9daa-4899-97ce-4f28428c2c38", "metadata": {}, "outputs": [], @@ -264,14 +265,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 18, "id": "48738896-42ac-47eb-b482-0d4d4dd86c87", "metadata": {}, "outputs": [], "source": [ "from langchain_openai import ChatOpenAI\n", "\n", - "llm = ChatOpenAI(model=\"gpt-3.5-turbo\")" + "llm = ChatOpenAI(model=\"gpt-4o\")" ] }, { @@ -286,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "id": "55c2aff3-f454-43da-8f45-1a3d46523cd5", "metadata": {}, "outputs": [], @@ -315,12 +316,11 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "id": "ddfd1750-c265-4b29-b505-83b1c5e2d30e", "metadata": {}, "outputs": [], "source": [ - "from langchain.chains import create_structured_output_runnable\n", "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n", "from langchain_core.pydantic_v1 import BaseModel, Field\n", "from langchain_core.runnables import chain as as_runnable\n", @@ -395,15 +395,12 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 7, "id": "72fc5363-f0f3-4362-8499-14eb583bd75b", "metadata": {}, "outputs": [], "source": [ - "from typing import List\n", - "\n", "from langchain_core.prompt_values import ChatPromptValue\n", - "from langchain_core.pydantic_v1 import BaseModel, Field, ValidationError\n", "from langchain_core.runnables import RunnableConfig\n", "\n", "prompt_template = ChatPromptTemplate.from_messages(\n", @@ -428,17 +425,17 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 8, "id": "7207f913-a6db-4ef9-a98d-ecb8612b23d5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_APBQsd15wnSNPhyghCvFrNC8', 'function': {'arguments': '{\"query\":\"lithium pollution research report\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]})" + "AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_m5Q74vDZcX7LGqz2oaftVVMt', 'function': {'arguments': '{\"query\":\"lithium pollution research report\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 23, 'prompt_tokens': 95, 'total_tokens': 118}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-402c5c26-4efa-460d-959b-aba39f8cf409-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'lithium pollution research report'}, 'id': 'call_m5Q74vDZcX7LGqz2oaftVVMt'}])" ] }, - "execution_count": 16, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -462,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 9, "id": "5b6b173c-78f5-4ae1-80b3-28c80e68f5c5", "metadata": {}, "outputs": [], @@ -504,7 +501,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 10, "id": "550bff9a-86aa-43ad-ad98-506e97c122d2", "metadata": {}, "outputs": [], @@ -521,7 +518,7 @@ " n=n,\n", " callbacks=config[\"callbacks\"],\n", " run_name=\"GenerateCandidates\",\n", - " **bound_kwargs\n", + " **bound_kwargs,\n", " )\n", " return [gen.message for gen in chat_result.generations[0]]\n", "\n", @@ -531,21 +528,21 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 11, "id": "e368e61f-8150-4fd6-b3fd-208d1f0ddc9c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_5DMq9O6BIden7lLraFH0NuYZ', 'function': {'arguments': '{\"query\":\"lithium pollution research report\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}),\n", - " AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_5DMq9O6BIden7lLraFH0NuYZ', 'function': {'arguments': '{\"query\":\"lithium pollution research report\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}),\n", - " AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_5DMq9O6BIden7lLraFH0NuYZ', 'function': {'arguments': '{\"query\":\"lithium pollution research report\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}),\n", - " AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_5DMq9O6BIden7lLraFH0NuYZ', 'function': {'arguments': '{\"query\":\"lithium pollution research report\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}),\n", - " AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_5DMq9O6BIden7lLraFH0NuYZ', 'function': {'arguments': '{\"query\":\"lithium pollution research report\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]})]" + "[AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c', 'function': {'arguments': '{\"query\":\"lithium pollution\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls', 'logprobs': None}, id='run-8ebd8f6a-c615-48e0-af87-9fae39c0ae77-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'lithium pollution'}, 'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c'}]),\n", + " AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c', 'function': {'arguments': '{\"query\":\"lithium pollution\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls', 'logprobs': None}, id='run-8ebd8f6a-c615-48e0-af87-9fae39c0ae77-1', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'lithium pollution'}, 'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c'}]),\n", + " AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c', 'function': {'arguments': '{\"query\":\"lithium pollution research report\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls', 'logprobs': None}, id='run-8ebd8f6a-c615-48e0-af87-9fae39c0ae77-2', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'lithium pollution research report'}, 'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c'}]),\n", + " AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c', 'function': {'arguments': '{\"query\":\"lithium pollution research report\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls', 'logprobs': None}, id='run-8ebd8f6a-c615-48e0-af87-9fae39c0ae77-3', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'lithium pollution research report'}, 'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c'}]),\n", + " AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c', 'function': {'arguments': '{\"query\":\"lithium pollution\"}', 'name': 'tavily_search_results_json'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls', 'logprobs': None}, id='run-8ebd8f6a-c615-48e0-af87-9fae39c0ae77-4', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'lithium pollution'}, 'id': 'call_YCdUgs1Qr0J7rxpunyJj6B5c'}])]" ] }, - "execution_count": 19, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -568,12 +565,12 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 12, "id": "d32af859-53e8-46be-8182-7d522be31f54", "metadata": {}, "outputs": [], "source": [ - "from collections import defaultdict, deque\n", + "from collections import defaultdict\n", "\n", "\n", "def expand(state: TreeState, config: RunnableConfig) -> dict:\n", @@ -634,15 +631,16 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 14, "id": "8aec0f20-f978-4df0-8900-e3a1f0544f6d", "metadata": {}, "outputs": [], "source": [ + "from typing import Literal\n", "from langgraph.graph import END, StateGraph\n", "\n", "\n", - "def should_loop(state: TreeState):\n", + "def should_loop(state: TreeState) -> Literal[\"expand\", \"__end__\"]:\n", " \"\"\"Determine whether to continue the tree search.\"\"\"\n", " root = state[\"root\"]\n", " if root.is_solved:\n", @@ -672,6 +670,30 @@ "graph = builder.compile()" ] }, + { + "cell_type": "code", + "execution_count": 15, + "id": "d1674593", + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "\n", + "Image(graph.get_graph().draw_mermaid_png())" + ] + }, { "cell_type": "markdown", "id": "1383d69c-1d90-43f5-987e-c7fc4c3a24f8", @@ -682,7 +704,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 19, "id": "92392fb3-8431-4649-9e78-2cc160e96ec1", "metadata": {}, "outputs": [ @@ -695,19 +717,15 @@ "---\n", "expand\n", "rolled out: 2\n", - "---\n", - "expand\n", - "rolled out: 3\n", - "---\n", - "__end__\n", - "rolled out: 3\n", "---\n" ] } ], "source": [ "question = \"Generate a table with the average size and weight, as well as the oldest recorded instance for each of the top 5 most common birds.\"\n", + "last_step = None\n", "for step in graph.stream({\"input\": question}):\n", + " last_step = step\n", " step_name, step_state = next(iter(step.items()))\n", " print(step_name)\n", " print(\"rolled out: \", step_state[\"root\"].height)\n", @@ -716,7 +734,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 23, "id": "37a9e785-9909-4b56-b9be-da484e3711e1", "metadata": {}, "outputs": [ @@ -724,30 +742,57 @@ "name": "stdout", "output_type": "stream", "text": [ - "The search results have provided detailed information on the average size and weight, as well as the oldest recorded instance for each of the top 5 most common birds: Northern Cardinal, Dark-eyed Junco, Mourning Dove, Downy Woodpecker, and House Finch. Now, I will compile this information into a table format for easy reference. Let's create the table with the average size and weight, as well as the oldest recorded instance for each of these birds.\n", - "Here is the table with the average size and weight, as well as the oldest recorded instance for each of the top 5 most common birds:\n", + "Based on the search results, here is a summary of the top 5 most common birds, their average size and weight, and the oldest recorded instances:\n", "\n", - "| Bird Species | Average Size | Average Weight | Oldest Recorded Instance |\n", - "|---------------------|--------------------|------------------|--------------------------|\n", - "| Northern Cardinal | 21.5 cm (male), 21.25 cm (female) | 42-48 g | 15 years and 9 months |\n", - "| Dark-eyed Junco | 14-16 cm | 18-30 g | At least 11 years, 4 months old |\n", - "| Mourning Dove | 22.5-36 cm | 96-170 g | 19 years |\n", - "| Downy Woodpecker | 14-18 cm | 20-33 g | At least 11 years |\n", - "| House Finch | 13-14 cm | 16-27 g | 8-11 years |\n", + "### Most Common Birds\n", + "1. **House Sparrow (Passer domesticus)**\n", + " - **Average Size**: 16 cm (6.3 in)\n", + " - **Average Weight**: 24-39 grams\n", + " - **Oldest Recorded Instance**: Approximately 13 years\n", "\n", - "This table summarizes the average size and weight, as well as the oldest recorded instance for each of the top 5 most common birds.\n" + "2. **European Starling (Sturnus vulgaris)**\n", + " - **Average Size**: 20 cm (8 in)\n", + " - **Average Weight**: 75-90 grams\n", + " - **Oldest Recorded Instance**: 15 years\n", + "\n", + "3. **Ring-billed Gull (Larus delawarensis)**\n", + " - **Average Size**: 49 cm (19 in)\n", + " - **Average Weight**: 300-500 grams\n", + " - **Oldest Recorded Instance**: 23 years\n", + "\n", + "4. **Barn Swallow (Hirundo rustica)**\n", + " - **Average Size**: 15-20 cm (5.9-7.9 in)\n", + " - **Average Weight**: 17-20 grams\n", + " - **Oldest Recorded Instance**: 11 years\n", + "\n", + "5. **Red-billed Quelea (Quelea quelea)**\n", + " - **Average Size**: 12-13 cm (4.7-5.1 in)\n", + " - **Average Weight**: 15-20 grams\n", + " - **Oldest Recorded Instance**: 17 years\n", + "\n", + "### Table Format\n", + "\n", + "| Bird Species | Average Size | Average Weight | Oldest Recorded Instance |\n", + "|-----------------------|--------------|----------------|--------------------------|\n", + "| House Sparrow | 16 cm | 24-39 grams | 13 years |\n", + "| European Starling | 20 cm | 75-90 grams | 15 years |\n", + "| Ring-billed Gull | 49 cm | 300-500 grams | 23 years |\n", + "| Barn Swallow | 15-20 cm | 17-20 grams | 11 years |\n", + "| Red-billed Quelea | 12-13 cm | 15-20 grams | 17 years |\n", + "\n", + "This table summarizes the average size and weight, as well as the oldest recorded instance, for each of the top 5 most common birds. These values are based on general data, and specific numbers may vary slightly depending on the source.\n" ] } ], "source": [ - "solution_node = step[\"__end__\"][\"root\"].get_best_solution()\n", + "solution_node = last_step[\"expand\"][\"root\"].get_best_solution()\n", "best_trajectory = solution_node.get_trajectory(include_reflections=False)\n", "print(best_trajectory[-1].content)" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 24, "id": "1e084037-42e7-4f8e-962d-aaa3f04ab54c", "metadata": {}, "outputs": [ @@ -763,16 +808,15 @@ "---\n", "expand\n", "rolled out: 3\n", - "---\n", - "__end__\n", - "rolled out: 3\n", "---\n" ] } ], "source": [ "question = \"Write out magnus carlson series of moves in his game against Alireza Firouzja and propose an alternate strategy\"\n", + "last_step = None\n", "for step in graph.stream({\"input\": question}):\n", + " last_step = step\n", " step_name, step_state = next(iter(step.items()))\n", " print(step_name)\n", " print(\"rolled out: \", step_state[\"root\"].height)\n", @@ -781,7 +825,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 25, "id": "d403c1c8-b26b-4d79-87b1-d2d16c1a7673", "metadata": {}, "outputs": [ @@ -789,12 +833,59 @@ "name": "stdout", "output_type": "stream", "text": [ - "In the game between Magnus Carlsen and Alireza Firouzja, Magnus Carlsen started with the move C4, and Alireza countered with H6. To propose an alternate strategy for Magnus Carlsen, focusing on positional play, creating strong pawn structures, and leveraging his endgame skills could be highly effective. Magnus could aim to control the center, develop his pieces harmoniously, and look for opportunities to gradually improve his position. By maintaining a solid pawn structure and maneuvering his pieces strategically, Magnus could aim to outmaneuver his opponent in the later stages of the game, utilizing his renowned endgame skills to secure a favorable outcome.\n" + "To propose an alternate strategy for Magnus Carlsen in a game against Alireza Firouzja, especially if Firouzja opts for the b3 Sicilian system, let's consider the typical play and counterplay options against this opening.\n", + "\n", + "### Overview of the b3 Sicilian\n", + "The b3 Sicilian is a rare but strategically rich system where White aims to fianchetto the queen's bishop and gain control over the central squares indirectly. The typical moves might start with:\n", + "1. e4 c5\n", + "2. Nf3 d6\n", + "3. Bb2\n", + "\n", + "### Potential Strategy and Counterplay for Magnus Carlsen\n", + "\n", + "1. **Solid Development**:\n", + " - **1...e5**: Aiming for control of the center and developing pieces efficiently.\n", + " - **2...Nc6**: Developing the knight to a natural square, attacking the e5 pawn and preparing to bring out other pieces.\n", + "\n", + "2. **Control the Center**:\n", + " - **3...Nf6**: Attacking the e4 pawn and preparing to develop the other knight.\n", + " - **4...d5**: If allowed, striking the center with the d5 pawn to challenge White's setup.\n", + "\n", + "3. **Flexible Pawn Structure**:\n", + " - **...a6**: Preparing for a possible b5 expansion or simply controlling the b5 square.\n", + " - **...e6**: Preparing to develop the bishop to e7 and castling short.\n", + "\n", + "4. **Counterattacks**:\n", + " - **...Be7** and **...O-O**: Completing development and preparing for potential pawn breaks with ...d5 or ...f5, depending on the position.\n", + " - **...Re8**: In some lines, this rook move can support a central break with ...e5 or ...f5.\n", + "\n", + "### Sample Move Sequence and Plan\n", + "Here is a hypothetical series of moves that Magnus could employ to counter Firouzja's b3 Sicilian:\n", + "\n", + "1. e4 c5\n", + "2. Nf3 d6\n", + "3. Bb2 Nf6\n", + "4. Nc3 Nc6\n", + "5. Bb5 Bd7\n", + "6. O-O e6\n", + "7. Re1 Be7\n", + "8. d4 cxd4\n", + "9. Nxd4 O-O\n", + "10. Bf1 a6\n", + "\n", + "In this sequence, Black has developed all pieces harmoniously and is ready to counterattack in the center or on the queenside. The idea is to maintain solid control over the center while preparing for potential pawn breaks to disrupt White's plans.\n", + "\n", + "### Key Ideas for Magnus:\n", + "- **Maintain Flexibility**: Avoid committing to pawn structures too early; respond to White's setup dynamically.\n", + "- **Central Breaks**: Look for opportunities to break with ...d5 or ...f5 to open the position in favor of Black.\n", + "- **Piece Activity**: Ensure all pieces are well-placed and ready to enter the fray when the position opens up.\n", + "\n", + "This strategy allows Magnus to maintain a strong, flexible position, ready to counter Firouzja's plans effectively.\n" ] } ], "source": [ - "solution_node = step[\"__end__\"][\"root\"].get_best_solution()\n", + "solution_node = last_step[\"expand\"][\"root\"].get_best_solution()\n", "best_trajectory = solution_node.get_trajectory(include_reflections=False)\n", "print(best_trajectory[-1].content)" ]