diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index 5a0b3850eb..05e1723946 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -110,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "cb09c344-1836-4e0c-acf8-11d13ac1dbae", "metadata": {}, "outputs": [], @@ -134,18 +134,21 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "id": "62e0dbc3", "metadata": { "tags": [] }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "AIMessage(content='Je adore le programmation.\\n\\n(Note: \"programmation\" is the feminine form of the noun in French, but if you want to use the masculine form, it would be \"le programme\" instead.)' response_metadata={'model': 'llama3', 'created_at': '2024-07-04T04:20:28.138164Z', 'message': {'role': 'assistant', 'content': ''}, 'done_reason': 'stop', 'done': True, 'total_duration': 1943337750, 'load_duration': 1128875, 'prompt_eval_count': 33, 'prompt_eval_duration': 322813000, 'eval_count': 43, 'eval_duration': 1618213000} id='run-ed8c17ab-7fc2-4c90-a88a-f6273b49bc78-0')\n" - ] + "data": { + "text/plain": [ + "AIMessage(content='Je adore le programmation.\\n\\n(Note: \"programmation\" is not commonly used in French, but I translated it as \"le programmation\" to maintain the same grammatical structure and meaning as the original English sentence.)', response_metadata={'model': 'llama3', 'created_at': '2024-07-22T17:43:54.731273Z', 'message': {'role': 'assistant', 'content': ''}, 'done_reason': 'stop', 'done': True, 'total_duration': 11094839375, 'load_duration': 10121854667, 'prompt_eval_count': 36, 'prompt_eval_duration': 146569000, 'eval_count': 46, 'eval_duration': 816593000}, id='run-befccbdc-e1f9-42a9-85cf-e69b926d6b8b-0', usage_metadata={'input_tokens': 36, 'output_tokens': 46, 'total_tokens': 82})" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -164,7 +167,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "id": "d86145b3-bfef-46e8-b227-4dda5c9c2705", "metadata": {}, "outputs": [ @@ -174,7 +177,7 @@ "text": [ "Je adore le programmation.\n", "\n", - "(Note: \"programmation\" is the feminine form of the noun in French, but if you want to use the masculine form, it would be \"le programme\" instead.)\n" + "(Note: \"programmation\" is not commonly used in French, but I translated it as \"le programmation\" to maintain the same grammatical structure and meaning as the original English sentence.)\n" ] } ], @@ -232,6 +235,86 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "0f51345d-0a9d-43f1-8fca-d0662cb8e21b", + "metadata": {}, + "source": [ + "## Tool calling\n", + "\n", + "We can use [tool calling](https://blog.langchain.dev/improving-core-tool-interfaces-and-docs-in-langchain/) with an LLM [that has been fine-tuned for tool use](https://ollama.com/library/llama3-groq-tool-use): \n", + "\n", + "```\n", + "ollama pull llama3-groq-tool-use\n", + "```\n", + "\n", + "We can just pass normal Python functions directly as tools." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5250bceb-1029-41ff-b447-983518704d88", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'name': 'validate_user',\n", + " 'args': {'addresses': ['123 Fake St, Boston MA',\n", + " '234 Pretend Boulevard, Houston TX'],\n", + " 'user_id': 123},\n", + " 'id': 'fe2148d3-95fb-48e9-845a-4bfecc1f1f96',\n", + " 'type': 'tool_call'}]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from typing import List\n", + "\n", + "from langchain_ollama import ChatOllama\n", + "from typing_extensions import TypedDict\n", + "\n", + "\n", + "def validate_user(user_id: int, addresses: List) -> bool:\n", + " \"\"\"Validate user using historical addresses.\n", + "\n", + " Args:\n", + " user_id: (int) the user ID.\n", + " addresses: Previous addresses.\n", + " \"\"\"\n", + " return True\n", + "\n", + "\n", + "llm = ChatOllama(\n", + " model=\"llama3-groq-tool-use\",\n", + " temperature=0,\n", + ").bind_tools([validate_user])\n", + "\n", + "result = llm.invoke(\n", + " \"Could you validate user 123? They previously lived at \"\n", + " \"123 Fake St in Boston MA and 234 Pretend Boulevard in \"\n", + " \"Houston TX.\"\n", + ")\n", + "result.tool_calls" + ] + }, + { + "cell_type": "markdown", + "id": "2bb034ff-218f-4865-afea-3f5e57d3bdee", + "metadata": {}, + "source": [ + "We look at the LangSmith trace to see that the tool call was performed: \n", + "\n", + "https://smith.langchain.com/public/4169348a-d6be-45df-a7cf-032f6baa4697/r\n", + "\n", + "In particular, the trace shows how the tool schema was populated." + ] + }, { "cell_type": "markdown", "id": "4c5e0197", @@ -384,7 +467,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.11.8" } }, "nbformat": 4,