From 5d28384f304ceaea5347e948e9f6888979e56f6e Mon Sep 17 00:00:00 2001 From: darklord Date: Fri, 21 Aug 2026 04:32:14 +0000 Subject: [PATCH] Basic practice with Langchain with Ollama --- first_chain.ipynb | 125 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 first_chain.ipynb diff --git a/first_chain.ipynb b/first_chain.ipynb new file mode 100644 index 0000000..298a08c --- /dev/null +++ b/first_chain.ipynb @@ -0,0 +1,125 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "d581e8a1", + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'RunnableRetry' object has no attribute 'with_fallback'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[22]\u001b[39m\u001b[32m, line 23\u001b[39m\n\u001b[32m 19\u001b[39m stop_after_attempt= \u001b[32m3\u001b[39m\n\u001b[32m 20\u001b[39m )\n\u001b[32m 21\u001b[39m llm2_with_retry = llm2.with_retry(stop_after_attempt=\u001b[32m3\u001b[39m)\n\u001b[32m 22\u001b[39m \n\u001b[32m---> \u001b[39m\u001b[32m23\u001b[39m runner = llm_with_retry.with_fallback(llm2_with_retry)\n\u001b[32m 24\u001b[39m \n\u001b[32m 25\u001b[39m \u001b[38;5;66;03m#Create a prompt template\u001b[39;00m\n\u001b[32m 26\u001b[39m prompt = ChatPromptTemplate.from_template(\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Projects/longchain/first_chain/lib/python3.14/site-packages/pydantic/main.py:1042\u001b[39m, in \u001b[36mBaseModel.__getattr__\u001b[39m\u001b[34m(self, item)\u001b[39m\n\u001b[32m 1039\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m().\u001b[34m__getattribute__\u001b[39m(item) \u001b[38;5;66;03m# Raises AttributeError if appropriate\u001b[39;00m\n\u001b[32m 1040\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1041\u001b[39m \u001b[38;5;66;03m# this is the current error\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1042\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m).\u001b[34m__name__\u001b[39m\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[33m object has no attribute \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mitem\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[33m'\u001b[39m)\n", + "\u001b[31mAttributeError\u001b[39m: 'RunnableRetry' object has no attribute 'with_fallback'" + ] + } + ], + "source": [ + "from langchain_ollama import ChatOllama\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.caches import InMemoryCache \n", + "from langchain_core.globals import set_llm_cache\n", + "\n", + "set_llm_cache(InMemoryCache())\n", + "\n", + "#Initialize the language model\n", + "llm = ChatOllama(\n", + " model=\"gemma4:12b-mlx\",\n", + " base_url=\"http://mini2.dorceus.local:11434\"\n", + ")\n", + "llm2 = ChatOllama(\n", + " model=\"qwen3.5:35b-mlx\",\n", + " base_url=\"http://studio1.dorceus.local:11434\"\n", + ")\n", + "\n", + "llm_with_retry = llm.with_retry(\n", + " stop_after_attempt= 3\n", + ")\n", + "llm2_with_retry = llm2.with_retry(stop_after_attempt=3)\n", + "\n", + "runner = llm_with_retry.with_fallbacks([llm2_with_retry])\n", + "\n", + "#Create a prompt template\n", + "prompt = ChatPromptTemplate.from_template(\n", + " \"Write a brief, engaging paragraph about {topic}\"\n", + ")\n", + "\n", + "prompt2 = ChatPromptTemplate.from_template(\n", + " \"Summarize the following in one sentence : {paragraph}\"\n", + ")\n", + "\n", + "prompt3 = ChatPromptTemplate.from_template(\n", + " \"Suggest some side dished that goes with the following food description : {food_description}\"\n", + ")\n", + "\n", + "#Create the chain \n", + "# chain = prompt | llm\n", + "# chain2 = prompt2 | llm2\n", + "# chain3 = prompt3 | llm2 \n", + "\n", + "#sequential chain\n", + "# seq_chain = (\n", + "# {\n", + "# \"paragraph\" : prompt,\n", + "# \"food_description\" : prompt2\n", + "# }\n", + "# | prompt2 \n", + "# | prompt3 \n", + "# | llm2\n", + "# )\n", + "\n", + "seq_chain = (\n", + " prompt\n", + " | (lambda message : {\"paragraph\" : message.content})\n", + " | prompt2 \n", + " | (lambda message : {\"food_description\" : message.content})\n", + " | prompt3 \n", + " | runner\n", + ")\n", + "\n", + "for i in range(1,5) :\n", + " response = chain.invoke(\n", + " {\"topic\": \"adobong baboy\"}\n", + " )\n", + " #print(response.content)\n", + "\n", + "print(\"DONE\")\n", + "\n", + "#Run the chain\n", + "# result = chain.invoke({\"topic\": \"adobong baboy\"})\n", + "# result2 = chain2.invoke({\"topic\": result.content})\n", + "# result3 = chain3.invoke({\"food_description\" : result2.content})\n", + "# print(result.content)\n", + "# print(result2.content)\n", + "# print(result3.content)\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "first_chain", + "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.14.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}