From 4335806a5510897019849dbb86b24ba07d74c63d Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Thu, 14 Dec 2023 06:49:49 -0800 Subject: [PATCH 01/13] Add image support --- libs/community/langchain_community/llms/ollama.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libs/community/langchain_community/llms/ollama.py b/libs/community/langchain_community/llms/ollama.py index 3551ba446ef36..1be919de5cd87 100644 --- a/libs/community/langchain_community/llms/ollama.py +++ b/libs/community/langchain_community/llms/ollama.py @@ -133,6 +133,7 @@ def _create_stream( self, prompt: str, stop: Optional[List[str]] = None, + images: Optional[List[str]] = None, **kwargs: Any, ) -> Iterator[str]: if self.stop is not None and stop is not None: @@ -156,10 +157,14 @@ def _create_stream( **kwargs, } + request_payload = {"prompt": prompt, **params} + if images is not None: + request_payload["images"] = images + response = requests.post( url=f"{self.base_url}/api/generate/", headers={"Content-Type": "application/json"}, - json={"prompt": prompt, **params}, + json=request_payload, stream=True, timeout=self.timeout, ) @@ -225,6 +230,7 @@ def _generate( self, prompts: List[str], stop: Optional[List[str]] = None, + images: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any, ) -> LLMResult: @@ -248,6 +254,7 @@ def _generate( final_chunk = super()._stream_with_aggregation( prompt, stop=stop, + images=images, run_manager=run_manager, verbose=self.verbose, **kwargs, From a61421c8cd2c4cead998c9663b235cb67b52f97b Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Thu, 14 Dec 2023 10:23:56 -0800 Subject: [PATCH 02/13] Add to chat model --- libs/community/langchain_community/chat_models/ollama.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libs/community/langchain_community/chat_models/ollama.py b/libs/community/langchain_community/chat_models/ollama.py index 91dda64e45e43..671404224abd2 100644 --- a/libs/community/langchain_community/chat_models/ollama.py +++ b/libs/community/langchain_community/chat_models/ollama.py @@ -74,6 +74,7 @@ def _generate( self, messages: List[BaseMessage], stop: Optional[List[str]] = None, + images: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any, ) -> ChatResult: @@ -96,7 +97,8 @@ def _generate( prompt = self._format_messages_as_text(messages) final_chunk = super()._stream_with_aggregation( - prompt, stop=stop, run_manager=run_manager, verbose=self.verbose, **kwargs + prompt, stop=stop, images=images, run_manager=run_manager, + verbose=self.verbose, **kwargs ) chat_generation = ChatGeneration( message=AIMessage(content=final_chunk.text), @@ -108,11 +110,12 @@ def _stream( self, messages: List[BaseMessage], stop: Optional[List[str]] = None, + images: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any, ) -> Iterator[ChatGenerationChunk]: prompt = self._format_messages_as_text(messages) - for stream_resp in self._create_stream(prompt, stop, **kwargs): + for stream_resp in self._create_stream(prompt, stop, images, **kwargs): if stream_resp: chunk = _stream_response_to_chat_generation_chunk(stream_resp) yield chunk From d6be395894363d753010b2ad5243f5ed460081ec Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Thu, 14 Dec 2023 10:31:43 -0800 Subject: [PATCH 03/13] fmt --- .../langchain_community/chat_models/ollama.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libs/community/langchain_community/chat_models/ollama.py b/libs/community/langchain_community/chat_models/ollama.py index 671404224abd2..7e129326e157f 100644 --- a/libs/community/langchain_community/chat_models/ollama.py +++ b/libs/community/langchain_community/chat_models/ollama.py @@ -74,7 +74,7 @@ def _generate( self, messages: List[BaseMessage], stop: Optional[List[str]] = None, - images: Optional[List[str]] = None, + images: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any, ) -> ChatResult: @@ -97,8 +97,12 @@ def _generate( prompt = self._format_messages_as_text(messages) final_chunk = super()._stream_with_aggregation( - prompt, stop=stop, images=images, run_manager=run_manager, - verbose=self.verbose, **kwargs + prompt, + stop=stop, + images=images, + run_manager=run_manager, + verbose=self.verbose, + **kwargs, ) chat_generation = ChatGeneration( message=AIMessage(content=final_chunk.text), From 72d3c20a21e05dd2ef0031fa4c8d85730bd53d70 Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Thu, 14 Dec 2023 13:04:44 -0800 Subject: [PATCH 04/13] Update docs --- docs/docs/integrations/chat/ollama.ipynb | 279 +++++------------ docs/docs/integrations/llms/ollama.ipynb | 363 +++++------------------ 2 files changed, 140 insertions(+), 502 deletions(-) diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index 911f1f30f0739..93d0bda2ecaa1 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,6 @@ "\n", "chat_model = ChatOllama(\n", " model=\"llama2:7b-chat\",\n", - " callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),\n", ")" ] }, @@ -84,41 +83,28 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With `StreamingStdOutCallbackHandler`, you will see tokens streamed." + "Optionally, pass `StreamingStdOutCallbackHandler` to stream tokens:\n", + "\n", + "```\n", + "chat_model = ChatOllama(\n", + " model=\"llama2:7b-chat\",\n", + " callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),\n", + ")\n", + "```" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Artificial intelligence (AI) has a rich and varied history that spans several decades. Hinweis: The following is a brief overview of the major milestones in the history of AI, but it is by no means exhaustive.\n", - "\n", - "1. Early Beginnings (1950s-1960s): The term \"Artificial Intelligence\" was coined in 1956 by computer scientist John McCarthy. However, the concept of creating machines that can think and learn like humans dates back to ancient times. In the 1950s and 1960s, researchers began exploring the possibilities of AI using simple algorithms and machine learning techniques.\n", - "2. Rule-Based Systems (1970s-1980s): In the 1970s and 1980s, AI research focused on developing rule-based systems, which use predefined rules to reason and make decisions. This led to the development of expert systems, which were designed to mimic the decision-making abilities of human experts in specific domains.\n", - "3. Machine Learning (1980s-1990s): The 1980s saw a shift towards machine learning, which enables machines to learn from data without being explicitly programmed. This led to the development of algorithms such as decision trees, neural networks, and support vector machines.\n", - "4. Deep Learning (2000s-present): In the early 2000s, deep learning emerged as a subfield of machine learning, focusing on neural networks with multiple layers. These networks can learn complex representations of data, leading to breakthroughs in image and speech recognition, natural language processing, and other areas.\n", - "5. Natural Language Processing (NLP) (1980s-present): NLP has been an active area of research since the 1980s, with a focus on developing algorithms that can understand and generate human language. This has led to applications such as chatbots, voice assistants, and language translation systems.\n", - "6. Robotics (1970s-present): The development of robotics has been closely tied to AI research, with a focus on creating machines that can perform tasks that typically require human intelligence, such as manipulation and locomotion.\n", - "7. Computer Vision (1980s-present): Computer vision has been an active area of research since the 1980s, with a focus on enabling machines to interpret and understand visual data from the world around us. This has led to applications such as image recognition, object detection, and autonomous driving.\n", - "8. Ethics and Society (1990s-present): As AI technology has become more advanced and integrated into various aspects of society, there has been a growing concern about the ethical implications of AI. This includes issues related to privacy, bias, and job displacement.\n", - "9. Reinforcement Learning (2000s-present): Reinforcement learning is a subfield of machine learning that involves training machines to make decisions based on feedback from their environment. This has led to breakthroughs in areas such as game playing, robotics, and autonomous driving.\n", - "10. Generative Models (2010s-present): Generative models are a class of AI algorithms that can generate new data that is similar to a given dataset. This has led to applications such as image synthesis, music generation, and language creation.\n", - "\n", - "These are just a few of the many developments in the history of AI. As the field continues to evolve, we can expect even more exciting breakthroughs and innovations in the years to come." - ] - }, { "data": { "text/plain": [ - "AIMessage(content=' Artificial intelligence (AI) has a rich and varied history that spans several decades. Hinweis: The following is a brief overview of the major milestones in the history of AI, but it is by no means exhaustive.\\n\\n1. Early Beginnings (1950s-1960s): The term \"Artificial Intelligence\" was coined in 1956 by computer scientist John McCarthy. However, the concept of creating machines that can think and learn like humans dates back to ancient times. In the 1950s and 1960s, researchers began exploring the possibilities of AI using simple algorithms and machine learning techniques.\\n2. Rule-Based Systems (1970s-1980s): In the 1970s and 1980s, AI research focused on developing rule-based systems, which use predefined rules to reason and make decisions. This led to the development of expert systems, which were designed to mimic the decision-making abilities of human experts in specific domains.\\n3. Machine Learning (1980s-1990s): The 1980s saw a shift towards machine learning, which enables machines to learn from data without being explicitly programmed. This led to the development of algorithms such as decision trees, neural networks, and support vector machines.\\n4. Deep Learning (2000s-present): In the early 2000s, deep learning emerged as a subfield of machine learning, focusing on neural networks with multiple layers. These networks can learn complex representations of data, leading to breakthroughs in image and speech recognition, natural language processing, and other areas.\\n5. Natural Language Processing (NLP) (1980s-present): NLP has been an active area of research since the 1980s, with a focus on developing algorithms that can understand and generate human language. This has led to applications such as chatbots, voice assistants, and language translation systems.\\n6. Robotics (1970s-present): The development of robotics has been closely tied to AI research, with a focus on creating machines that can perform tasks that typically require human intelligence, such as manipulation and locomotion.\\n7. Computer Vision (1980s-present): Computer vision has been an active area of research since the 1980s, with a focus on enabling machines to interpret and understand visual data from the world around us. This has led to applications such as image recognition, object detection, and autonomous driving.\\n8. Ethics and Society (1990s-present): As AI technology has become more advanced and integrated into various aspects of society, there has been a growing concern about the ethical implications of AI. This includes issues related to privacy, bias, and job displacement.\\n9. Reinforcement Learning (2000s-present): Reinforcement learning is a subfield of machine learning that involves training machines to make decisions based on feedback from their environment. This has led to breakthroughs in areas such as game playing, robotics, and autonomous driving.\\n10. Generative Models (2010s-present): Generative models are a class of AI algorithms that can generate new data that is similar to a given dataset. This has led to applications such as image synthesis, music generation, and language creation.\\n\\nThese are just a few of the many developments in the history of AI. As the field continues to evolve, we can expect even more exciting breakthroughs and innovations in the years to come.', additional_kwargs={}, example=False)" + "AIMessage(content=' Artificial intelligence (AI) has a rich and varied history that spans several decades. obviously, as technology advances at an incredible pace. Here\\'s a brief overview:\\n\\n1. Early years (1950s-1960s): The term \"Artificial Intelligence\" was coined in 1956 by computer scientist John McCarthy. However, the concept of AI dates back to ancient Greece, where myths were created about machines that could think and learn. In the 1950s and 1960s, researchers like Marvin Minsky and Nathaniel Rochester explored the possibilities of machine intelligence, developing concepts like the multi-layered neural network model.\\n2. Rule-based systems (1970s-1980s): In the 1970s and 1980s, AI research focused on developing rule-based systems, which used pre-defined rules to reason and make decisions. This led to the development of expert systems, which were designed to solve complex problems in fields like medicine and finance.\\n3. Machine learning (1990s-present): In the 1990s, machine learning became a major area of research. This involves developing algorithms that can learn from data without being explicitly programmed. Today, machine learning is a key aspect of AI, enabling applications like image recognition, natural language processing, and autonomous vehicles.\\n4. Deep learning (2000s-present): In the 2000s, deep learning emerged as a subfield of machine learning. This involves the use of artificial neural networks with multiple layers to analyze complex data sets. Deep learning has led to significant advances in areas like computer vision and speech recognition.\\n5. Natural language processing (1980s-present): In the 1980s, researchers began exploring ways to develop machines that could understand and generate human language. Today, natural language processing (NLP) is a key aspect of AI, enabling applications like chatbots, voice assistants, and sentiment analysis.\\n6. Robotics (1980s-present): The development of robotics has been closely tied to advances in AI. Researchers have created robots that can perform tasks like assembly, warehousing, and even surgery.\\n7. Computer vision (1980s-present): Computer vision involves developing algorithms that can analyze and interpret visual data from images and videos. This has led to significant advances in areas like facial recognition, object detection, and autonomous driving.\\n8. Reinforcement learning (2000s-present): In the 2000s, researchers began exploring reinforcement learning, which involves developing algorithms that can learn from interactions with an environment. This has led to significant advances in areas like game playing and autonomous vehicles.\\n9. Ethical considerations (1980s-present): As AI has become more advanced and integrated into various aspects of life, ethical considerations have become increasingly important. Researchers have explored issues like bias, privacy, and the impact of AI on society.\\n10. Future developments: The future of AI is likely to involve further advances in areas like robotics, computer vision, and machine learning. There is also growing interest in developing hybrid AI systems that combine human and artificial intelligence capabilities. As technology continues to evolve, AI will undoubtedly play an increasingly significant role in shaping the future of work, healthcare, education, and many other areas of life.\\n\\nIn conclusion, the history of AI is a rich and complex one, with numerous breakthroughs and setbacks along the way. Today, AI is a rapidly evolving field that holds enormous potential for transforming industries and improving lives worldwide.')" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -287,235 +273,104 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## RAG\n", + "## Multi-modal\n", "\n", - "We can use Olama with RAG, [just as shown here](https://python.langchain.com/docs/use_cases/question_answering/local_retrieval_qa).\n", - "\n", - "Let's use the 13b model:\n", + "Ollama has support for multi-modal LLMs, such as [bakllava](https://ollama.ai/library/bakllava) and [llava](https://ollama.ai/library/llava).\n", "\n", "```\n", - "ollama pull llama2:13b\n", + "ollama pull bakllava\n", "```\n", "\n", - "Let's also use local embeddings from `OllamaEmbeddings` and `Chroma`." + "Be sure to update Ollama so that you have the most recent version to support multi-modal." ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "! pip install chromadb" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.document_loaders import WebBaseLoader\n", - "\n", - "loader = WebBaseLoader(\"https://lilianweng.github.io/posts/2023-06-23-agent/\")\n", - "data = loader.load()\n", - "\n", - "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", - "\n", - "text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)\n", - "all_splits = text_splitter.split_documents(data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "from langchain.embeddings import OllamaEmbeddings\n", - "from langchain.vectorstores import Chroma\n", + "from langchain.chat_models import ChatOllama\n", "\n", - "vectorstore = Chroma.from_documents(documents=all_splits, embedding=OllamaEmbeddings())" + "chat_model = ChatOllama(\n", + " model=\"bakllava\",\n", + ")" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "" + ], "text/plain": [ - "4" + "" ] }, - "execution_count": 7, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "question = \"What are the approaches to Task Decomposition?\"\n", - "docs = vectorstore.similarity_search(question)\n", - "len(docs)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.prompts import PromptTemplate\n", - "\n", - "# Prompt\n", - "template = \"\"\"[INST] <> Use the following pieces of context to answer the question at the end. \n", - "If you don't know the answer, just say that you don't know, don't try to make up an answer. \n", - "Use three sentences maximum and keep the answer as concise as possible. <>\n", - "{context}\n", - "Question: {question}\n", - "Helpful Answer:[/INST]\"\"\"\n", - "QA_CHAIN_PROMPT = PromptTemplate(\n", - " input_variables=[\"context\", \"question\"],\n", - " template=template,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "# Chat model\n", - "from langchain.callbacks.manager import CallbackManager\n", - "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler\n", - "from langchain.chat_models import ChatOllama\n", - "\n", - "chat_model = ChatOllama(\n", - " model=\"llama2:13b\",\n", - " verbose=True,\n", - " callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "# QA chain\n", - "from langchain.chains import RetrievalQA\n", - "\n", - "qa_chain = RetrievalQA.from_chain_type(\n", - " chat_model,\n", - " retriever=vectorstore.as_retriever(),\n", - " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT},\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Based on the provided context, there are three approaches to task decomposition for AI agents:\n", - "\n", - "1. LLM with simple prompting, such as \"Steps for XYZ.\" or \"What are the subgoals for achieving XYZ?\"\n", - "2. Task-specific instructions, such as \"Write a story outline\" for writing a novel.\n", - "3. Human inputs." - ] + "output_type": "display_data" } ], "source": [ - "question = \"What are the various approaches to Task Decomposition for AI Agents?\"\n", - "result = qa_chain({\"query\": question})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also get logging for tokens." + "import base64\n", + "from PIL import Image\n", + "from io import BytesIO\n", + "from IPython.display import HTML, display\n", + "\n", + "def convert_to_base64(pil_image):\n", + " \"\"\"\n", + " Convert PIL images to Base64 encoded strings\n", + "\n", + " :param pil_image: PIL image\n", + " :return: Re-sized Base64 string\n", + " \"\"\"\n", + "\n", + " buffered = BytesIO()\n", + " pil_image.save(buffered, format=\"JPEG\") # You can change the format if needed\n", + " img_str = base64.b64encode(buffered.getvalue()).decode(\"utf-8\")\n", + " return img_str\n", + "\n", + "def plt_img_base64(img_base64):\n", + " \"\"\"\n", + " Disply base64 encoded string as image\n", + "\n", + " :param img_base64: Base64 string\n", + " \"\"\"\n", + " # Create an HTML img tag with the base64 string as the source\n", + " image_html = f''\n", + " # Display the image by rendering the HTML\n", + " display(HTML(image_html))\n", + "\n", + "file_path = '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'\n", + "pil_image = Image.open(file_path)\n", + "image_b64 = convert_to_base64(pil_image)\n", + "plt_img_base64(image_b64)" ] }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Based on the given context, here is the answer to the question \"What are the approaches to Task Decomposition?\"\n", - "\n", - "There are three approaches to task decomposition:\n", - "\n", - "1. LLM with simple prompting, such as \"Steps for XYZ.\" or \"What are the subgoals for achieving XYZ?\"\n", - "2. Using task-specific instructions, like \"Write a story outline\" for writing a novel.\n", - "3. With human inputs.{'model': 'llama2:13b-chat', 'created_at': '2023-08-23T15:37:51.469127Z', 'done': True, 'context': [1, 29871, 1, 29961, 25580, 29962, 518, 25580, 29962, 518, 25580, 29962, 3532, 14816, 29903, 6778, 4803, 278, 1494, 12785, 310, 3030, 304, 1234, 278, 1139, 472, 278, 1095, 29889, 29871, 13, 3644, 366, 1016, 29915, 29873, 1073, 278, 1234, 29892, 925, 1827, 393, 366, 1016, 29915, 29873, 1073, 29892, 1016, 29915, 29873, 1018, 304, 1207, 701, 385, 1234, 29889, 29871, 13, 11403, 2211, 25260, 7472, 322, 3013, 278, 1234, 408, 3022, 895, 408, 1950, 29889, 529, 829, 14816, 29903, 6778, 13, 5398, 26227, 508, 367, 2309, 313, 29896, 29897, 491, 365, 26369, 411, 2560, 9508, 292, 763, 376, 7789, 567, 363, 1060, 29979, 29999, 7790, 29876, 29896, 19602, 376, 5618, 526, 278, 1014, 1484, 1338, 363, 3657, 15387, 1060, 29979, 29999, 29973, 613, 313, 29906, 29897, 491, 773, 3414, 29899, 14940, 11994, 29936, 321, 29889, 29887, 29889, 376, 6113, 263, 5828, 27887, 1213, 363, 5007, 263, 9554, 29892, 470, 313, 29941, 29897, 411, 5199, 10970, 29889, 13, 13, 5398, 26227, 508, 367, 2309, 313, 29896, 29897, 491, 365, 26369, 411, 2560, 9508, 292, 763, 376, 7789, 567, 363, 1060, 29979, 29999, 7790, 29876, 29896, 19602, 376, 5618, 526, 278, 1014, 1484, 1338, 363, 3657, 15387, 1060, 29979, 29999, 29973, 613, 313, 29906, 29897, 491, 773, 3414, 29899, 14940, 11994, 29936, 321, 29889, 29887, 29889, 376, 6113, 263, 5828, 27887, 1213, 363, 5007, 263, 9554, 29892, 470, 313, 29941, 29897, 411, 5199, 10970, 29889, 13, 13, 1451, 16047, 267, 297, 1472, 29899, 8489, 18987, 322, 3414, 26227, 29901, 1858, 9450, 975, 263, 3309, 29891, 4955, 322, 17583, 3902, 8253, 278, 1650, 2913, 3933, 18066, 292, 29889, 365, 26369, 29879, 21117, 304, 10365, 13900, 746, 20050, 411, 15668, 4436, 29892, 3907, 963, 3109, 16424, 9401, 304, 25618, 1058, 5110, 515, 14260, 322, 1059, 29889, 13, 13, 1451, 16047, 267, 297, 1472, 29899, 8489, 18987, 322, 3414, 26227, 29901, 1858, 9450, 975, 263, 3309, 29891, 4955, 322, 17583, 3902, 8253, 278, 1650, 2913, 3933, 18066, 292, 29889, 365, 26369, 29879, 21117, 304, 10365, 13900, 746, 20050, 411, 15668, 4436, 29892, 3907, 963, 3109, 16424, 9401, 304, 25618, 1058, 5110, 515, 14260, 322, 1059, 29889, 13, 16492, 29901, 1724, 526, 278, 13501, 304, 9330, 897, 510, 3283, 29973, 13, 29648, 1319, 673, 10834, 29914, 25580, 29962, 518, 29914, 25580, 29962, 518, 29914, 25580, 29962, 29871, 16564, 373, 278, 2183, 3030, 29892, 1244, 338, 278, 1234, 304, 278, 1139, 376, 5618, 526, 278, 13501, 304, 9330, 897, 510, 3283, 3026, 13, 13, 8439, 526, 2211, 13501, 304, 3414, 26227, 29901, 13, 13, 29896, 29889, 365, 26369, 411, 2560, 9508, 292, 29892, 1316, 408, 376, 7789, 567, 363, 1060, 29979, 29999, 1213, 470, 376, 5618, 526, 278, 1014, 1484, 1338, 363, 3657, 15387, 1060, 29979, 29999, 3026, 13, 29906, 29889, 5293, 3414, 29899, 14940, 11994, 29892, 763, 376, 6113, 263, 5828, 27887, 29908, 363, 5007, 263, 9554, 29889, 13, 29941, 29889, 2973, 5199, 10970, 29889, 2], 'total_duration': 9514823750, 'load_duration': 795542, 'sample_count': 99, 'sample_duration': 68732000, 'prompt_eval_count': 146, 'prompt_eval_duration': 6206275000, 'eval_count': 98, 'eval_duration': 3229641000}\n" - ] - } - ], - "source": [ - "from langchain.callbacks.base import BaseCallbackHandler\n", - "from langchain.schema import LLMResult\n", - "\n", - "\n", - "class GenerationStatisticsCallback(BaseCallbackHandler):\n", - " def on_llm_end(self, response: LLMResult, **kwargs) -> None:\n", - " print(response.generations[0][0].generation_info)\n", - "\n", - "\n", - "callback_manager = CallbackManager(\n", - " [StreamingStdOutCallbackHandler(), GenerationStatisticsCallback()]\n", - ")\n", - "\n", - "chat_model = ChatOllama(\n", - " model=\"llama2:13b-chat\", verbose=True, callback_manager=callback_manager\n", - ")\n", - "\n", - "qa_chain = RetrievalQA.from_chain_type(\n", - " chat_model,\n", - " retriever=vectorstore.as_retriever(),\n", - " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT},\n", - ")\n", - "\n", - "question = \"What are the approaches to Task Decomposition?\"\n", - "result = qa_chain({\"query\": question})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`eval_count` / (`eval_duration`/10e9) gets `tok / s`" - ] - }, - { - "cell_type": "code", - "execution_count": 17, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "30.343929867127645" + "AIMessage(content='90%')" ] }, - "execution_count": 17, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "98 / (3229641000 / 1000 / 1000 / 1000)" + "# Call the chat model with both messages and images\n", + "messages = [HumanMessage(content=\"What is the dollar based gross retention rate?\")]\n", + "chat_model(messages, images=[image_b64])" ] } ], @@ -535,7 +390,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/docs/docs/integrations/llms/ollama.ipynb b/docs/docs/integrations/llms/ollama.ipynb index e6bd21944883f..471b64d94b911 100644 --- a/docs/docs/integrations/llms/ollama.ipynb +++ b/docs/docs/integrations/llms/ollama.ipynb @@ -20,8 +20,8 @@ "\n", "* [Download](https://ollama.ai/download)\n", "* Fetch a model via `ollama pull `\n", - "* e.g., for `Llama-7b`: `ollama pull llama2` (see full list [here](https://github.com/jmorganca/ollama))\n", - "* This will download the most basic version of the model typically (e.g., smallest # parameters and `q4_0`)\n", + "* e.g., for `Llama-7b`: `ollama pull llama2` (see full list [here](https://ollama.ai/library)\n", + "* This will download the most basic version of the model typically (e.g., smallest # parameters)\n", "* On Mac, it will download to \n", "\n", "`~/.ollama/models/manifests/registry.ollama.ai/library//latest`\n", @@ -53,16 +53,16 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ + "from langchain.llms import Ollama\n", "from langchain.callbacks.manager import CallbackManager\n", "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler\n", - "from langchain.llms import Ollama\n", "\n", "llm = Ollama(\n", - " model=\"llama2\", callback_manager=CallbackManager([StreamingStdOutCallbackHandler()])\n", + " model=\"llama2\"\n", ")" ] }, @@ -70,360 +70,143 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With `StreamingStdOutCallbackHandler`, you will see tokens streamed." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "llm(\"Tell me about the history of AI\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Ollama supports embeddings via `OllamaEmbeddings`:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.embeddings import OllamaEmbeddings\n", - "\n", - "oembed = OllamaEmbeddings(base_url=\"http://localhost:11434\", model=\"llama2\")\n", - "oembed.embed_query(\"Llamas are social animals and live with others as a herd.\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## RAG\n", - "\n", - "We can use Olama with RAG, [just as shown here](https://python.langchain.com/docs/use_cases/question_answering/local_retrieval_qa).\n", - "\n", - "Let's use the 13b model:\n", + "Optionally, pass `StreamingStdOutCallbackHandler` to stream tokens:\n", "\n", "```\n", - "ollama pull llama2:13b\n", - "```\n", - "\n", - "Let's also use local embeddings from `OllamaEmbeddings` and `Chroma`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "! pip install chromadb" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Load web page\n", - "from langchain.document_loaders import WebBaseLoader\n", - "\n", - "loader = WebBaseLoader(\"https://lilianweng.github.io/posts/2023-06-23-agent/\")\n", - "data = loader.load()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Split into chunks\n", - "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", - "\n", - "text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=100)\n", - "all_splits = text_splitter.split_documents(data)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found model file at /Users/rlm/.cache/gpt4all/ggml-all-MiniLM-L6-v2-f16.bin\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "objc[77472]: Class GGMLMetalClass is implemented in both /Users/rlm/miniforge3/envs/llama2/lib/python3.9/site-packages/gpt4all/llmodel_DO_NOT_MODIFY/build/libreplit-mainline-metal.dylib (0x17f754208) and /Users/rlm/miniforge3/envs/llama2/lib/python3.9/site-packages/gpt4all/llmodel_DO_NOT_MODIFY/build/libllamamodel-mainline-metal.dylib (0x17fb80208). One of the two will be used. Which one is undefined.\n" - ] - } - ], - "source": [ - "# Embed and store\n", - "from langchain.embeddings import (\n", - " GPT4AllEmbeddings,\n", - " OllamaEmbeddings, # We can also try Ollama embeddings\n", + "llm = Ollama(\n", + " model=\"llama2\"\n", + " callback_manager=CallbackManager([StreamingStdOutCallbackHandler()\n", ")\n", - "from langchain.vectorstores import Chroma\n", - "\n", - "vectorstore = Chroma.from_documents(documents=all_splits, embedding=GPT4AllEmbeddings())" + "```" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "4" + "' Artificial intelligence (AI) has a rich and diverse history that spans several decades. Hinweis: This answer will provide an overview of the major milestones in the history of AI, but it is not exhaustive.\\n\\n1. Early Years (1950s-1960s): The term \"Artificial Intelligence\" was coined in 1956 by John McCarthy, a computer scientist who organized the first AI conference at Dartmouth College. In the 1950s and 1960s, researchers focused on developing rule-based systems and algorithms to simulate human intelligence.\\n2. Rule-Based Systems (1970s-1980s): The development of rule-based systems, such as Logical Theories II (LTP), allowed for the creation of more sophisticated AI models. These systems were designed to reason and make decisions based on a set of rules rather than through machine learning.\\n3. Expert Systems (1980s): Expert systems, which mimicked the decision-making abilities of human experts in specific domains, became popular in the 1980s. These systems were built using rule-based logic and knowledge representation techniques.\\n4. Machine Learning (1990s-2000s): The rise of machine learning led to the development of algorithms that could learn from data without being explicitly programmed. This allowed for more advanced AI capabilities, such as image recognition and natural language processing.\\n5. Deep Learning (2010s): The advent of deep learning, a subfield of machine learning, enabled the creation of complex neural networks that could learn to recognize patterns in large datasets. This led to significant advances in areas like computer vision, speech recognition, and natural language processing.\\n6. Natural Language Processing (NLP) (2000s-present): NLP has been a rapidly growing field in recent years, with the development of techniques such as word embeddings, attention mechanisms, and transformer models. These advances have enabled AI systems to better understand and generate human language.\\n7. Robotics and Control (1980s-present): The development of advanced robotics and control systems has enabled AI to interact with the physical world in new ways. This includes autonomous vehicles, drones, and other robots that can perform tasks such as object recognition, manipulation, and navigation.\\n8. Computer Vision (1990s-present): Advances in computer vision have enabled AI systems to interpret and understand visual data from images and videos. This has led to applications such as facial recognition, object detection, and autonomous driving.\\n9. Reinforcement Learning (2000s-present): Reinforcement learning is a type of machine learning that involves training AI agents to make decisions based on rewards or penalties. This has led to advances in areas like game playing, robotics, and autonomous driving.\\n10. Ethical and Social Implications (2000s-present): As AI has become more advanced and integrated into various aspects of society, there has been increased attention on the ethical and social implications of these technologies. This includes concerns about bias, privacy, and the impact of AI on employment and society as a whole.\\n\\nThese are some of the major milestones in the history of AI, but it\\'s important to note that the field is constantly evolving and new breakthroughs are being made regularly.'" ] }, - "execution_count": 7, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Retrieve\n", - "question = \"How can Task Decomposition be done?\"\n", - "docs = vectorstore.similarity_search(question)\n", - "len(docs)" + "llm(\"Tell me about the history of AI\")" ] }, { - "cell_type": "code", - "execution_count": 9, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "# RAG prompt\n", - "from langchain import hub\n", + "## Multi-modal\n", "\n", - "QA_CHAIN_PROMPT = hub.pull(\"rlm/rag-prompt-llama\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# LLM\n", - "from langchain.callbacks.manager import CallbackManager\n", - "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler\n", - "from langchain.llms import Ollama\n", + "Ollama has support for multi-modal LLMs, such as [bakllava](https://ollama.ai/library/bakllava) and [llava](https://ollama.ai/library/llava).\n", "\n", - "llm = Ollama(\n", - " model=\"llama2\",\n", - " verbose=True,\n", - " callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# QA chain\n", - "from langchain.chains import RetrievalQA\n", + "```\n", + "ollama pull bakllava\n", + "```\n", "\n", - "qa_chain = RetrievalQA.from_chain_type(\n", - " llm,\n", - " retriever=vectorstore.as_retriever(),\n", - " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT},\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " There are several approaches to task decomposition for AI agents, including:\n", - "\n", - "1. Chain of thought (CoT): This involves instructing the model to \"think step by step\" and use more test-time computation to decompose hard tasks into smaller and simpler steps.\n", - "2. Tree of thoughts (ToT): This extends CoT by exploring multiple reasoning possibilities at each step, creating a tree structure. The search process can be BFS or DFS with each state evaluated by a classifier or majority vote.\n", - "3. Using task-specific instructions: For example, \"Write a story outline.\" for writing a novel.\n", - "4. Human inputs: The agent can receive input from a human operator to perform tasks that require creativity and domain expertise.\n", - "\n", - "These approaches allow the agent to break down complex tasks into manageable subgoals, enabling efficient handling of tasks and improving the quality of final results through self-reflection and refinement." - ] - } - ], - "source": [ - "question = \"What are the various approaches to Task Decomposition for AI Agents?\"\n", - "result = qa_chain({\"query\": question})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also get logging for tokens." + "Be sure to update Ollama so that you have the most recent version to support multi-modal." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ - "from langchain.callbacks.base import BaseCallbackHandler\n", - "from langchain.schema import LLMResult\n", - "\n", - "\n", - "class GenerationStatisticsCallback(BaseCallbackHandler):\n", - " def on_llm_end(self, response: LLMResult, **kwargs) -> None:\n", - " print(response.generations[0][0].generation_info)\n", - "\n", - "\n", - "callback_manager = CallbackManager(\n", - " [StreamingStdOutCallbackHandler(), GenerationStatisticsCallback()]\n", - ")\n", - "\n", - "llm = Ollama(\n", - " base_url=\"http://localhost:11434\",\n", - " model=\"llama2\",\n", - " verbose=True,\n", - " callback_manager=callback_manager,\n", - ")\n", - "\n", - "qa_chain = RetrievalQA.from_chain_type(\n", - " llm,\n", - " retriever=vectorstore.as_retriever(),\n", - " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT},\n", - ")\n", - "\n", - "question = \"What are the approaches to Task Decomposition?\"\n", - "result = qa_chain({\"query\": question})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`eval_count` / (`eval_duration`/10e9) gets `tok / s`" + "from langchain.llms import Ollama\n", + "bakllava = Ollama(model=\"bakllava\")" ] }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "" + ], "text/plain": [ - "47.22003469910937" + "" ] }, - "execution_count": 57, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "62 / (1313002000 / 1000 / 1000 / 1000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using the Hub for prompt management\n", - " \n", - "Open-source models often benefit from specific prompts. \n", + "import base64\n", + "from PIL import Image\n", + "from io import BytesIO\n", + "from IPython.display import HTML, display\n", "\n", - "For example, [Mistral 7b](https://mistral.ai/news/announcing-mistral-7b/) was fine-tuned for chat using the prompt format shown [here](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.1).\n", + "def convert_to_base64(pil_image):\n", + " \"\"\"\n", + " Convert PIL images to Base64 encoded strings\n", "\n", - "Get the model: `ollama pull mistral:7b-instruct`" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "# LLM\n", - "from langchain.callbacks.manager import CallbackManager\n", - "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler\n", - "from langchain.llms import Ollama\n", + " :param pil_image: PIL image\n", + " :return: Re-sized Base64 string\n", + " \"\"\"\n", "\n", - "llm = Ollama(\n", - " model=\"mistral:7b-instruct\",\n", - " verbose=True,\n", - " callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain import hub\n", + " buffered = BytesIO()\n", + " pil_image.save(buffered, format=\"JPEG\") # You can change the format if needed\n", + " img_str = base64.b64encode(buffered.getvalue()).decode(\"utf-8\")\n", + " return img_str\n", "\n", - "QA_CHAIN_PROMPT = hub.pull(\"rlm/rag-prompt-mistral\")\n", + "def plt_img_base64(img_base64):\n", + " \"\"\"\n", + " Disply base64 encoded string as image\n", "\n", - "# QA chain\n", - "from langchain.chains import RetrievalQA\n", + " :param img_base64: Base64 string\n", + " \"\"\"\n", + " # Create an HTML img tag with the base64 string as the source\n", + " image_html = f''\n", + " # Display the image by rendering the HTML\n", + " display(HTML(image_html))\n", "\n", - "qa_chain = RetrievalQA.from_chain_type(\n", - " llm,\n", - " retriever=vectorstore.as_retriever(),\n", - " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT},\n", - ")" + "\n", + "file_path = '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'\n", + "pil_image = Image.open(file_path)\n", + "image_b64 = convert_to_base64(pil_image)\n", + "plt_img_base64(image_b64)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "There are different approaches to Task Decomposition for AI Agents such as Chain of thought (CoT) and Tree of Thoughts (ToT). CoT breaks down big tasks into multiple manageable tasks and generates multiple thoughts per step, while ToT explores multiple reasoning possibilities at each step. Task decomposition can be done by LLM with simple prompting or using task-specific instructions or human inputs." + "90%" ] + }, + { + "data": { + "text/plain": [ + "'90%'" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "question = \"What are the various approaches to Task Decomposition for AI Agents?\"\n", - "result = qa_chain({\"query\": question})" + "llm(prompt=\"What is the dollar based gross retention rate:\",\n", + " images=[image_b64])" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -442,7 +225,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.9.16" } }, "nbformat": 4, From 8adb93f262015bfbbe0c2c5567c149b512fa6dbc Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Thu, 14 Dec 2023 13:09:38 -0800 Subject: [PATCH 05/13] fmt --- docs/docs/integrations/chat/ollama.ipynb | 7 +++++-- docs/docs/integrations/llms/ollama.ipynb | 14 +++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index 93d0bda2ecaa1..49da5edcbcd19 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -321,6 +321,7 @@ "from io import BytesIO\n", "from IPython.display import HTML, display\n", "\n", + "\n", "def convert_to_base64(pil_image):\n", " \"\"\"\n", " Convert PIL images to Base64 encoded strings\n", @@ -330,10 +331,11 @@ " \"\"\"\n", "\n", " buffered = BytesIO()\n", - " pil_image.save(buffered, format=\"JPEG\") # You can change the format if needed\n", + " pil_image.save(buffered, format=\"JPEG\") # You can change the format if needed\n", " img_str = base64.b64encode(buffered.getvalue()).decode(\"utf-8\")\n", " return img_str\n", "\n", + "\n", "def plt_img_base64(img_base64):\n", " \"\"\"\n", " Disply base64 encoded string as image\n", @@ -345,7 +347,8 @@ " # Display the image by rendering the HTML\n", " display(HTML(image_html))\n", "\n", - "file_path = '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'\n", + "\n", + "file_path = \"/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg\"\n", "pil_image = Image.open(file_path)\n", "image_b64 = convert_to_base64(pil_image)\n", "plt_img_base64(image_b64)" diff --git a/docs/docs/integrations/llms/ollama.ipynb b/docs/docs/integrations/llms/ollama.ipynb index 471b64d94b911..03833811502d6 100644 --- a/docs/docs/integrations/llms/ollama.ipynb +++ b/docs/docs/integrations/llms/ollama.ipynb @@ -61,9 +61,7 @@ "from langchain.callbacks.manager import CallbackManager\n", "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler\n", "\n", - "llm = Ollama(\n", - " model=\"llama2\"\n", - ")" + "llm = Ollama(model=\"llama2\")" ] }, { @@ -122,6 +120,7 @@ "outputs": [], "source": [ "from langchain.llms import Ollama\n", + "\n", "bakllava = Ollama(model=\"bakllava\")" ] }, @@ -149,6 +148,7 @@ "from io import BytesIO\n", "from IPython.display import HTML, display\n", "\n", + "\n", "def convert_to_base64(pil_image):\n", " \"\"\"\n", " Convert PIL images to Base64 encoded strings\n", @@ -158,10 +158,11 @@ " \"\"\"\n", "\n", " buffered = BytesIO()\n", - " pil_image.save(buffered, format=\"JPEG\") # You can change the format if needed\n", + " pil_image.save(buffered, format=\"JPEG\") # You can change the format if needed\n", " img_str = base64.b64encode(buffered.getvalue()).decode(\"utf-8\")\n", " return img_str\n", "\n", + "\n", "def plt_img_base64(img_base64):\n", " \"\"\"\n", " Disply base64 encoded string as image\n", @@ -174,7 +175,7 @@ " display(HTML(image_html))\n", "\n", "\n", - "file_path = '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'\n", + "file_path = \"/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg\"\n", "pil_image = Image.open(file_path)\n", "image_b64 = convert_to_base64(pil_image)\n", "plt_img_base64(image_b64)" @@ -204,8 +205,7 @@ } ], "source": [ - "llm(prompt=\"What is the dollar based gross retention rate:\",\n", - " images=[image_b64])" + "llm(prompt=\"What is the dollar based gross retention rate:\", images=[image_b64])" ] } ], From b027f918f233602ca687b920b4b62f56cf33a5b3 Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Thu, 14 Dec 2023 13:13:57 -0800 Subject: [PATCH 06/13] fmt --- docs/docs/integrations/chat/ollama.ipynb | 3 ++- docs/docs/integrations/llms/ollama.ipynb | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index 49da5edcbcd19..1bdf778c5ddd0 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -317,9 +317,10 @@ ], "source": [ "import base64\n", - "from PIL import Image\n", "from io import BytesIO\n", + "\n", "from IPython.display import HTML, display\n", + "from PIL import Image\n", "\n", "\n", "def convert_to_base64(pil_image):\n", diff --git a/docs/docs/integrations/llms/ollama.ipynb b/docs/docs/integrations/llms/ollama.ipynb index 03833811502d6..b7d8c5cc7a26a 100644 --- a/docs/docs/integrations/llms/ollama.ipynb +++ b/docs/docs/integrations/llms/ollama.ipynb @@ -57,9 +57,9 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain.llms import Ollama\n", "from langchain.callbacks.manager import CallbackManager\n", "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler\n", + "from langchain.llms import Ollama\n", "\n", "llm = Ollama(model=\"llama2\")" ] @@ -144,9 +144,10 @@ ], "source": [ "import base64\n", - "from PIL import Image\n", "from io import BytesIO\n", + "\n", "from IPython.display import HTML, display\n", + "from PIL import Image\n", "\n", "\n", "def convert_to_base64(pil_image):\n", From dab8cd0461ffdf3388e99b0f75dced782a3f7b65 Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Fri, 15 Dec 2023 09:46:06 -0800 Subject: [PATCH 07/13] Pass image as msg --- docs/docs/integrations/chat/ollama.ipynb | 75 ++++++++++++------- .../langchain_community/chat_models/ollama.py | 15 +++- 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index 1bdf778c5ddd0..02624fcc63a3a 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -286,20 +286,7 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain.chat_models import ChatOllama\n", - "\n", - "chat_model = ChatOllama(\n", - " model=\"bakllava\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -318,11 +305,9 @@ "source": [ "import base64\n", "from io import BytesIO\n", - "\n", "from IPython.display import HTML, display\n", "from PIL import Image\n", "\n", - "\n", "def convert_to_base64(pil_image):\n", " \"\"\"\n", " Convert PIL images to Base64 encoded strings\n", @@ -351,30 +336,66 @@ "\n", "file_path = \"/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg\"\n", "pil_image = Image.open(file_path)\n", + "\n", "image_b64 = convert_to_base64(pil_image)\n", "plt_img_base64(image_b64)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 12, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "AIMessage(content='90%')" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "IMG!\n", + "['data:image/jpeg;base64,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4YsvCGhR6Rp8txLbxuzhrhlZ8scnkAD9Kdtbhc2aKWiqEJRRRQAUUUUAJiilooGJS0lFABRRRTAKKKKAEopaKAEooooGFJS0UwEopaOKAEooooAKKKKAEopaKBjcUUtFACUUUUwCiiigBKKWigYlFFFACUtFFAxKKKWmA2loooASiiloAbRS0YoGJRRRTAKSlooGJRS4pKACkpaKBiUUtJTA1aKKK5TnE60UtFACUUUUCCiiigApKWigBKKKKACkpaKAEopaKAEooopgcdrfwu8H+ILt7u+0eMXLnLywO0RY+pCkAn3Iq74d8BeGfCrmXSNKignIwZmZpJMem5iSPwxXSUUrDEopaSmIKWkooAKKKKAEoozRTAKKMUUAFFFFABik6UtFACUUYoxQAUUUUAFFFFABikpaKAEooxRTAKKKKACiiigAooooAKKKKAORi+G/hqHxUfEiW0w1IzGff57bd5zk7eneutxS0UAJRS0lACUUtFMBKKKKACiiigYUUUUAFJS0UAJRR0ooAKKKKACiiigBKKWigYlFFFABRRRimAUYoooASiloxQAlFFFAxKKWjFMBKKKKACkxS0UAFFFFAxKKWkxQAlFLRTASiiigAooooASilpKBhRRRQAUUUUDExRRmimAUUUlABSU6jFADaKXFJQMKKOtFMAxSUtFAxKKKKANSiiiuUwEpaKSmAUtJS0AJRRiigQUUUUAFJS0UAJRRRQAUUUUAFJS0UAJRRRTAKKKKAEopaSgAooooASiiimAUUUUAFFFFABRRRQAUUUUAJRS0UAJRQaKACiiigApKWigBKKWg0wEooooAKKKKACiiigAooooAKKKKACkpaKAEpMU7FJQAlFLSYpgFFFFAwooooAKKKKACkpaKAEoopcUAJRRRTAKTFLRSASilpMUDFpKKWmAlFLSUAFJS0UAJRS0lABRRRTGJRS0mKACiiigAooooAKSlozQMSkp1JQAlFLSUwCiiigApKWigYlFLSUAFJS0UAFJS0UxiUUtJQAlGKWigBKSnUlAxKKWkoAKSlopgalJRRXKYhRRRQAlFLSUwFzRSUUAFFLRigQlFFFABSUtFACUUtJQAUUUUAFJS0UAJRRRQAUUUUwCkpaKAEooooASiiimAUtVrq+trJczyhT2XqT+Fc3qPiZxG5iK20KjmRyM4+vQVcKUp7Fxp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FABRRRQAUUUUAFFFFABRRRQIKSlooGJjNRtEpqSigBqoF7U6iigQUUUUAFFFFMAooooASilpKACiiigBKKKKYwooooJCiiigAooooAKKKKACiiigBKKWkoAKKKKACiiigAooooAKKKKACkpaKBCUUUUAJRS0lMAooooAKKKKACjrRRQAxolalWMLTqKACiiigAooooAKKKKACiiigAooooAKSlooASiiigAooooAKKKKACiiigBKKWjFMBKKKKACiiigAooooAKKKKACiiigAooooGFFFFABSUtFAFuiiisSwooooASilpKACiiimAUUUUAFFFFABRRRQAlFLSUCCiiigApKWigBKKKKYBRRRQAUUUUAFFFFABRRRQAUUUUCCkpaKBiUUUUAFFFFAgooooAKKKKYBRRRQAlFLSUAFFFFABSUtFACUUUUwCiiigQUUUUAFFFFABRRRQAlFLSUAFFFFABRRRQAUUUUAFFFFABSUtFAhKKKKACkpaKAEopaSmAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAlFLSUAFFFFABRRRQAUUUUAFFFFACUtFFACUUUUwCiiigAooooAKKKKACiiigYUUUUAW6KKKxNAooooEFFFFACUUtJQAUUUUwCiiigAooooAKKKKAEopaSgQUUUUAFJS0UAJRRRTAKKKKACiiigAooooAKKKKACiiigQUlLRQMSiiigAooooEFFFFABRRRTAKKKKAEopaSgAooooAKSlooASilpKACiiimIKKKKACiiigAooooASilpKACiiigAooooAKKKKACiiigApKWigQlFFFABRRRQAlFLRQAlFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACjFFFACUUtJQAUUUUAFHFcZcePne61C10rQb2+k0+Ro7g71jUEMVG3qWyRwMZPpVK58ZeKjaGdPDUOnIFU79QnOGLMFVRwuCSe+MdTgVapy/porkkegUVyPgLxXdeKNPu5b6KCO4gmC7YVKjaRxkEk5yGrrs0pQcZOLE4tOzDFJS0UhCZopaTpQAUUUUAFFFFABRRRQAUUUUAW6KKKxNQooooAKKKKBBRRRQAlFLSUAFFFFMAooooAKKKKACiiigBKKWkoEFFFFABSUtFACUUUUwCiiigAooooAKKKKACiiigAooooEFJS0UDEooooAKKKKBBRRRQAUUUUwCiiigBKKWkoAKKKKACiiigBKKWkoAKKKKYgooooAKKKKACiiigBKKWkoAKKKKACiiigAooooAKKKKACkpaKBCUUUUAFFFFABRiiigBKKWkxQAUUUUwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooASilooA8gaaWy+Jms6CuoC0s9VkAlcxhjuZQ4Ck/dY7ioPPUcZxjrPEkIbw1rsd/qct7DLMoEcHlxNbDcu1CWIB5xnPJB981jax4Wi1f4rMZLhI/9FjvRGQcyFTsC/T5RnHOOnXIo6l4t0/Sru/vP7Bhn1Q3kiiSWMN9mZI0U/Ptyw8zdjBHHpmuqSUnHk3sjZ6tWHfB+RYbnV7Vn+ZxG8eAcOELBiD7bk/MVaji1y/j8Satb+Ir22fTr+6SGEnfFtj+YAg8Y5x7ehqh4C8Q6prPjgTalP57NYtChQDamCrE4XgE7efc1003gC4kn1Bf+EivYbC/uZLie1gQLu3nkbsntgdOfSirK1RuVru3mOTtJ3Of17xnqV/oukCxvI7C7No1/dyFwgOzKqq567mB+X/dqxrl1e6kND1fT9dv7aDWLmGBreKT5IMgK2MdSCD+Oa6jTvBGlWdxeSTww3sc4iSOK4hV1hSNdqqM5ycdT3qCDwLBbQWdvHfS/Z7PU/t8EZXOwdfLBz0zzn3NZ88FsieaPQ5jxH4j1HRdYgtrbVWlt9FSI3YmlCyXjuwymP4vk56cc1saobzXvG1vYWOuXdnZPpK3iNavgOTIQD+II/Kte08FaWlpexahFFqEt3PLPJPNCu5S/Xaf4cY7d6zF8AXcDWUlp4iubee2tPsnmrCCWj3s4HXjGQP8AgIoUofMOaJiS+JNftGn8OHUVkvl1KCzTUfKBIjkB5x03DaOuep5yM1fvLvV/BWrW8cmrTarZ3VpdS+XdD5keGPfkN1weBjpya108AaaNFksHubt7iS4F218ZP33nDo4P4n8z35p2n+C1j1D7fq+p3OrXCxNDGJwFREYYb5R1JBIz703KH9LcOaJzun3d5HcaFf6v4pvBeanJG8dpBFmAqzDCEDgZBxntz1xmvTK4q3+HwtrqyVNavG0yyuluobKQBgrqcjDemSeMdz35rtqio037pM2nsV7p5I4t6PHGByzOCcD2HeqrXV0n2ZpFRfMKgpsPU9ct0HsKuT20dyqrKGIVtw2uV5/A0z7DBvVyHJGDzIxzjpnnn8azILFFFFMC3RSmkrE1CiiigAooooAKKKKBBRRRQAlFLSUAFFFFMAooooAKKKKACiiigBKKDRQIKKKKACkpaKAEooopgFFFFABRRRQAUUUUAFFFFABRRRQIKSloNAxKKKKACiiigQUUUUAFFFFMAooooASilpKACiiigAooooASig0UAFFFFAgooopgFFFFABRRRQAlFFFABRRRQAUUUUAFFFFABRRRQAUYoooEJRS0lABRRRQAUUUUAFJS0UAJRS0lMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIp4VuIWicuFYYJjdkb8GUgj8DVKDQNJtSrR6fbmRc4ldA8hyckl2yxOSTknvWlRQAlFLSUAFFFFABRRRQAUUUUAFFFFACGilpKYBRScKowopkFtHaQrDEoVE+UAADpx0HA6DgcADBcD/2Q==']\n" + ] + }, + { + "ename": "ValueError", + "evalue": "Ollama call failed with status code 400. Details: illegal base64 data at input byte 4", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[12], line 22\u001b[0m\n\u001b[1;32m 20\u001b[0m messages\u001b[38;5;241m.\u001b[39mappend(text_message)\n\u001b[1;32m 21\u001b[0m prompt \u001b[38;5;241m=\u001b[39m [HumanMessage(content\u001b[38;5;241m=\u001b[39mmessages)]\n\u001b[0;32m---> 22\u001b[0m \u001b[43mchat_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/llama2/lib/python3.9/site-packages/langchain_core/language_models/chat_models.py:632\u001b[0m, in \u001b[0;36mBaseChatModel.__call__\u001b[0;34m(self, messages, stop, callbacks, **kwargs)\u001b[0m\n\u001b[1;32m 625\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\n\u001b[1;32m 626\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 627\u001b[0m messages: List[BaseMessage],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 630\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 631\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m BaseMessage:\n\u001b[0;32m--> 632\u001b[0m generation \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 633\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallbacks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 634\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mgenerations[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 635\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(generation, ChatGeneration):\n\u001b[1;32m 636\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m generation\u001b[38;5;241m.\u001b[39mmessage\n", + "File \u001b[0;32m~/miniforge3/envs/llama2/lib/python3.9/site-packages/langchain_core/language_models/chat_models.py:378\u001b[0m, in \u001b[0;36mBaseChatModel.generate\u001b[0;34m(self, messages, stop, callbacks, tags, metadata, run_name, **kwargs)\u001b[0m\n\u001b[1;32m 376\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_managers:\n\u001b[1;32m 377\u001b[0m run_managers[i]\u001b[38;5;241m.\u001b[39mon_llm_error(e, response\u001b[38;5;241m=\u001b[39mLLMResult(generations\u001b[38;5;241m=\u001b[39m[]))\n\u001b[0;32m--> 378\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[1;32m 379\u001b[0m flattened_outputs \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 380\u001b[0m LLMResult(generations\u001b[38;5;241m=\u001b[39m[res\u001b[38;5;241m.\u001b[39mgenerations], llm_output\u001b[38;5;241m=\u001b[39mres\u001b[38;5;241m.\u001b[39mllm_output)\n\u001b[1;32m 381\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m res \u001b[38;5;129;01min\u001b[39;00m results\n\u001b[1;32m 382\u001b[0m ]\n\u001b[1;32m 383\u001b[0m llm_output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_combine_llm_outputs([res\u001b[38;5;241m.\u001b[39mllm_output \u001b[38;5;28;01mfor\u001b[39;00m res \u001b[38;5;129;01min\u001b[39;00m results])\n", + "File \u001b[0;32m~/miniforge3/envs/llama2/lib/python3.9/site-packages/langchain_core/language_models/chat_models.py:368\u001b[0m, in \u001b[0;36mBaseChatModel.generate\u001b[0;34m(self, messages, stop, callbacks, tags, metadata, run_name, **kwargs)\u001b[0m\n\u001b[1;32m 365\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(messages):\n\u001b[1;32m 366\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 367\u001b[0m results\u001b[38;5;241m.\u001b[39mappend(\n\u001b[0;32m--> 368\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_generate_with_cache\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 369\u001b[0m \u001b[43m \u001b[49m\u001b[43mm\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 370\u001b[0m \u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 371\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_managers\u001b[49m\u001b[43m[\u001b[49m\u001b[43mi\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrun_managers\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 372\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 373\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 374\u001b[0m )\n\u001b[1;32m 375\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 376\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_managers:\n", + "File \u001b[0;32m~/miniforge3/envs/llama2/lib/python3.9/site-packages/langchain_core/language_models/chat_models.py:524\u001b[0m, in \u001b[0;36mBaseChatModel._generate_with_cache\u001b[0;34m(self, messages, stop, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 520\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 521\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAsked to cache, but no cache found at `langchain.cache`.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 522\u001b[0m )\n\u001b[1;32m 523\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m new_arg_supported:\n\u001b[0;32m--> 524\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_generate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 525\u001b[0m \u001b[43m \u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 526\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 527\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 528\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_generate(messages, stop\u001b[38;5;241m=\u001b[39mstop, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "File \u001b[0;32m~/Desktop/Code/langchain-main/langchain/libs/community/langchain_community/chat_models/ollama.py:111\u001b[0m, in \u001b[0;36mChatOllama._generate\u001b[0;34m(self, messages, stop, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 109\u001b[0m prompt \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_format_messages_as_text(messages)\n\u001b[1;32m 110\u001b[0m images \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_extract_images(messages)\n\u001b[0;32m--> 111\u001b[0m final_chunk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_stream_with_aggregation\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 112\u001b[0m \u001b[43m \u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 113\u001b[0m \u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 114\u001b[0m \u001b[43m \u001b[49m\u001b[43mimages\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mimages\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 115\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 116\u001b[0m \u001b[43m \u001b[49m\u001b[43mverbose\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mverbose\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 117\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 118\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 119\u001b[0m chat_generation \u001b[38;5;241m=\u001b[39m ChatGeneration(\n\u001b[1;32m 120\u001b[0m message\u001b[38;5;241m=\u001b[39mAIMessage(content\u001b[38;5;241m=\u001b[39mfinal_chunk\u001b[38;5;241m.\u001b[39mtext),\n\u001b[1;32m 121\u001b[0m generation_info\u001b[38;5;241m=\u001b[39mfinal_chunk\u001b[38;5;241m.\u001b[39mgeneration_info,\n\u001b[1;32m 122\u001b[0m )\n\u001b[1;32m 123\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ChatResult(generations\u001b[38;5;241m=\u001b[39m[chat_generation])\n", + "File \u001b[0;32m~/Desktop/Code/langchain-main/langchain/libs/community/langchain_community/llms/ollama.py:189\u001b[0m, in \u001b[0;36m_OllamaCommon._stream_with_aggregation\u001b[0;34m(self, prompt, stop, run_manager, verbose, **kwargs)\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_stream_with_aggregation\u001b[39m(\n\u001b[1;32m 181\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 182\u001b[0m prompt: \u001b[38;5;28mstr\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 187\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m GenerationChunk:\n\u001b[1;32m 188\u001b[0m final_chunk: Optional[GenerationChunk] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 189\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m stream_resp \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_create_stream\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 190\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m stream_resp:\n\u001b[1;32m 191\u001b[0m chunk \u001b[38;5;241m=\u001b[39m _stream_response_to_generation_chunk(stream_resp)\n", + "File \u001b[0;32m~/Desktop/Code/langchain-main/langchain/libs/community/langchain_community/llms/ollama.py:174\u001b[0m, in \u001b[0;36m_OllamaCommon._create_stream\u001b[0;34m(self, prompt, stop, images, **kwargs)\u001b[0m\n\u001b[1;32m 172\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m200\u001b[39m:\n\u001b[1;32m 173\u001b[0m optional_detail \u001b[38;5;241m=\u001b[39m response\u001b[38;5;241m.\u001b[39mjson()\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124merror\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 174\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 175\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOllama call failed with status code \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mresponse\u001b[38;5;241m.\u001b[39mstatus_code\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 176\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Details: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00moptional_detail\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 177\u001b[0m )\n\u001b[1;32m 178\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\u001b[38;5;241m.\u001b[39miter_lines(decode_unicode\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "\u001b[0;31mValueError\u001b[0m: Ollama call failed with status code 400. Details: illegal base64 data at input byte 4" + ] } ], "source": [ + "from langchain.chat_models import ChatOllama\n", + "from langchain_core.messages import HumanMessage\n", + "\n", + "chat_model = ChatOllama(\n", + " model=\"bakllava\",\n", + ")\n", + "\n", "# Call the chat model with both messages and images\n", - "messages = [HumanMessage(content=\"What is the dollar based gross retention rate?\")]\n", - "chat_model(messages, images=[image_b64])" + "messages = []\n", + "image_message = {\n", + " \"type\": \"image_url\",\n", + " \"image_url\": {\"url\": f\"data:image/jpeg;base64,{image_b64}\"},\n", + "}\n", + "text_message = {\n", + " \"type\": \"text\",\n", + " \"text\": \"What is the Daollar-based gross retention rate?\"\n", + "}\n", + "\n", + "messages.append(image_message)\n", + "messages.append(text_message)\n", + "prompt = [HumanMessage(content=messages)]\n", + "chat_model(prompt)" ] } ], diff --git a/libs/community/langchain_community/chat_models/ollama.py b/libs/community/langchain_community/chat_models/ollama.py index 7e129326e157f..d291c2b89e000 100644 --- a/libs/community/langchain_community/chat_models/ollama.py +++ b/libs/community/langchain_community/chat_models/ollama.py @@ -56,7 +56,10 @@ def _format_message_as_text(self, message: BaseMessage) -> str: if isinstance(message, ChatMessage): message_text = f"\n\n{message.role.capitalize()}: {message.content}" elif isinstance(message, HumanMessage): - message_text = f"[INST] {message.content} [/INST]" + if message.content[0].get("type") == "text": + message_text = f"[INST] {message.content[0]['text']} [/INST]" + elif message.content[0].get("type") == "image_url": + message_text = message.content[0]["image_url"]["url"] elif isinstance(message, AIMessage): message_text = f"{message.content}" elif isinstance(message, SystemMessage): @@ -70,11 +73,17 @@ def _format_messages_as_text(self, messages: List[BaseMessage]) -> str: [self._format_message_as_text(message) for message in messages] ) + def _extract_images(self, messages: List[BaseMessage]) -> List[str]: + images = [] + for message in messages: + if isinstance(message, (ChatMessage, HumanMessage)) and message.content[0].get("type") == "image_url": + images.append(message.content[0]["image_url"]["url"]) + return images + def _generate( self, messages: List[BaseMessage], stop: Optional[List[str]] = None, - images: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any, ) -> ChatResult: @@ -96,6 +105,7 @@ def _generate( """ prompt = self._format_messages_as_text(messages) + images = self._extract_images(messages) final_chunk = super()._stream_with_aggregation( prompt, stop=stop, @@ -119,6 +129,7 @@ def _stream( **kwargs: Any, ) -> Iterator[ChatGenerationChunk]: prompt = self._format_messages_as_text(messages) + images = self._extract_images(messages) for stream_resp in self._create_stream(prompt, stop, images, **kwargs): if stream_resp: chunk = _stream_response_to_chat_generation_chunk(stream_resp) From 3404d71f8a641e6de22a60b1dd51bc2353f09f9e Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Fri, 15 Dec 2023 10:47:38 -0800 Subject: [PATCH 08/13] Update b64 img str --- docs/docs/integrations/chat/ollama.ipynb | 39 +++++++++---------- .../langchain_community/chat_models/ollama.py | 7 +++- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index 02624fcc63a3a..5759f5d60aaeb 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -286,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -343,7 +343,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -351,26 +351,18 @@ "output_type": "stream", "text": [ "IMG!\n", - "['data:image/jpeg;base64,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4YsvCGhR6Rp8txLbxuzhrhlZ8scnkAD9Kdtbhc2aKWiqEJRRRQAUUUUAJiilooGJS0lFABRRRTAKKKKAEopaKAEooooGFJS0UwEopaOKAEooooAKKKKAEopaKBjcUUtFACUUUUwCiiigBKKWigYlFFFACUtFFAxKKKWmA2loooASiiloAbRS0YoGJRRRTAKSlooGJRS4pKACkpaKBiUUtJTA1aKKK5TnE60UtFACUUUUCCiiigApKWigBKKKKACkpaKAEopaKAEooopgcdrfwu8H+ILt7u+0eMXLnLywO0RY+pCkAn3Iq74d8BeGfCrmXSNKignIwZmZpJMem5iSPwxXSUUrDEopaSmIKWkooAKKKKAEoozRTAKKMUUAFFFFABik6UtFACUUYoxQAUUUUAFFFFABikpaKAEooxRTAKKKKACiiigAooooAKKKKAORi+G/hqHxUfEiW0w1IzGff57bd5zk7eneutxS0UAJRS0lACUUtFMBKKKKACiiigYUUUUAFJS0UAJRR0ooAKKKKACiiigBKKWigYlFFFABRRRimAUYoooASiloxQAlFFFAxKKWjFMBKKKKACkxS0UAFFFFAxKKWkxQAlFLRTASiiigAooooASilpKBhRRRQAUUUUDExRRmimAUUUlABSU6jFADaKXFJQMKKOtFMAxSUtFAxKKKKANSiiiuUwEpaKSmAUtJS0AJRRiigQUUUUAFJS0UAJRRRQAUUUUAFJS0UAJRRRTAKKKKAEopaSgAooooASiiimAUUUUAFFFFABRRRQAUUUUAJRS0UAJRQaKACiiigApKWigBKKWg0wEooooAKKKKACiiigAooooAKKKKACkpaKAEpMU7FJQAlFLSYpgFFFFAwooooAKKKKACkpaKAEoopcUAJRRRTAKTFLRSASilpMUDFpKKWmAlFLSUAFJS0UAJRS0lABRRRTGJRS0mKACiiigAooooAKSlozQMSkp1JQAlFLSUwCiiigApKWigYlFLSUAFJS0UAFJS0UxiUUtJQAlGKWigBKSnUlAxKKWkoAKSlopgalJRRXKYhRRRQAlFLSUwFzRSUUAFFLRigQlFFFABSUtFACUUtJQAUUUUAFJS0UAJRRRQAUUUUwCkpaKAEooooASiiimAUtVrq+trJczyhT2XqT+Fc3qPiZxG5iK20KjmRyM4+vQVcKUp7Fxp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FABRRRQAUUUUAFFFFABRRRQIKSlooGJjNRtEpqSigBqoF7U6iigQUUUUAFFFFMAooooASilpKACiiigBKKKKYwooooJCiiigAooooAKKKKACiiigBKKWkoAKKKKACiiigAooooAKKKKACkpaKBCUUUUAJRS0lMAooooAKKKKACjrRRQAxolalWMLTqKACiiigAooooAKKKKACiiigAooooAKSlooASiiigAooooAKKKKACiiigBKKWjFMBKKKKACiiigAooooAKKKKACiiigAooooGFFFFABSUtFAFuiiisSwooooASilpKACiiimAUUUUAFFFFABRRRQAlFLSUCCiiigApKWigBKKKKYBRRRQAUUUUAFFFFABRRRQAUUUUCCkpaKBiUUUUAFFFFAgooooAKKKKYBRRRQAlFLSUAFFFFABSUtFACUUUUwCiiigQUUUUAFFFFABRRRQAlFLSUAFFFFABRRRQAUUUUAFFFFABSUtFAhKKKKACkpaKAEopaSmAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAlFLSUAFFFFABRRRQAUUUUAFFFFACUtFFACUUUUwCiiigAooooAKKKKACiiigYUUUUAW6KKKxNAooooEFFFFACUUtJQAUUUUwCiiigAooooAKKKKAEopaSgQUUUUAFJS0UAJRRRTAKKKKACiiigAooooAKKKKACiiigQUlLRQMSiiigAooooEFFFFABRRRTAKKKKAEopaSgAooooAKSlooASilpKACiiimIKKKKACiiigAooooASilpKACiiigAooooAKKKKACiiigApKWigQlFFFABRRRQAlFLRQAlFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACjFFFACUUtJQAUUUUAFHFcZcePne61C10rQb2+k0+Ro7g71jUEMVG3qWyRwMZPpVK58ZeKjaGdPDUOnIFU79QnOGLMFVRwuCSe+MdTgVapy/porkkegUVyPgLxXdeKNPu5b6KCO4gmC7YVKjaRxkEk5yGrrs0pQcZOLE4tOzDFJS0UhCZopaTpQAUUUUAFFFFABRRRQAUUUUAW6KKKxNQooooAKKKKBBRRRQAlFLSUAFFFFMAooooAKKKKACiiigBKKWkoEFFFFABSUtFACUUUUwCiiigAooooAKKKKACiiigAooooEFJS0UDEooooAKKKKBBRRRQAUUUUwCiiigBKKWkoAKKKKACiiigBKKWkoAKKKKYgooooAKKKKACiiigBKKWkoAKKKKACiiigAooooAKKKKACkpaKBCUUUUAFFFFABRiiigBKKWkxQAUUUUwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooASilooA8gaaWy+Jms6CuoC0s9VkAlcxhjuZQ4Ck/dY7ioPPUcZxjrPEkIbw1rsd/qct7DLMoEcHlxNbDcu1CWIB5xnPJB981jax4Wi1f4rMZLhI/9FjvRGQcyFTsC/T5RnHOOnXIo6l4t0/Sru/vP7Bhn1Q3kiiSWMN9mZI0U/Ptyw8zdjBHHpmuqSUnHk3sjZ6tWHfB+RYbnV7Vn+ZxG8eAcOELBiD7bk/MVaji1y/j8Satb+Ir22fTr+6SGEnfFtj+YAg8Y5x7ehqh4C8Q6prPjgTalP57NYtChQDamCrE4XgE7efc1003gC4kn1Bf+EivYbC/uZLie1gQLu3nkbsntgdOfSirK1RuVru3mOTtJ3Of17xnqV/oukCxvI7C7No1/dyFwgOzKqq567mB+X/dqxrl1e6kND1fT9dv7aDWLmGBreKT5IMgK2MdSCD+Oa6jTvBGlWdxeSTww3sc4iSOK4hV1hSNdqqM5ycdT3qCDwLBbQWdvHfS/Z7PU/t8EZXOwdfLBz0zzn3NZ88FsieaPQ5jxH4j1HRdYgtrbVWlt9FSI3YmlCyXjuwymP4vk56cc1saobzXvG1vYWOuXdnZPpK3iNavgOTIQD+II/Kte08FaWlpexahFFqEt3PLPJPNCu5S/Xaf4cY7d6zF8AXcDWUlp4iubee2tPsnmrCCWj3s4HXjGQP8AgIoUofMOaJiS+JNftGn8OHUVkvl1KCzTUfKBIjkB5x03DaOuep5yM1fvLvV/BWrW8cmrTarZ3VpdS+XdD5keGPfkN1weBjpya108AaaNFksHubt7iS4F218ZP33nDo4P4n8z35p2n+C1j1D7fq+p3OrXCxNDGJwFREYYb5R1JBIz703KH9LcOaJzun3d5HcaFf6v4pvBeanJG8dpBFmAqzDCEDgZBxntz1xmvTK4q3+HwtrqyVNavG0yyuluobKQBgrqcjDemSeMdz35rtqio037pM2nsV7p5I4t6PHGByzOCcD2HeqrXV0n2ZpFRfMKgpsPU9ct0HsKuT20dyqrKGIVtw2uV5/A0z7DBvVyHJGDzIxzjpnnn8azILFFFFMC3RSmkrE1CiiigAooooAKKKKBBRRRQAlFLSUAFFFFMAooooAKKKKACiiigBKKDRQIKKKKACkpaKAEooopgFFFFABRRRQAUUUUAFFFFABRRRQIKSloNAxKKKKACiiigQUUUUAFFFFMAooooASilpKACiiigAooooASig0UAFFFFAgooopgFFFFABRRRQAlFFFABRRRQAUUUUAFFFFABRRRQAUYoooEJRS0lABRRRQAUUUUAFJS0UAJRS0lMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIp4VuIWicuFYYJjdkb8GUgj8DVKDQNJtSrR6fbmRc4ldA8hyckl2yxOSTknvWlRQAlFLSUAFFFFABRRRQAUUUUAFFFFACGilpKYBRScKowopkFtHaQrDEoVE+UAADpx0HA6DgcADBcD/2Q==']\n" + "['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4YsvCGhR6Rp8txLbxuzhrhlZ8scnkAD9Kdtbhc2aKWiqEJRRRQAUUUUAJiilooGJS0lFABRRRTAKKKKAEopaKAEooooGFJS0UwEopaOKAEooooAKKKKAEopaKBjcUUtFACUUUUwCiiigBKKWigYlFFFACUtFFAxKKKWmA2loooASiiloAbRS0YoGJRRRTAKSlooGJRS4pKACkpaKBiUUtJTA1aKKK5TnE60UtFACUUUUCCiiigApKWigBKKKKACkpaKAEopaKAEooopgcdrfwu8H+ILt7u+0eMXLnLywO0RY+pCkAn3Iq74d8BeGfCrmXSNKignIwZmZpJMem5iSPwxXSUUrDEopaSmIKWkooAKKKKAEoozRTAKKMUUAFFFFABik6UtFACUUYoxQAUUUUAFFFFABikpaKAEooxRTAKKKKACiiigAooooAKKKKAORi+G/hqHxUfEiW0w1IzGff57bd5zk7eneutxS0UAJRS0lACUUtFMBKKKKACiiigYUUUUAFJS0UAJRR0ooAKKKKACiiigBKKWigYlFFFABRRRimAUYoooASiloxQAlFFFAxKKWjFMBKKKKACkxS0UAFFFFAxKKWkxQAlFLRTASiiigAooooASilpKBhRRRQAUUUUDExRRmimAUUUlABSU6jFADaKXFJQMKKOtFMAxSUtFAxKKKKANSiiiuUwEpaKSmAUtJS0AJRRiigQUUUUAFJS0UAJRRRQAUUUUAFJS0UAJRRRTAKKKKAEopaSgAooooASiiimAUUUUAFFFFABRRRQAUUUUAJRS0UAJRQaKACiiigApKWigBKKWg0wEooooAKKKKACiiigAooooAKKKKACkpaKAEpMU7FJQAlFLSYpgFFFFAwooooAKKKKACkpaKAEoopcUAJRRRTAKTFLRSASilpMUDFpKKWmAlFLSUAFJS0UAJRS0lABRRRTGJRS0mKACiiigAooooAKSlozQMSkp1JQAlFLSUwCiiigApKWigYlFLSUAFJS0UAFJS0UxiUUtJQAlGKWigBKSnUlAxKKWkoAKSlopgalJRRXKYhRRRQAlFLSUwFzRSUUAFFLRigQlFFFABSUtFACUUtJQAUUUUAFJS0UAJRRRQAUUUUwCkpaKAEooooASiiimAUtVrq+trJczyhT2XqT+Fc3qPiZxG5iK20KjmRyM4+vQVcKUp7Fxp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FABRRRQAUUUUAFFFFABRRRQIKSlooGJjNRtEpqSigBqoF7U6iigQUUUUAFFFFMAooooASilpKACiiigBKKKKYwooooJCiiigAooooAKKKKACiiigBKKWkoAKKKKACiiigAooooAKKKKACkpaKBCUUUUAJRS0lMAooooAKKKKACjrRRQAxolalWMLTqKACiiigAooooAKKKKACiiigAooooAKSlooASiiigAooooAKKKKACiiigBKKWjFMBKKKKACiiigAooooAKKKKACiiigAooooGFFFFABSUtFAFuiiisSwooooASilpKACiiimAUUUUAFFFFABRRRQAlFLSUCCiiigApKWigBKKKKYBRRRQAUUUUAFFFFABRRRQAUUUUCCkpaKBiUUUUAFFFFAgooooAKKKKYBRRRQAlFLSUAFFFFABSUtFACUUUUwCiiigQUUUUAFFFFABRRRQAlFLSUAFFFFABRRRQAUUUUAFFFFABSUtFAhKKKKACkpaKAEopaSmAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAlFLSUAFFFFABRRRQAUUUUAFFFFACUtFFACUUUUwCiiigAooooAKKKKACiiigYUUUUAW6KKKxNAooooEFFFFACUUtJQAUUUUwCiiigAooooAKKKKAEopaSgQUUUUAFJS0UAJRRRTAKKKKACiiigAooooAKKKKACiiigQUlLRQMSiiigAooooEFFFFABRRRTAKKKKAEopaSgAooooAKSlooASilpKACiiimIKKKKACiiigAooooASilpKACiiigAooooAKKKKACiiigApKWigQlFFFABRRRQAlFLRQAlFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACjFFFACUUtJQAUUUUAFHFcZcePne61C10rQb2+k0+Ro7g71jUEMVG3qWyRwMZPpVK58ZeKjaGdPDUOnIFU79QnOGLMFVRwuCSe+MdTgVapy/porkkegUVyPgLxXdeKNPu5b6KCO4gmC7YVKjaRxkEk5yGrrs0pQcZOLE4tOzDFJS0UhCZopaTpQAUUUUAFFFFABRRRQAUUUUAW6KKKxNQooooAKKKKBBRRRQAlFLSUAFFFFMAooooAKKKKACiiigBKKWkoEFFFFABSUtFACUUUUwCiiigAooooAKKKKACiiigAooooEFJS0UDEooooAKKKKBBRRRQAUUUUwCiiigBKKWkoAKKKKACiiigBKKWkoAKKKKYgooooAKKKKACiiigBKKWkoAKKKKACiiigAooooAKKKKACkpaKBCUUUUAFFFFABRiiigBKKWkxQAUUUUwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooASilooA8gaaWy+Jms6CuoC0s9VkAlcxhjuZQ4Ck/dY7ioPPUcZxjrPEkIbw1rsd/qct7DLMoEcHlxNbDcu1CWIB5xnPJB981jax4Wi1f4rMZLhI/9FjvRGQcyFTsC/T5RnHOOnXIo6l4t0/Sru/vP7Bhn1Q3kiiSWMN9mZI0U/Ptyw8zdjBHHpmuqSUnHk3sjZ6tWHfB+RYbnV7Vn+ZxG8eAcOELBiD7bk/MVaji1y/j8Satb+Ir22fTr+6SGEnfFtj+YAg8Y5x7ehqh4C8Q6prPjgTalP57NYtChQDamCrE4XgE7efc1003gC4kn1Bf+EivYbC/uZLie1gQLu3nkbsntgdOfSirK1RuVru3mOTtJ3Of17xnqV/oukCxvI7C7No1/dyFwgOzKqq567mB+X/dqxrl1e6kND1fT9dv7aDWLmGBreKT5IMgK2MdSCD+Oa6jTvBGlWdxeSTww3sc4iSOK4hV1hSNdqqM5ycdT3qCDwLBbQWdvHfS/Z7PU/t8EZXOwdfLBz0zzn3NZ88FsieaPQ5jxH4j1HRdYgtrbVWlt9FSI3YmlCyXjuwymP4vk56cc1saobzXvG1vYWOuXdnZPpK3iNavgOTIQD+II/Kte08FaWlpexahFFqEt3PLPJPNCu5S/Xaf4cY7d6zF8AXcDWUlp4iubee2tPsnmrCCWj3s4HXjGQP8AgIoUofMOaJiS+JNftGn8OHUVkvl1KCzTUfKBIjkB5x03DaOuep5yM1fvLvV/BWrW8cmrTarZ3VpdS+XdD5keGPfkN1weBjpya108AaaNFksHubt7iS4F218ZP33nDo4P4n8z35p2n+C1j1D7fq+p3OrXCxNDGJwFREYYb5R1JBIz703KH9LcOaJzun3d5HcaFf6v4pvBeanJG8dpBFmAqzDCEDgZBxntz1xmvTK4q3+HwtrqyVNavG0yyuluobKQBgrqcjDemSeMdz35rtqio037pM2nsV7p5I4t6PHGByzOCcD2HeqrXV0n2ZpFRfMKgpsPU9ct0HsKuT20dyqrKGIVtw2uV5/A0z7DBvVyHJGDzIxzjpnnn8azILFFFFMC3RSmkrE1CiiigAooooAKKKKBBRRRQAlFLSUAFFFFMAooooAKKKKACiiigBKKDRQIKKKKACkpaKAEooopgFFFFABRRRQAUUUUAFFFFABRRRQIKSloNAxKKKKACiiigQUUUUAFFFFMAooooASilpKACiiigAooooASig0UAFFFFAgooopgFFFFABRRRQAlFFFABRRRQAUUUUAFFFFABRRRQAUYoooEJRS0lABRRRQAUUUUAFJS0UAJRS0lMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIp4VuIWicuFYYJjdkb8GUgj8DVKDQNJtSrR6fbmRc4ldA8hyckl2yxOSTknvWlRQAlFLSUAFFFFABRRRQAUUUUAFFFFACGilpKYBRScKowopkFtHaQrDEoVE+UAADpx0HA6DgcADBcD/2Q==']\n" ] }, { - "ename": "ValueError", - "evalue": "Ollama call failed with status code 400. Details: illegal base64 data at input byte 4", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[12], line 22\u001b[0m\n\u001b[1;32m 20\u001b[0m messages\u001b[38;5;241m.\u001b[39mappend(text_message)\n\u001b[1;32m 21\u001b[0m prompt \u001b[38;5;241m=\u001b[39m [HumanMessage(content\u001b[38;5;241m=\u001b[39mmessages)]\n\u001b[0;32m---> 22\u001b[0m \u001b[43mchat_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniforge3/envs/llama2/lib/python3.9/site-packages/langchain_core/language_models/chat_models.py:632\u001b[0m, in \u001b[0;36mBaseChatModel.__call__\u001b[0;34m(self, messages, stop, callbacks, **kwargs)\u001b[0m\n\u001b[1;32m 625\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\n\u001b[1;32m 626\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 627\u001b[0m messages: List[BaseMessage],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 630\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 631\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m BaseMessage:\n\u001b[0;32m--> 632\u001b[0m generation \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 633\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallbacks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 634\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mgenerations[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 635\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(generation, ChatGeneration):\n\u001b[1;32m 636\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m generation\u001b[38;5;241m.\u001b[39mmessage\n", - "File \u001b[0;32m~/miniforge3/envs/llama2/lib/python3.9/site-packages/langchain_core/language_models/chat_models.py:378\u001b[0m, in \u001b[0;36mBaseChatModel.generate\u001b[0;34m(self, messages, stop, callbacks, tags, metadata, run_name, **kwargs)\u001b[0m\n\u001b[1;32m 376\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_managers:\n\u001b[1;32m 377\u001b[0m run_managers[i]\u001b[38;5;241m.\u001b[39mon_llm_error(e, response\u001b[38;5;241m=\u001b[39mLLMResult(generations\u001b[38;5;241m=\u001b[39m[]))\n\u001b[0;32m--> 378\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[1;32m 379\u001b[0m flattened_outputs \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 380\u001b[0m LLMResult(generations\u001b[38;5;241m=\u001b[39m[res\u001b[38;5;241m.\u001b[39mgenerations], llm_output\u001b[38;5;241m=\u001b[39mres\u001b[38;5;241m.\u001b[39mllm_output)\n\u001b[1;32m 381\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m res \u001b[38;5;129;01min\u001b[39;00m results\n\u001b[1;32m 382\u001b[0m ]\n\u001b[1;32m 383\u001b[0m llm_output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_combine_llm_outputs([res\u001b[38;5;241m.\u001b[39mllm_output \u001b[38;5;28;01mfor\u001b[39;00m res \u001b[38;5;129;01min\u001b[39;00m results])\n", - "File \u001b[0;32m~/miniforge3/envs/llama2/lib/python3.9/site-packages/langchain_core/language_models/chat_models.py:368\u001b[0m, in \u001b[0;36mBaseChatModel.generate\u001b[0;34m(self, messages, stop, callbacks, tags, metadata, run_name, **kwargs)\u001b[0m\n\u001b[1;32m 365\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(messages):\n\u001b[1;32m 366\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 367\u001b[0m results\u001b[38;5;241m.\u001b[39mappend(\n\u001b[0;32m--> 368\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_generate_with_cache\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 369\u001b[0m \u001b[43m \u001b[49m\u001b[43mm\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 370\u001b[0m \u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 371\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_managers\u001b[49m\u001b[43m[\u001b[49m\u001b[43mi\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrun_managers\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 372\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 373\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 374\u001b[0m )\n\u001b[1;32m 375\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 376\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_managers:\n", - "File \u001b[0;32m~/miniforge3/envs/llama2/lib/python3.9/site-packages/langchain_core/language_models/chat_models.py:524\u001b[0m, in \u001b[0;36mBaseChatModel._generate_with_cache\u001b[0;34m(self, messages, stop, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 520\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 521\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAsked to cache, but no cache found at `langchain.cache`.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 522\u001b[0m )\n\u001b[1;32m 523\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m new_arg_supported:\n\u001b[0;32m--> 524\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_generate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 525\u001b[0m \u001b[43m \u001b[49m\u001b[43mmessages\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 526\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 527\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 528\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_generate(messages, stop\u001b[38;5;241m=\u001b[39mstop, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", - "File \u001b[0;32m~/Desktop/Code/langchain-main/langchain/libs/community/langchain_community/chat_models/ollama.py:111\u001b[0m, in \u001b[0;36mChatOllama._generate\u001b[0;34m(self, messages, stop, run_manager, **kwargs)\u001b[0m\n\u001b[1;32m 109\u001b[0m prompt \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_format_messages_as_text(messages)\n\u001b[1;32m 110\u001b[0m images \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_extract_images(messages)\n\u001b[0;32m--> 111\u001b[0m final_chunk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_stream_with_aggregation\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 112\u001b[0m \u001b[43m \u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 113\u001b[0m \u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 114\u001b[0m \u001b[43m \u001b[49m\u001b[43mimages\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mimages\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 115\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_manager\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrun_manager\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 116\u001b[0m \u001b[43m \u001b[49m\u001b[43mverbose\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mverbose\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 117\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 118\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 119\u001b[0m chat_generation \u001b[38;5;241m=\u001b[39m ChatGeneration(\n\u001b[1;32m 120\u001b[0m message\u001b[38;5;241m=\u001b[39mAIMessage(content\u001b[38;5;241m=\u001b[39mfinal_chunk\u001b[38;5;241m.\u001b[39mtext),\n\u001b[1;32m 121\u001b[0m generation_info\u001b[38;5;241m=\u001b[39mfinal_chunk\u001b[38;5;241m.\u001b[39mgeneration_info,\n\u001b[1;32m 122\u001b[0m )\n\u001b[1;32m 123\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ChatResult(generations\u001b[38;5;241m=\u001b[39m[chat_generation])\n", - "File \u001b[0;32m~/Desktop/Code/langchain-main/langchain/libs/community/langchain_community/llms/ollama.py:189\u001b[0m, in \u001b[0;36m_OllamaCommon._stream_with_aggregation\u001b[0;34m(self, prompt, stop, run_manager, verbose, **kwargs)\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_stream_with_aggregation\u001b[39m(\n\u001b[1;32m 181\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 182\u001b[0m prompt: \u001b[38;5;28mstr\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[1;32m 187\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m GenerationChunk:\n\u001b[1;32m 188\u001b[0m final_chunk: Optional[GenerationChunk] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 189\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m stream_resp \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_create_stream\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprompt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 190\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m stream_resp:\n\u001b[1;32m 191\u001b[0m chunk \u001b[38;5;241m=\u001b[39m _stream_response_to_generation_chunk(stream_resp)\n", - "File \u001b[0;32m~/Desktop/Code/langchain-main/langchain/libs/community/langchain_community/llms/ollama.py:174\u001b[0m, in \u001b[0;36m_OllamaCommon._create_stream\u001b[0;34m(self, prompt, stop, images, **kwargs)\u001b[0m\n\u001b[1;32m 172\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m200\u001b[39m:\n\u001b[1;32m 173\u001b[0m optional_detail \u001b[38;5;241m=\u001b[39m response\u001b[38;5;241m.\u001b[39mjson()\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124merror\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 174\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 175\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOllama call failed with status code \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mresponse\u001b[38;5;241m.\u001b[39mstatus_code\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 176\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m Details: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00moptional_detail\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 177\u001b[0m )\n\u001b[1;32m 178\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\u001b[38;5;241m.\u001b[39miter_lines(decode_unicode\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", - "\u001b[0;31mValueError\u001b[0m: Ollama call failed with status code 400. Details: illegal base64 data at input byte 4" - ] + "data": { + "text/plain": [ + "AIMessage(content='')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -389,7 +381,7 @@ "}\n", "text_message = {\n", " \"type\": \"text\",\n", - " \"text\": \"What is the Daollar-based gross retention rate?\"\n", + " \"text\": \"What is the gross retention rate?\"\n", "}\n", "\n", "messages.append(image_message)\n", @@ -397,6 +389,13 @@ "prompt = [HumanMessage(content=messages)]\n", "chat_model(prompt)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/libs/community/langchain_community/chat_models/ollama.py b/libs/community/langchain_community/chat_models/ollama.py index d291c2b89e000..6546e90a87c4e 100644 --- a/libs/community/langchain_community/chat_models/ollama.py +++ b/libs/community/langchain_community/chat_models/ollama.py @@ -76,8 +76,11 @@ def _format_messages_as_text(self, messages: List[BaseMessage]) -> str: def _extract_images(self, messages: List[BaseMessage]) -> List[str]: images = [] for message in messages: - if isinstance(message, (ChatMessage, HumanMessage)) and message.content[0].get("type") == "image_url": - images.append(message.content[0]["image_url"]["url"]) + if isinstance(message, + (ChatMessage, HumanMessage)) and message.content[0].get("type") == "image_url": + images.append(message.content[0]["image_url"]["url"].split(",")[1]) + print("IMG!") + print(images) return images def _generate( From 8204a2e5e87c2bfb7021b95d5c188991150472bd Mon Sep 17 00:00:00 2001 From: jacoblee93 Date: Fri, 15 Dec 2023 13:43:56 -0800 Subject: [PATCH 09/13] Support chat endpoint and multimodal inputs --- docs/docs/integrations/chat/ollama.ipynb | 130 +++++++-------- docs/docs/integrations/llms/ollama.ipynb | 40 ++--- .../langchain_community/chat_models/ollama.py | 155 ++++++++++++++++-- .../langchain_community/llms/ollama.py | 56 +++++-- 4 files changed, 261 insertions(+), 120 deletions(-) diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index 02624fcc63a3a..bc424872933f7 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -101,7 +101,7 @@ { "data": { "text/plain": [ - "AIMessage(content=' Artificial intelligence (AI) has a rich and varied history that spans several decades. obviously, as technology advances at an incredible pace. Here\\'s a brief overview:\\n\\n1. Early years (1950s-1960s): The term \"Artificial Intelligence\" was coined in 1956 by computer scientist John McCarthy. However, the concept of AI dates back to ancient Greece, where myths were created about machines that could think and learn. In the 1950s and 1960s, researchers like Marvin Minsky and Nathaniel Rochester explored the possibilities of machine intelligence, developing concepts like the multi-layered neural network model.\\n2. Rule-based systems (1970s-1980s): In the 1970s and 1980s, AI research focused on developing rule-based systems, which used pre-defined rules to reason and make decisions. This led to the development of expert systems, which were designed to solve complex problems in fields like medicine and finance.\\n3. Machine learning (1990s-present): In the 1990s, machine learning became a major area of research. This involves developing algorithms that can learn from data without being explicitly programmed. Today, machine learning is a key aspect of AI, enabling applications like image recognition, natural language processing, and autonomous vehicles.\\n4. Deep learning (2000s-present): In the 2000s, deep learning emerged as a subfield of machine learning. This involves the use of artificial neural networks with multiple layers to analyze complex data sets. Deep learning has led to significant advances in areas like computer vision and speech recognition.\\n5. Natural language processing (1980s-present): In the 1980s, researchers began exploring ways to develop machines that could understand and generate human language. Today, natural language processing (NLP) is a key aspect of AI, enabling applications like chatbots, voice assistants, and sentiment analysis.\\n6. Robotics (1980s-present): The development of robotics has been closely tied to advances in AI. Researchers have created robots that can perform tasks like assembly, warehousing, and even surgery.\\n7. Computer vision (1980s-present): Computer vision involves developing algorithms that can analyze and interpret visual data from images and videos. This has led to significant advances in areas like facial recognition, object detection, and autonomous driving.\\n8. Reinforcement learning (2000s-present): In the 2000s, researchers began exploring reinforcement learning, which involves developing algorithms that can learn from interactions with an environment. This has led to significant advances in areas like game playing and autonomous vehicles.\\n9. Ethical considerations (1980s-present): As AI has become more advanced and integrated into various aspects of life, ethical considerations have become increasingly important. Researchers have explored issues like bias, privacy, and the impact of AI on society.\\n10. Future developments: The future of AI is likely to involve further advances in areas like robotics, computer vision, and machine learning. There is also growing interest in developing hybrid AI systems that combine human and artificial intelligence capabilities. As technology continues to evolve, AI will undoubtedly play an increasingly significant role in shaping the future of work, healthcare, education, and many other areas of life.\\n\\nIn conclusion, the history of AI is a rich and complex one, with numerous breakthroughs and setbacks along the way. Today, AI is a rapidly evolving field that holds enormous potential for transforming industries and improving lives worldwide.')" + "AIMessage(content='\\nArtificial intelligence (AI) has a rich and diverse history that spans several decades. Here is a brief overview of the major milestones in the development of AI:\\n\\n1. 1950s-60s: The Dartmouth Conference and the Birth of AI\\nThe field of AI was founded in 1956 at a conference held at Dartmouth College in Hanover, New Hampshire. Attendees included computer scientists, mathematicians, and cognitive scientists who were interested in exploring the possibilities of creating machines that could simulate human intelligence. This event marked the beginning of AI as a distinct field of research.\\n2. 1950s-60s: Early AI Programs and Techniques\\nIn the years following the Dartmouth Conference, researchers began developing early AI programs and techniques. These included:\\n\\t* Machine translation: The first machine translation system was developed in the late 1950s by a team led by linguist and computer scientist Noam Chomsky.\\n\\t* Expert systems: The first expert system, MYCIN, was developed in 1968 by Edward Feigenbaum and his team at Stanford University. MYCIN was designed to diagnose and treat medical problems using a knowledge base of medical information.\\n\\t* Natural language processing (NLP): In the 1960s and 1970s, researchers began developing NLP techniques, such as text understanding and generation, speech recognition, and machine comprehension of natural language.\\n3. 1970s-80s: Rule-Based Systems and the Rise of AI Winter\\nThe 1970s and 1980s saw the development of rule-based systems, which were designed to mimic human reasoning by following sets of rules. This led to the development of expert systems, which were marketed as a solution to various business problems. However, the AI winter of the 1980s resulted in a decline in funding and interest in AI research, leading to a slowdown in progress.\\n4. 1990s-2000s: Machine Learning and the Rebirth of AI\\nThe 1990s saw the rise of machine learning, which enabled AI systems to learn from data rather than being explicitly programmed. This led to a resurgence of interest in AI research and development, with the emergence of applications such as speech recognition, image recognition, and natural language processing.\\n5. 2010s-present: Deep Learning and the Current State of AI\\nThe 2010s saw the rise of deep learning, a subset of machine learning that uses neural networks to analyze data. This has led to significant advances in areas such as computer vision, natural language processing, and speech recognition. Today, AI is being applied to a wide range of fields, including healthcare, finance, transportation, and education.\\n\\nSome key figures in the history of AI include:\\n\\n* Alan Turing: Turing is often considered the father of modern computer science and artificial intelligence. His work on the Turing machine, a theoretical model for a computer, laid the foundation for modern computing.\\n* Marvin Minsky: Minsky was a pioneer in the field of AI and co-founder of the Massachusetts Institute of Technology\\'s (MIT) AI Laboratory. He made significant contributions to the development of neural networks and the theory of machine intelligence.\\n* John McCarthy: McCarthy was a computer scientist and cognitive scientist who coined the term \"artificial intelligence\" in 1956. He was also instrumental in the development of the Lisp programming language, which is still widely used today.\\n* Alan Kay: Kay is a computer scientist and cognitive scientist who made significant contributions to the development of personal computers and the Xerox PARC research center. He is known for his work on the concept of \"objects\" in computing, which has had a lasting impact on modern programming languages.\\n* Geoffrey Hinton: Hinton is a computer scientist and cognitive scientist who is known for his work on artificial neural networks. He was one of the co-founders of the deep learning revolution in the 2010s, and his work has had a significant impact on areas such as computer vision and natural language processing.\\n\\nOverall, the history of AI reflects a longstanding interest in creating machines that can simulate human intelligence. While the field has experienced periods of progress and setbacks, it continues to evolve and expand into new areas of research and application.')" ] }, "execution_count": 2, @@ -131,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -148,49 +148,16 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " Sure! Here's a JSON response with the colors of the sky at different times of the day:\n", - " Begriffe und Abkürzungen:\n", - "\n", - "* `time`: The time of day (in 24-hour format)\n", - "* `sky_color`: The color of the sky at that time (as a hex code)\n", - "\n", - "Here are the colors of the sky at different times of the day:\n", - "```json\n", - "[\n", - " {\n", - " \"time\": \"6am\",\n", - " \"sky_color\": \"#0080c0\"\n", - " },\n", - " {\n", - " \"time\": \"9am\",\n", - " \"sky_color\": \"#3498db\"\n", - " },\n", - " {\n", - " \"time\": \"12pm\",\n", - " \"sky_color\": \"#ef7c00\"\n", - " },\n", - " {\n", - " \"time\": \"3pm\",\n", - " \"sky_color\": \"#9564b6\"\n", - " },\n", - " {\n", - " \"time\": \"6pm\",\n", - " \"sky_color\": \"#e78ac3\"\n", - " },\n", - " {\n", - " \"time\": \"9pm\",\n", - " \"sky_color\": \"#5f006a\"\n", - " }\n", - "]\n", - "```\n", - "In this response, the `time` property is a string in 24-hour format, representing the time of day. The `sky_color` property is a hex code representing the color of the sky at that time. For example, at 6am, the sky is blue (#0080c0), while at 9pm, it's dark blue (#5f006a)." + "{\"Morning\": {\"sky\": \"pink\", \"sun\": \"rise\"}, \"Mid Day\": {\"sky\": \"blue\", \"sun\": \"at_highest_point\"}, \"Afternoon\": {\"sky\": \"gray\", \"sun\": \"begin_to_set\"}, \"Evening\": {\"sky\": \"orange\", \"sun\": \"fully_set\"}}\n", + " \n", + " \n" ] } ], @@ -208,30 +175,21 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " Sure! Based on the JSON schema you provided, here's the information we can gather about a person named John who is 35 years old and loves pizza:\n", - "\n", - "**Name:** John\n", - "\n", - "**Age:** 35 (integer)\n", - "\n", - "**Favorite food:** Pizza (string)\n", - "\n", - "So, the JSON object for John would look like this:\n", - "```json\n", "{\n", " \"name\": \"John\",\n", " \"age\": 35,\n", " \"fav_food\": \"pizza\"\n", "}\n", - "```\n", - "Note that we cannot provide additional information about John beyond what is specified in the schema. For example, we do not have any information about his gender, occupation, or address, as those fields are not included in the schema." + "\n", + "\n", + "\n" ] } ], @@ -284,30 +242,56 @@ "Be sure to update Ollama so that you have the most recent version to support multi-modal." ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting pillow\n", + " Downloading Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl (3.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.3/3.3 MB\u001b[0m \u001b[31m12.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hInstalling collected packages: pillow\n", + "Successfully installed pillow-10.1.0\n", + "\u001b[33mWARNING: You are using pip version 22.0.4; however, version 23.3.1 is available.\n", + "You should consider upgrading via the '/Users/jacoblee/langchain/langchain/libs/langchain/.venv/bin/python -m pip install --upgrade pip' command.\u001b[0m\u001b[33m\n", + "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install pillow" + ] + }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/Users/jacoblee/langchain/langchain/docs/docs/integrations/chat/ollama.ipynb Cell 12\u001b[0m line \u001b[0;36m3\n\u001b[1;32m 29\u001b[0m display(HTML(image_html))\n\u001b[1;32m 32\u001b[0m file_path \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m---> 33\u001b[0m pil_image \u001b[39m=\u001b[39m Image\u001b[39m.\u001b[39;49mopen(file_path)\n\u001b[1;32m 35\u001b[0m image_b64 \u001b[39m=\u001b[39m convert_to_base64(pil_image)\n\u001b[1;32m 36\u001b[0m plt_img_base64(image_b64)\n", + "File \u001b[0;32m~/langchain/langchain/libs/langchain/.venv/lib/python3.10/site-packages/PIL/Image.py:3243\u001b[0m, in \u001b[0;36mopen\u001b[0;34m(fp, mode, formats)\u001b[0m\n\u001b[1;32m 3240\u001b[0m filename \u001b[39m=\u001b[39m fp\n\u001b[1;32m 3242\u001b[0m \u001b[39mif\u001b[39;00m filename:\n\u001b[0;32m-> 3243\u001b[0m fp \u001b[39m=\u001b[39m builtins\u001b[39m.\u001b[39;49mopen(filename, \u001b[39m\"\u001b[39;49m\u001b[39mrb\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[1;32m 3244\u001b[0m exclusive_fp \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m\n\u001b[1;32m 3246\u001b[0m \u001b[39mtry\u001b[39;00m:\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'" + ] } ], "source": [ "import base64\n", "from io import BytesIO\n", + "\n", "from IPython.display import HTML, display\n", "from PIL import Image\n", "\n", + "\n", "def convert_to_base64(pil_image):\n", " \"\"\"\n", " Convert PIL images to Base64 encoded strings\n", @@ -343,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -374,27 +358,25 @@ } ], "source": [ - "from langchain.chat_models import ChatOllama\n", "from langchain_core.messages import HumanMessage\n", "\n", + "from langchain.chat_models import ChatOllama\n", + "\n", "chat_model = ChatOllama(\n", " model=\"bakllava\",\n", ")\n", "\n", "# Call the chat model with both messages and images\n", - "messages = []\n", - "image_message = {\n", + "content_parts = []\n", + "image_part = {\n", " \"type\": \"image_url\",\n", " \"image_url\": {\"url\": f\"data:image/jpeg;base64,{image_b64}\"},\n", "}\n", - "text_message = {\n", - " \"type\": \"text\",\n", - " \"text\": \"What is the Daollar-based gross retention rate?\"\n", - "}\n", + "text_part = {\"type\": \"text\", \"text\": \"What is the Daollar-based gross retention rate?\"}\n", "\n", - "messages.append(image_message)\n", - "messages.append(text_message)\n", - "prompt = [HumanMessage(content=messages)]\n", + "content_parts.append(image_part)\n", + "content_parts.append(text_part)\n", + "prompt = [HumanMessage(content=content_parts)]\n", "chat_model(prompt)" ] } @@ -415,7 +397,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.10.5" } }, "nbformat": 4, diff --git a/docs/docs/integrations/llms/ollama.ipynb b/docs/docs/integrations/llms/ollama.ipynb index b7d8c5cc7a26a..b069bfe56317c 100644 --- a/docs/docs/integrations/llms/ollama.ipynb +++ b/docs/docs/integrations/llms/ollama.ipynb @@ -53,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -80,16 +80,16 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "' Artificial intelligence (AI) has a rich and diverse history that spans several decades. Hinweis: This answer will provide an overview of the major milestones in the history of AI, but it is not exhaustive.\\n\\n1. Early Years (1950s-1960s): The term \"Artificial Intelligence\" was coined in 1956 by John McCarthy, a computer scientist who organized the first AI conference at Dartmouth College. In the 1950s and 1960s, researchers focused on developing rule-based systems and algorithms to simulate human intelligence.\\n2. Rule-Based Systems (1970s-1980s): The development of rule-based systems, such as Logical Theories II (LTP), allowed for the creation of more sophisticated AI models. These systems were designed to reason and make decisions based on a set of rules rather than through machine learning.\\n3. Expert Systems (1980s): Expert systems, which mimicked the decision-making abilities of human experts in specific domains, became popular in the 1980s. These systems were built using rule-based logic and knowledge representation techniques.\\n4. Machine Learning (1990s-2000s): The rise of machine learning led to the development of algorithms that could learn from data without being explicitly programmed. This allowed for more advanced AI capabilities, such as image recognition and natural language processing.\\n5. Deep Learning (2010s): The advent of deep learning, a subfield of machine learning, enabled the creation of complex neural networks that could learn to recognize patterns in large datasets. This led to significant advances in areas like computer vision, speech recognition, and natural language processing.\\n6. Natural Language Processing (NLP) (2000s-present): NLP has been a rapidly growing field in recent years, with the development of techniques such as word embeddings, attention mechanisms, and transformer models. These advances have enabled AI systems to better understand and generate human language.\\n7. Robotics and Control (1980s-present): The development of advanced robotics and control systems has enabled AI to interact with the physical world in new ways. This includes autonomous vehicles, drones, and other robots that can perform tasks such as object recognition, manipulation, and navigation.\\n8. Computer Vision (1990s-present): Advances in computer vision have enabled AI systems to interpret and understand visual data from images and videos. This has led to applications such as facial recognition, object detection, and autonomous driving.\\n9. Reinforcement Learning (2000s-present): Reinforcement learning is a type of machine learning that involves training AI agents to make decisions based on rewards or penalties. This has led to advances in areas like game playing, robotics, and autonomous driving.\\n10. Ethical and Social Implications (2000s-present): As AI has become more advanced and integrated into various aspects of society, there has been increased attention on the ethical and social implications of these technologies. This includes concerns about bias, privacy, and the impact of AI on employment and society as a whole.\\n\\nThese are some of the major milestones in the history of AI, but it\\'s important to note that the field is constantly evolving and new breakthroughs are being made regularly.'" + "' Artificial intelligence (AI) has a rich and varied history that spans several decades. październik 1950s and has evolved significantly over time. Here is a brief overview of the major milestones in the history of AI:\\n\\n1. 1950s: The Dartmouth Conference - Considered the birthplace of AI, this conference brought together computer scientists, mathematicians, and cognitive scientists to discuss the possibilities of creating machines that could simulate human intelligence. Attendees included John McCarthy, Marvin Minsky, Nathaniel Rochester, and Claude Shannon.\\n2. 1951: The Turing Test - Alan Turing proposed a test to measure a machine\\'s ability to exhibit intelligent behavior equivalent to, or indistinguishable from, that of a human. The Turing Test has since become a benchmark for measuring the success of AI systems.\\n3. 1956: The First AI Program - John McCarthy created the first AI program, called the Logical Theorist, which was designed to reason and solve problems using logical deduction.\\n4. 1960s: Rule-Based Expert Systems - Researchers developed rule-based expert systems, which used a set of rules to reason and make decisions. These systems were widely used in industries such as banking and healthcare.\\n5. 1970s: Machine Learning -Machine learning, a subfield of AI, emerged as a way for machines to learn from data without being explicitly programmed. This led to the development of algorithms such as decision trees and neural networks.\\n6. 1980s: Expert Systems - The development of expert systems, which were designed to mimic the decision-making abilities of human experts, reached its peak in the 1980s. These systems were widely used in industries such as banking and healthcare.\\n7. 1990s: AI Winter - Despite the progress made in AI research, the field experienced a decline in funding and interest in the 1990s, known as the \"AI winter.\"\\n8. 2000s: AI Resurgence - The resurgence of AI began in the early 2000s with the development of new algorithms and techniques, such as support vector machines and deep learning. This led to a renewed interest in AI research and applications.\\n9. 2010s: Rise of Deep Learning - The development of deep learning algorithms, which are capable of learning and improving on their own by analyzing large amounts of data, has been a major factor in the recent progress made in AI. These algorithms have been used in applications such as image recognition, natural language processing, and autonomous vehicles.\\n10. Present Day: AI Continues to Advance - AI is continuing to advance at a rapid pace, with new techniques and applications emerging all the time. Areas of research include natural language processing, computer vision, robotics, and more.\\n\\nSome notable people who have made significant contributions to the field of AI include:\\n\\n1. Alan Turing - Considered one of the pioneers of AI, Turing proposed the Turing Test and developed the concept of a universal machine.\\n2. John McCarthy - McCarthy is known as the \"father of AI\" for his work in developing the field of AI. He coined the term \"Artificial Intelligence\" and was instrumental in organizing the Dartmouth Conference.\\n3. Marvin Minsky - Minsky was a pioneer in the field of neural networks and co-founder of the MIT AI Laboratory.\\n4. Nathaniel Rochester - Rochester was a computer scientist and cognitive scientist who worked on early AI projects, including the development of the Logical Theorist.\\n5. Claude Shannon - Shannon was a mathematician and electrical engineer who is known for his work on information theory, which has had a significant impact on the field of AI.\\n6. Yann LeCun - LeCun is a computer scientist and the director of AI Research at Facebook. He is also the Silver Professor of Computer Science at New York University, and a professor at the Courant Institute of Mathematical Sciences.\\n7. Geoffrey Hinton - Hinton is a computer scientist and cognitive psychologist who is known for his work on artificial neural networks. He is a pioneer in the field of deep learning and has made significant contributions to the development of convolutional neural networks (CNNs).\\n8. Yoshua Bengio - Bengio is a computer scientist and a pioneer in the field of deep learning. He is known for his work on recurrent neural networks (RNNs) and has made significant contributions to the development of CNNs and RNNs.\\n9. Andrew Ng - Ng is a computer scientist and entrepreneur who has made significant contributions to the field of AI. He is known for his work on deep learning and has worked at Google, where he founded the Google Brain deep learning project, and at Baidu, where he led the company\\'s AI group.\\n10. Demis Hassabis - Hassabis is a computer scientist and entrepreneur who is known for his work on deep learning and artificial intelligence. He is the co-founder of DeepMind, which was acquired by Alphabet in 2014, and has made significant contributions to the field of AI.\\n\\nThese are just a few examples of notable people who have made significant contributions to the field of AI. There are many other researchers and scientists who have also made important advancements in the field.'" ] }, - "execution_count": 29, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -115,7 +115,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -126,20 +126,20 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 4, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/Users/jacoblee/langchain/langchain/docs/docs/integrations/llms/ollama.ipynb Cell 7\u001b[0m line \u001b[0;36m3\n\u001b[1;32m 31\u001b[0m display(HTML(image_html))\n\u001b[1;32m 34\u001b[0m file_path \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m---> 35\u001b[0m pil_image \u001b[39m=\u001b[39m Image\u001b[39m.\u001b[39;49mopen(file_path)\n\u001b[1;32m 36\u001b[0m image_b64 \u001b[39m=\u001b[39m convert_to_base64(pil_image)\n\u001b[1;32m 37\u001b[0m plt_img_base64(image_b64)\n", + "File \u001b[0;32m~/langchain/langchain/libs/langchain/.venv/lib/python3.10/site-packages/PIL/Image.py:3243\u001b[0m, in \u001b[0;36mopen\u001b[0;34m(fp, mode, formats)\u001b[0m\n\u001b[1;32m 3240\u001b[0m filename \u001b[39m=\u001b[39m fp\n\u001b[1;32m 3242\u001b[0m \u001b[39mif\u001b[39;00m filename:\n\u001b[0;32m-> 3243\u001b[0m fp \u001b[39m=\u001b[39m builtins\u001b[39m.\u001b[39;49mopen(filename, \u001b[39m\"\u001b[39;49m\u001b[39mrb\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[1;32m 3244\u001b[0m exclusive_fp \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m\n\u001b[1;32m 3246\u001b[0m \u001b[39mtry\u001b[39;00m:\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'" + ] } ], "source": [ @@ -184,7 +184,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -206,7 +206,9 @@ } ], "source": [ - "llm(prompt=\"What is the dollar based gross retention rate:\", images=[image_b64])" + "llm_with_image_context = bakllava.bind(images=[image_b64])\n", + "\n", + "llm_with_image_context(prompt=\"What is the dollar based gross retention rate:\")" ] } ], @@ -226,7 +228,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.10.5" } }, "nbformat": 4, diff --git a/libs/community/langchain_community/chat_models/ollama.py b/libs/community/langchain_community/chat_models/ollama.py index d291c2b89e000..a1dad0e728bb2 100644 --- a/libs/community/langchain_community/chat_models/ollama.py +++ b/libs/community/langchain_community/chat_models/ollama.py @@ -1,6 +1,7 @@ import json -from typing import Any, Iterator, List, Optional +from typing import Any, Dict, Iterator, List, Optional, Union +from langchain_core._api import deprecated from langchain_core.callbacks import ( CallbackManagerForLLMRun, ) @@ -15,9 +16,10 @@ ) from langchain_core.outputs import ChatGeneration, ChatGenerationChunk, ChatResult -from langchain_community.llms.ollama import _OllamaCommon +from langchain_community.llms.ollama import OllamaEndpointNotFoundError, _OllamaCommon +@deprecated("0.0.3", alternative="_chat_stream_response_to_chat_generation_chunk") def _stream_response_to_chat_generation_chunk( stream_response: str, ) -> ChatGenerationChunk: @@ -30,6 +32,20 @@ def _stream_response_to_chat_generation_chunk( ) +def _chat_stream_response_to_chat_generation_chunk( + stream_response: str, +) -> ChatGenerationChunk: + """Convert a stream response to a generation chunk.""" + parsed_response = json.loads(stream_response) + generation_info = parsed_response if parsed_response.get("done") is True else None + return ChatGenerationChunk( + message=AIMessageChunk( + content=parsed_response.get("message", {}).get("content", "") + ), + generation_info=generation_info, + ) + + class ChatOllama(BaseChatModel, _OllamaCommon): """Ollama locally runs large language models. @@ -52,6 +68,7 @@ def is_lc_serializable(cls) -> bool: """Return whether this model can be serialized by Langchain.""" return False + @deprecated("0.0.3", alternative="_convert_messages_to_ollama_messages") def _format_message_as_text(self, message: BaseMessage) -> str: if isinstance(message, ChatMessage): message_text = f"\n\n{message.role.capitalize()}: {message.content}" @@ -73,12 +90,102 @@ def _format_messages_as_text(self, messages: List[BaseMessage]) -> str: [self._format_message_as_text(message) for message in messages] ) - def _extract_images(self, messages: List[BaseMessage]) -> List[str]: - images = [] + def _convert_messages_to_ollama_messages( + self, + messages: List[BaseMessage] + ) -> List[Dict[str, Union[str, List[str]]]]: + ollama_messages = [] for message in messages: - if isinstance(message, (ChatMessage, HumanMessage)) and message.content[0].get("type") == "image_url": - images.append(message.content[0]["image_url"]["url"]) - return images + role = "" + if isinstance(message, HumanMessage): + role = "user" + elif isinstance(message, AIMessage): + role = "assistant" + elif isinstance(message, SystemMessage): + role = "system" + else: + raise ValueError("Received unsupported message type for Ollama.") + + content = "" + images = [] + if isinstance(message.content, str): + content = message.content + else: + for content_part in message.content: + if content_part.get("type") == "text": + content += f"\n{content_part['text']}" + elif content_part.get("type") == "image_url": + if isinstance(content_part.get("image_url"), str): + image_url_components = content_part["image_url"].split(",") + # Support data:image/jpeg;base64, format + # and base64 strings + if len(image_url_components) > 1: + images.append(image_url_components[1]) + else: + images.append(image_url_components[0]) + else: + raise ValueError( + "Only string image_url " + "content parts are supported." + ) + else: + raise ValueError( + "Unsupported message content type. " + "Must either have type 'text' or type 'image_url' " + "with a string 'image_url' field." + ) + + ollama_messages.append({ + "role": role, + "content": content, + "images": images, + }) + + return ollama_messages + + def _create_chat_stream( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, + **kwargs: Any + ) -> Iterator[str]: + payload = { + "messages": self._convert_messages_to_ollama_messages(messages), + } + yield from self._create_stream( + payload=payload, + stop=stop, + api_url=f"{self.base_url}/api/chat/", + **kwargs + ) + + + def _chat_stream_with_aggregation( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, + run_manager: Optional[CallbackManagerForLLMRun] = None, + verbose: bool = False, + **kwargs: Any, + ) -> ChatGenerationChunk: + final_chunk: Optional[ChatGenerationChunk] = None + for stream_resp in self._create_chat_stream(messages, stop, **kwargs): + if stream_resp: + chunk = _chat_stream_response_to_chat_generation_chunk(stream_resp) + if final_chunk is None: + final_chunk = chunk + else: + final_chunk += chunk + if run_manager: + run_manager.on_llm_new_token( + chunk.text, + verbose=verbose, + ) + if final_chunk is None: + raise ValueError("No data received from Ollama stream.") + + return final_chunk + def _generate( self, @@ -104,12 +211,9 @@ def _generate( ]) """ - prompt = self._format_messages_as_text(messages) - images = self._extract_images(messages) - final_chunk = super()._stream_with_aggregation( - prompt, + final_chunk = self._chat_stream_with_aggregation( + messages, stop=stop, - images=images, run_manager=run_manager, verbose=self.verbose, **kwargs, @@ -120,17 +224,38 @@ def _generate( ) return ChatResult(generations=[chat_generation]) + def _stream( self, messages: List[BaseMessage], stop: Optional[List[str]] = None, - images: Optional[List[str]] = None, + run_manager: Optional[CallbackManagerForLLMRun] = None, + **kwargs: Any, + ) -> Iterator[ChatGenerationChunk]: + try: + for stream_resp in self._create_chat_stream(messages, stop, **kwargs): + if stream_resp: + chunk = _stream_response_to_chat_generation_chunk(stream_resp) + yield chunk + if run_manager: + run_manager.on_llm_new_token( + chunk.text, + verbose=self.verbose, + ) + except OllamaEndpointNotFoundError: + yield from self._legacy_stream(messages, stop, **kwargs) + + + @deprecated("0.0.3", alternative="_stream") + def _legacy_stream( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any, ) -> Iterator[ChatGenerationChunk]: prompt = self._format_messages_as_text(messages) - images = self._extract_images(messages) - for stream_resp in self._create_stream(prompt, stop, images, **kwargs): + for stream_resp in self._create_generate_stream(prompt, stop, **kwargs): if stream_resp: chunk = _stream_response_to_chat_generation_chunk(stream_resp) yield chunk diff --git a/libs/community/langchain_community/llms/ollama.py b/libs/community/langchain_community/llms/ollama.py index 1be919de5cd87..8e4fe3286d45d 100644 --- a/libs/community/langchain_community/llms/ollama.py +++ b/libs/community/langchain_community/llms/ollama.py @@ -20,6 +20,10 @@ def _stream_response_to_generation_chunk( ) +class OllamaEndpointNotFoundError(Exception): + """Raised when the Ollama endpoint is not found.""" + + class _OllamaCommon(BaseLanguageModel): base_url: str = "http://localhost:11434" """Base url the model is hosted under.""" @@ -128,12 +132,30 @@ def _default_params(self) -> Dict[str, Any]: def _identifying_params(self) -> Mapping[str, Any]: """Get the identifying parameters.""" return {**{"model": self.model, "format": self.format}, **self._default_params} + + def _create_generate_stream( + self, + prompt: str, + stop: Optional[List[str]] = None, + images: Optional[List[str]] = None, + **kwargs: Any + ) -> Iterator[str]: + payload = { + "prompt": prompt, + "images": images + } + yield from self._create_stream( + payload=payload, + stop=stop, + api_url=f"{self.base_url}/api/generate/", + **kwargs + ) def _create_stream( self, - prompt: str, + api_url: str, + payload: Any, stop: Optional[List[str]] = None, - images: Optional[List[str]] = None, **kwargs: Any, ) -> Iterator[str]: if self.stop is not None and stop is not None: @@ -157,12 +179,17 @@ def _create_stream( **kwargs, } - request_payload = {"prompt": prompt, **params} - if images is not None: - request_payload["images"] = images + if payload.get("messages"): + request_payload = {"messages": payload.get("messages", []), **params} + else: + request_payload = { + "prompt": payload.get("prompt"), + "images": payload.get("images", []), + **params + } response = requests.post( - url=f"{self.base_url}/api/generate/", + url=api_url, headers={"Content-Type": "application/json"}, json=request_payload, stream=True, @@ -170,11 +197,16 @@ def _create_stream( ) response.encoding = "utf-8" if response.status_code != 200: - optional_detail = response.json().get("error") - raise ValueError( - f"Ollama call failed with status code {response.status_code}." - f" Details: {optional_detail}" - ) + if response.status_code == 404: + raise OllamaEndpointNotFoundError( + "Ollama call failed with status code 404." + ) + else: + optional_detail = response.json().get("error") + raise ValueError( + f"Ollama call failed with status code {response.status_code}." + f" Details: {optional_detail}" + ) return response.iter_lines(decode_unicode=True) def _stream_with_aggregation( @@ -186,7 +218,7 @@ def _stream_with_aggregation( **kwargs: Any, ) -> GenerationChunk: final_chunk: Optional[GenerationChunk] = None - for stream_resp in self._create_stream(prompt, stop, **kwargs): + for stream_resp in self._create_generate_stream(prompt, stop, **kwargs): if stream_resp: chunk = _stream_response_to_generation_chunk(stream_resp) if final_chunk is None: From 4e401157877e65d974a690749ca865071ddeffad Mon Sep 17 00:00:00 2001 From: jacoblee93 Date: Fri, 15 Dec 2023 15:29:22 -0800 Subject: [PATCH 10/13] Fix merge markers --- docs/docs/integrations/chat/ollama.ipynb | 72 ++++++++---------------- 1 file changed, 25 insertions(+), 47 deletions(-) diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index 1fccdf2ef9cdd..99f6dd54344a9 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -101,7 +101,7 @@ { "data": { "text/plain": [ - "AIMessage(content='\\nArtificial intelligence (AI) has a rich and diverse history that spans several decades. Here is a brief overview of the major milestones in the development of AI:\\n\\n1. 1950s-60s: The Dartmouth Conference and the Birth of AI\\nThe field of AI was founded in 1956 at a conference held at Dartmouth College in Hanover, New Hampshire. Attendees included computer scientists, mathematicians, and cognitive scientists who were interested in exploring the possibilities of creating machines that could simulate human intelligence. This event marked the beginning of AI as a distinct field of research.\\n2. 1950s-60s: Early AI Programs and Techniques\\nIn the years following the Dartmouth Conference, researchers began developing early AI programs and techniques. These included:\\n\\t* Machine translation: The first machine translation system was developed in the late 1950s by a team led by linguist and computer scientist Noam Chomsky.\\n\\t* Expert systems: The first expert system, MYCIN, was developed in 1968 by Edward Feigenbaum and his team at Stanford University. MYCIN was designed to diagnose and treat medical problems using a knowledge base of medical information.\\n\\t* Natural language processing (NLP): In the 1960s and 1970s, researchers began developing NLP techniques, such as text understanding and generation, speech recognition, and machine comprehension of natural language.\\n3. 1970s-80s: Rule-Based Systems and the Rise of AI Winter\\nThe 1970s and 1980s saw the development of rule-based systems, which were designed to mimic human reasoning by following sets of rules. This led to the development of expert systems, which were marketed as a solution to various business problems. However, the AI winter of the 1980s resulted in a decline in funding and interest in AI research, leading to a slowdown in progress.\\n4. 1990s-2000s: Machine Learning and the Rebirth of AI\\nThe 1990s saw the rise of machine learning, which enabled AI systems to learn from data rather than being explicitly programmed. This led to a resurgence of interest in AI research and development, with the emergence of applications such as speech recognition, image recognition, and natural language processing.\\n5. 2010s-present: Deep Learning and the Current State of AI\\nThe 2010s saw the rise of deep learning, a subset of machine learning that uses neural networks to analyze data. This has led to significant advances in areas such as computer vision, natural language processing, and speech recognition. Today, AI is being applied to a wide range of fields, including healthcare, finance, transportation, and education.\\n\\nSome key figures in the history of AI include:\\n\\n* Alan Turing: Turing is often considered the father of modern computer science and artificial intelligence. His work on the Turing machine, a theoretical model for a computer, laid the foundation for modern computing.\\n* Marvin Minsky: Minsky was a pioneer in the field of AI and co-founder of the Massachusetts Institute of Technology\\'s (MIT) AI Laboratory. He made significant contributions to the development of neural networks and the theory of machine intelligence.\\n* John McCarthy: McCarthy was a computer scientist and cognitive scientist who coined the term \"artificial intelligence\" in 1956. He was also instrumental in the development of the Lisp programming language, which is still widely used today.\\n* Alan Kay: Kay is a computer scientist and cognitive scientist who made significant contributions to the development of personal computers and the Xerox PARC research center. He is known for his work on the concept of \"objects\" in computing, which has had a lasting impact on modern programming languages.\\n* Geoffrey Hinton: Hinton is a computer scientist and cognitive scientist who is known for his work on artificial neural networks. He was one of the co-founders of the deep learning revolution in the 2010s, and his work has had a significant impact on areas such as computer vision and natural language processing.\\n\\nOverall, the history of AI reflects a longstanding interest in creating machines that can simulate human intelligence. While the field has experienced periods of progress and setbacks, it continues to evolve and expand into new areas of research and application.')" + "AIMessage(content='\\nArtificial intelligence (AI) has a rich and diverse history that spans several decades. Here is a brief overview of the major milestones and events in the development of AI:\\n\\n1. 1950s: The Dartmouth Conference: The field of AI was officially launched at a conference held at Dartmouth College in 1956. Attendees included computer scientists, mathematicians, and cognitive scientists who were interested in exploring the possibilities of creating machines that could simulate human intelligence.\\n2. 1951: The Turing Test: British mathematician Alan Turing proposed a test to measure a machine\\'s ability to exhibit intelligent behavior equivalent to, or indistinguishable from, that of a human. The Turing Test has since become a benchmark for measuring the success of AI systems.\\n3. 1956: The First AI Program: Computer scientist John McCarthy created the first AI program, called the Logical Theorist, which was designed to reason and solve problems using logical deduction.\\n4. 1960s: Rule-Based Expert Systems: The development of rule-based expert systems, which used a set of rules to reason and make decisions, marked a significant milestone in the history of AI. These systems were widely used in industries such as banking, healthcare, and transportation.\\n5. 1970s: Machine Learning: Machine learning, which enables machines to learn from data without being explicitly programmed, emerged as a major area of research in AI. This led to the development of algorithms such as decision trees and neural networks.\\n6. 1980s: Expert Systems: The development of expert systems, which were designed to mimic the decision-making abilities of human experts, reached its peak in the 1980s. These systems were widely used in industries such as banking and healthcare.\\n7. 1990s: AI Winter: Despite the progress that had been made in AI research, the field experienced a decline in funding and interest in the 1990s, which became known as the \"AI winter.\"\\n8. 2000s: Machine Learning Resurgence: The resurgence of machine learning, driven by advances in computational power and data storage, led to a new wave of AI research and applications.\\n9. 2010s: Deep Learning: The development of deep learning algorithms, which are capable of learning complex patterns in large datasets, marked a significant breakthrough in AI research. These algorithms have been used in applications such as image and speech recognition, natural language processing, and autonomous vehicles.\\n10. Present Day: AI is now being applied to a wide range of industries and domains, including healthcare, finance, transportation, and education. The field is continuing to evolve, with new technologies and applications emerging all the time.\\n\\nOverall, the history of AI reflects a long-standing interest in creating machines that can simulate human intelligence. While the field has experienced periods of progress and setbacks, it continues to evolve and expand into new areas of research and application.')" ] }, "execution_count": 2, @@ -155,9 +155,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "{\"Morning\": {\"sky\": \"pink\", \"sun\": \"rise\"}, \"Mid Day\": {\"sky\": \"blue\", \"sun\": \"at_highest_point\"}, \"Afternoon\": {\"sky\": \"gray\", \"sun\": \"begin_to_set\"}, \"Evening\": {\"sky\": \"orange\", \"sun\": \"fully_set\"}}\n", - " \n", - " \n" + "{\"morning\": {\"sky\": \"pink\", \"sun\": \"rise\"}, \"daytime\": {\"sky\": \"blue\", \"sun\": \"high\"}, \"afternoon\": {\"sky\": \"gray\", \"sun\": \"peak\"}, \"evening\": {\"sky\": \"orange\", \"sun\": \"set\"}}\n", + " \t\n", + "\n" ] } ], @@ -189,6 +189,17 @@ "}\n", "\n", "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n" ] } @@ -244,7 +255,6 @@ }, { "cell_type": "code", -<<<<<<< HEAD "execution_count": 6, "metadata": {}, "outputs": [ @@ -252,11 +262,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Collecting pillow\n", - " Downloading Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl (3.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.3/3.3 MB\u001b[0m \u001b[31m12.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", - "\u001b[?25hInstalling collected packages: pillow\n", - "Successfully installed pillow-10.1.0\n", + "Requirement already satisfied: pillow in /Users/jacoblee/langchain/langchain/libs/langchain/.venv/lib/python3.10/site-packages (10.1.0)\n", "\u001b[33mWARNING: You are using pip version 22.0.4; however, version 23.3.1 is available.\n", "You should consider upgrading via the '/Users/jacoblee/langchain/langchain/libs/langchain/.venv/bin/python -m pip install --upgrade pip' command.\u001b[0m\u001b[33m\n", "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n" @@ -270,9 +276,6 @@ { "cell_type": "code", "execution_count": 7, -======= - "execution_count": 1, ->>>>>>> 3404d71f8a641e6de22a60b1dd51bc2353f09f9e "metadata": {}, "outputs": [ { @@ -282,7 +285,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/Users/jacoblee/langchain/langchain/docs/docs/integrations/chat/ollama.ipynb Cell 12\u001b[0m line \u001b[0;36m3\n\u001b[1;32m 29\u001b[0m display(HTML(image_html))\n\u001b[1;32m 32\u001b[0m file_path \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m---> 33\u001b[0m pil_image \u001b[39m=\u001b[39m Image\u001b[39m.\u001b[39;49mopen(file_path)\n\u001b[1;32m 35\u001b[0m image_b64 \u001b[39m=\u001b[39m convert_to_base64(pil_image)\n\u001b[1;32m 36\u001b[0m plt_img_base64(image_b64)\n", + "\u001b[1;32m/Users/jacoblee/langchain/langchain/docs/docs/integrations/chat/ollama.ipynb Cell 12\u001b[0m line \u001b[0;36m3\n\u001b[1;32m 31\u001b[0m display(HTML(image_html))\n\u001b[1;32m 34\u001b[0m file_path \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m---> 35\u001b[0m pil_image \u001b[39m=\u001b[39m Image\u001b[39m.\u001b[39;49mopen(file_path)\n\u001b[1;32m 37\u001b[0m image_b64 \u001b[39m=\u001b[39m convert_to_base64(pil_image)\n\u001b[1;32m 38\u001b[0m plt_img_base64(image_b64)\n", "File \u001b[0;32m~/langchain/langchain/libs/langchain/.venv/lib/python3.10/site-packages/PIL/Image.py:3243\u001b[0m, in \u001b[0;36mopen\u001b[0;34m(fp, mode, formats)\u001b[0m\n\u001b[1;32m 3240\u001b[0m filename \u001b[39m=\u001b[39m fp\n\u001b[1;32m 3242\u001b[0m \u001b[39mif\u001b[39;00m filename:\n\u001b[0;32m-> 3243\u001b[0m fp \u001b[39m=\u001b[39m builtins\u001b[39m.\u001b[39;49mopen(filename, \u001b[39m\"\u001b[39;49m\u001b[39mrb\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[1;32m 3244\u001b[0m exclusive_fp \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m\n\u001b[1;32m 3246\u001b[0m \u001b[39mtry\u001b[39;00m:\n", "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'" ] @@ -331,30 +334,19 @@ }, { "cell_type": "code", -<<<<<<< HEAD "execution_count": null, -======= - "execution_count": 3, ->>>>>>> 3404d71f8a641e6de22a60b1dd51bc2353f09f9e "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "IMG!\n", - "['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4YsvCGhR6Rp8txLbxuzhrhlZ8scnkAD9Kdtbhc2aKWiqEJRRRQAUUUUAJiilooGJS0lFABRRRTAKKKKAEopaKAEooooGFJS0UwEopaOKAEooooAKKKKAEopaKBjcUUtFACUUUUwCiiigBKKWigYlFFFACUtFFAxKKKWmA2loooASiiloAbRS0YoGJRRRTAKSlooGJRS4pKACkpaKBiUUtJTA1aKKK5TnE60UtFACUUUUCCiiigApKWigBKKKKACkpaKAEopaKAEooopgcdrfwu8H+ILt7u+0eMXLnLywO0RY+pCkAn3Iq74d8BeGfCrmXSNKignIwZmZpJMem5iSPwxXSUUrDEopaSmIKWkooAKKKKAEoozRTAKKMUUAFFFFABik6UtFACUUYoxQAUUUUAFFFFABikpaKAEooxRTAKKKKACiiigAooooAKKKKAORi+G/hqHxUfEiW0w1IzGff57bd5zk7eneutxS0UAJRS0lACUUtFMBKKKKACiiigYUUUUAFJS0UAJRR0ooAKKKKACiiigBKKWigYlFFFABRRRimAUYoooASiloxQAlFFFAxKKWjFMBKKKKACkxS0UAFFFFAxKKWkxQAlFLRTASiiigAooooASilpKBhRRRQAUUUUDExRRmimAUUUlABSU6jFADaKXFJQMKKOtFMAxSUtFAxKKKKANSiiiuUwEpaKSmAUtJS0AJRRiigQUUUUAFJS0UAJRRRQAUUUUAFJS0UAJRRRTAKKKKAEopaSgAooooASiiimAUUUUAFFFFABRRRQAUUUUAJRS0UAJRQaKACiiigApKWigBKKWg0wEooooAKKKKACiiigAooooAKKKKACkpaKAEpMU7FJQAlFLSYpgFFFFAwooooAKKKKACkpaKAEoopcUAJRRRTAKTFLRSASilpMUDFpKKWmAlFLSUAFJS0UAJRS0lABRRRTGJRS0mKACiiigAooooAKSlozQMSkp1JQAlFLSUwCiiigApKWigYlFLSUAFJS0UAFJS0UxiUUtJQAlGKWigBKSnUlAxKKWkoAKSlopgalJRRXKYhRRRQAlFLSUwFzRSUUAFFLRigQlFFFABSUtFACUUtJQAUUUUAFJS0UAJRRRQAUUUUwCkpaKAEooooASiiimAUtVrq+trJczyhT2XqT+Fc3qPiZxG5iK20KjmRyM4+vQVcKUp7Fxp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FABRRRQAUUUUAFFFFABRRRQIKSlooGJjNRtEpqSigBqoF7U6iigQUUUUAFFFFMAooooASilpKACiiigBKKKKYwooooJCiiigAooooAKKKKACiiigBKKWkoAKKKKACiiigAooooAKKKKACkpaKBCUUUUAJRS0lMAooooAKKKKACjrRRQAxolalWMLTqKACiiigAooooAKKKKACiiigAooooAKSlooASiiigAooooAKKKKACiiigBKKWjFMBKKKKACiiigAooooAKKKKACiiigAooooGFFFFABSUtFAFuiiisSwooooASilpKACiiimAUUUUAFFFFABRRRQAlFLSUCCiiigApKWigBKKKKYBRRRQAUUUUAFFFFABRRRQAUUUUCCkpaKBiUUUUAFFFFAgooooAKKKKYBRRRQAlFLSUAFFFFABSUtFACUUUUwCiiigQUUUUAFFFFABRRRQAlFLSUAFFFFABRRRQAUUUUAFFFFABSUtFAhKKKKACkpaKAEopaSmAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAlFLSUAFFFFABRRRQAUUUUAFFFFACUtFFACUUUUwCiiigAooooAKKKKACiiigYUUUUAW6KKKxNAooooEFFFFACUUtJQAUUUUwCiiigAooooAKKKKAEopaSgQUUUUAFJS0UAJRRRTAKKKKACiiigAooooAKKKKACiiigQUlLRQMSiiigAooooEFFFFABRRRTAKKKKAEopaSgAooooAKSlooASilpKACiiimIKKKKACiiigAooooASilpKACiiigAooooAKKKKACiiigApKWigQlFFFABRRRQAlFLRQAlFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACjFFFACUUtJQAUUUUAFHFcZcePne61C10rQb2+k0+Ro7g71jUEMVG3qWyRwMZPpVK58ZeKjaGdPDUOnIFU79QnOGLMFVRwuCSe+MdTgVapy/porkkegUVyPgLxXdeKNPu5b6KCO4gmC7YVKjaRxkEk5yGrrs0pQcZOLE4tOzDFJS0UhCZopaTpQAUUUUAFFFFABRRRQAUUUUAW6KKKxNQooooAKKKKBBRRRQAlFLSUAFFFFMAooooAKKKKACiiigBKKWkoEFFFFABSUtFACUUUUwCiiigAooooAKKKKACiiigAooooEFJS0UDEooooAKKKKBBRRRQAUUUUwCiiigBKKWkoAKKKKACiiigBKKWkoAKKKKYgooooAKKKKACiiigBKKWkoAKKKKACiiigAooooAKKKKACkpaKBCUUUUAFFFFABRiiigBKKWkxQAUUUUwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooASilooA8gaaWy+Jms6CuoC0s9VkAlcxhjuZQ4Ck/dY7ioPPUcZxjrPEkIbw1rsd/qct7DLMoEcHlxNbDcu1CWIB5xnPJB981jax4Wi1f4rMZLhI/9FjvRGQcyFTsC/T5RnHOOnXIo6l4t0/Sru/vP7Bhn1Q3kiiSWMN9mZI0U/Ptyw8zdjBHHpmuqSUnHk3sjZ6tWHfB+RYbnV7Vn+ZxG8eAcOELBiD7bk/MVaji1y/j8Satb+Ir22fTr+6SGEnfFtj+YAg8Y5x7ehqh4C8Q6prPjgTalP57NYtChQDamCrE4XgE7efc1003gC4kn1Bf+EivYbC/uZLie1gQLu3nkbsntgdOfSirK1RuVru3mOTtJ3Of17xnqV/oukCxvI7C7No1/dyFwgOzKqq567mB+X/dqxrl1e6kND1fT9dv7aDWLmGBreKT5IMgK2MdSCD+Oa6jTvBGlWdxeSTww3sc4iSOK4hV1hSNdqqM5ycdT3qCDwLBbQWdvHfS/Z7PU/t8EZXOwdfLBz0zzn3NZ88FsieaPQ5jxH4j1HRdYgtrbVWlt9FSI3YmlCyXjuwymP4vk56cc1saobzXvG1vYWOuXdnZPpK3iNavgOTIQD+II/Kte08FaWlpexahFFqEt3PLPJPNCu5S/Xaf4cY7d6zF8AXcDWUlp4iubee2tPsnmrCCWj3s4HXjGQP8AgIoUofMOaJiS+JNftGn8OHUVkvl1KCzTUfKBIjkB5x03DaOuep5yM1fvLvV/BWrW8cmrTarZ3VpdS+XdD5keGPfkN1weBjpya108AaaNFksHubt7iS4F218ZP33nDo4P4n8z35p2n+C1j1D7fq+p3OrXCxNDGJwFREYYb5R1JBIz703KH9LcOaJzun3d5HcaFf6v4pvBeanJG8dpBFmAqzDCEDgZBxntz1xmvTK4q3+HwtrqyVNavG0yyuluobKQBgrqcjDemSeMdz35rtqio037pM2nsV7p5I4t6PHGByzOCcD2HeqrXV0n2ZpFRfMKgpsPU9ct0HsKuT20dyqrKGIVtw2uV5/A0z7DBvVyHJGDzIxzjpnnn8azILFFFFMC3RSmkrE1CiiigAooooAKKKKBBRRRQAlFLSUAFFFFMAooooAKKKKACiiigBKKDRQIKKKKACkpaKAEooopgFFFFABRRRQAUUUUAFFFFABRRRQIKSloNAxKKKKACiiigQUUUUAFFFFMAooooASilpKACiiigAooooASig0UAFFFFAgooopgFFFFABRRRQAlFFFABRRRQAUUUUAFFFFABRRRQAUYoooEJRS0lABRRRQAUUUUAFJS0UAJRS0lMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIp4VuIWicuFYYJjdkb8GUgj8DVKDQNJtSrR6fbmRc4ldA8hyckl2yxOSTknvWlRQAlFLSUAFFFFABRRRQAUUUUAFFFFACGilpKYBRScKowopkFtHaQrDEoVE+UAADpx0HA6DgcADBcD/2Q==']\n" + "ename": "NameError", + "evalue": "name 'image_b64' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/Users/jacoblee/langchain/langchain/docs/docs/integrations/chat/ollama.ipynb Cell 13\u001b[0m line \u001b[0;36m1\n\u001b[1;32m 9\u001b[0m \u001b[39m# Call the chat model with both messages and images\u001b[39;00m\n\u001b[1;32m 10\u001b[0m content_parts \u001b[39m=\u001b[39m []\n\u001b[1;32m 11\u001b[0m image_part \u001b[39m=\u001b[39m {\n\u001b[1;32m 12\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mtype\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39m\"\u001b[39m\u001b[39mimage_url\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m---> 13\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mimage_url\u001b[39m\u001b[39m\"\u001b[39m: {\u001b[39m\"\u001b[39m\u001b[39murl\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mdata:image/jpeg;base64,\u001b[39m\u001b[39m{\u001b[39;00mimage_b64\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m},\n\u001b[1;32m 14\u001b[0m }\n\u001b[1;32m 15\u001b[0m text_part \u001b[39m=\u001b[39m {\u001b[39m\"\u001b[39m\u001b[39mtype\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39m\"\u001b[39m\u001b[39mtext\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39mtext\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39m\"\u001b[39m\u001b[39mWhat is the Daollar-based gross retention rate?\u001b[39m\u001b[39m\"\u001b[39m}\n\u001b[1;32m 17\u001b[0m content_parts\u001b[39m.\u001b[39mappend(image_part)\n", + "\u001b[0;31mNameError\u001b[0m: name 'image_b64' is not defined" ] - }, - { - "data": { - "text/plain": [ - "AIMessage(content='')" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -372,27 +364,13 @@ " \"type\": \"image_url\",\n", " \"image_url\": {\"url\": f\"data:image/jpeg;base64,{image_b64}\"},\n", "}\n", -<<<<<<< HEAD "text_part = {\"type\": \"text\", \"text\": \"What is the Daollar-based gross retention rate?\"}\n", -======= - "text_message = {\n", - " \"type\": \"text\",\n", - " \"text\": \"What is the gross retention rate?\"\n", - "}\n", ->>>>>>> 3404d71f8a641e6de22a60b1dd51bc2353f09f9e "\n", "content_parts.append(image_part)\n", "content_parts.append(text_part)\n", "prompt = [HumanMessage(content=content_parts)]\n", "chat_model(prompt)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 484399000315147d2ac52b04598c572aeb9b263b Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Fri, 15 Dec 2023 15:29:31 -0800 Subject: [PATCH 11/13] fmt --- .../langchain_community/chat_models/ollama.py | 51 ++++++++----------- .../langchain_community/llms/ollama.py | 29 +++++------ 2 files changed, 35 insertions(+), 45 deletions(-) diff --git a/libs/community/langchain_community/chat_models/ollama.py b/libs/community/langchain_community/chat_models/ollama.py index ba955492cc47b..54aa8a8c8cf2d 100644 --- a/libs/community/langchain_community/chat_models/ollama.py +++ b/libs/community/langchain_community/chat_models/ollama.py @@ -40,7 +40,7 @@ def _chat_stream_response_to_chat_generation_chunk( generation_info = parsed_response if parsed_response.get("done") is True else None return ChatGenerationChunk( message=AIMessageChunk( - content=parsed_response.get("message", {}).get("content", "") + content=parsed_response.get("message", {}).get("content", "") ), generation_info=generation_info, ) @@ -91,8 +91,7 @@ def _format_messages_as_text(self, messages: List[BaseMessage]) -> str: ) def _convert_messages_to_ollama_messages( - self, - messages: List[BaseMessage] + self, messages: List[BaseMessage] ) -> List[Dict[str, Union[str, List[str]]]]: ollama_messages = [] for message in messages: @@ -105,7 +104,7 @@ def _convert_messages_to_ollama_messages( role = "system" else: raise ValueError("Received unsupported message type for Ollama.") - + content = "" images = [] if isinstance(message.content, str): @@ -116,17 +115,16 @@ def _convert_messages_to_ollama_messages( content += f"\n{content_part['text']}" elif content_part.get("type") == "image_url": if isinstance(content_part.get("image_url"), str): - image_url_components = content_part["image_url"].split(",") - # Support data:image/jpeg;base64, format - # and base64 strings - if len(image_url_components) > 1: - images.append(image_url_components[1]) - else: - images.append(image_url_components[0]) + image_url_components = content_part["image_url"].split(",") + # Support data:image/jpeg;base64, format + # and base64 strings + if len(image_url_components) > 1: + images.append(image_url_components[1]) + else: + images.append(image_url_components[0]) else: raise ValueError( - "Only string image_url " - "content parts are supported." + "Only string image_url " "content parts are supported." ) else: raise ValueError( @@ -135,31 +133,29 @@ def _convert_messages_to_ollama_messages( "with a string 'image_url' field." ) - ollama_messages.append({ - "role": role, - "content": content, - "images": images, - }) + ollama_messages.append( + { + "role": role, + "content": content, + "images": images, + } + ) return ollama_messages - + def _create_chat_stream( self, messages: List[BaseMessage], stop: Optional[List[str]] = None, - **kwargs: Any + **kwargs: Any, ) -> Iterator[str]: payload = { - "messages": self._convert_messages_to_ollama_messages(messages), + "messages": self._convert_messages_to_ollama_messages(messages), } yield from self._create_stream( - payload=payload, - stop=stop, - api_url=f"{self.base_url}/api/chat/", - **kwargs + payload=payload, stop=stop, api_url=f"{self.base_url}/api/chat/", **kwargs ) - def _chat_stream_with_aggregation( self, messages: List[BaseMessage], @@ -186,7 +182,6 @@ def _chat_stream_with_aggregation( return final_chunk - def _generate( self, messages: List[BaseMessage], @@ -224,7 +219,6 @@ def _generate( ) return ChatResult(generations=[chat_generation]) - def _stream( self, messages: List[BaseMessage], @@ -245,7 +239,6 @@ def _stream( except OllamaEndpointNotFoundError: yield from self._legacy_stream(messages, stop, **kwargs) - @deprecated("0.0.3", alternative="_stream") def _legacy_stream( self, diff --git a/libs/community/langchain_community/llms/ollama.py b/libs/community/langchain_community/llms/ollama.py index 8e4fe3286d45d..64ddf82c801cb 100644 --- a/libs/community/langchain_community/llms/ollama.py +++ b/libs/community/langchain_community/llms/ollama.py @@ -132,23 +132,20 @@ def _default_params(self) -> Dict[str, Any]: def _identifying_params(self) -> Mapping[str, Any]: """Get the identifying parameters.""" return {**{"model": self.model, "format": self.format}, **self._default_params} - + def _create_generate_stream( - self, - prompt: str, - stop: Optional[List[str]] = None, - images: Optional[List[str]] = None, - **kwargs: Any + self, + prompt: str, + stop: Optional[List[str]] = None, + images: Optional[List[str]] = None, + **kwargs: Any, ) -> Iterator[str]: - payload = { - "prompt": prompt, - "images": images - } + payload = {"prompt": prompt, "images": images} yield from self._create_stream( - payload=payload, - stop=stop, - api_url=f"{self.base_url}/api/generate/", - **kwargs + payload=payload, + stop=stop, + api_url=f"{self.base_url}/api/generate/", + **kwargs, ) def _create_stream( @@ -185,7 +182,7 @@ def _create_stream( request_payload = { "prompt": payload.get("prompt"), "images": payload.get("images", []), - **params + **params, } response = requests.post( @@ -199,7 +196,7 @@ def _create_stream( if response.status_code != 200: if response.status_code == 404: raise OllamaEndpointNotFoundError( - "Ollama call failed with status code 404." + "Ollama call failed with status code 404." ) else: optional_detail = response.json().get("error") From f196ce3efe64e08f48735978c40f7f308cf5f84b Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Fri, 15 Dec 2023 15:34:40 -0800 Subject: [PATCH 12/13] fmt --- docs/docs/integrations/chat/ollama.ipynb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index 99f6dd54344a9..e34977696cff1 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -350,9 +350,8 @@ } ], "source": [ - "from langchain_core.messages import HumanMessage\n", - "\n", "from langchain.chat_models import ChatOllama\n", + "from langchain_core.messages import HumanMessage\n", "\n", "chat_model = ChatOllama(\n", " model=\"bakllava\",\n", From f97dfc4985f5fb3cb6fc32b09fb042b0e77a39cd Mon Sep 17 00:00:00 2001 From: Lance Martin Date: Fri, 15 Dec 2023 15:42:39 -0800 Subject: [PATCH 13/13] Update ntbks --- docs/docs/integrations/chat/ollama.ipynb | 67 +++++++++++------------- docs/docs/integrations/llms/ollama.ipynb | 40 ++++++-------- 2 files changed, 46 insertions(+), 61 deletions(-) diff --git a/docs/docs/integrations/chat/ollama.ipynb b/docs/docs/integrations/chat/ollama.ipynb index e34977696cff1..99b6fba3a0ff1 100644 --- a/docs/docs/integrations/chat/ollama.ipynb +++ b/docs/docs/integrations/chat/ollama.ipynb @@ -246,6 +246,9 @@ "\n", "Ollama has support for multi-modal LLMs, such as [bakllava](https://ollama.ai/library/bakllava) and [llava](https://ollama.ai/library/llava).\n", "\n", + "Browse the full set of versions for models with `tags`, such as [here](https://ollama.ai/library/llava/tags).\n", + "\n", + "Download the desired LLM:\n", "```\n", "ollama pull bakllava\n", "```\n", @@ -255,40 +258,31 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: pillow in /Users/jacoblee/langchain/langchain/libs/langchain/.venv/lib/python3.10/site-packages (10.1.0)\n", - "\u001b[33mWARNING: You are using pip version 22.0.4; however, version 23.3.1 is available.\n", - "You should consider upgrading via the '/Users/jacoblee/langchain/langchain/libs/langchain/.venv/bin/python -m pip install --upgrade pip' command.\u001b[0m\u001b[33m\n", - "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n" - ] - } - ], + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], "source": [ "%pip install pillow" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [ { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/Users/jacoblee/langchain/langchain/docs/docs/integrations/chat/ollama.ipynb Cell 12\u001b[0m line \u001b[0;36m3\n\u001b[1;32m 31\u001b[0m display(HTML(image_html))\n\u001b[1;32m 34\u001b[0m file_path \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m---> 35\u001b[0m pil_image \u001b[39m=\u001b[39m Image\u001b[39m.\u001b[39;49mopen(file_path)\n\u001b[1;32m 37\u001b[0m image_b64 \u001b[39m=\u001b[39m convert_to_base64(pil_image)\n\u001b[1;32m 38\u001b[0m plt_img_base64(image_b64)\n", - "File \u001b[0;32m~/langchain/langchain/libs/langchain/.venv/lib/python3.10/site-packages/PIL/Image.py:3243\u001b[0m, in \u001b[0;36mopen\u001b[0;34m(fp, mode, formats)\u001b[0m\n\u001b[1;32m 3240\u001b[0m filename \u001b[39m=\u001b[39m fp\n\u001b[1;32m 3242\u001b[0m \u001b[39mif\u001b[39;00m filename:\n\u001b[0;32m-> 3243\u001b[0m fp \u001b[39m=\u001b[39m builtins\u001b[39m.\u001b[39;49mopen(filename, \u001b[39m\"\u001b[39;49m\u001b[39mrb\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[1;32m 3244\u001b[0m exclusive_fp \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m\n\u001b[1;32m 3246\u001b[0m \u001b[39mtry\u001b[39;00m:\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'" - ] + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -334,19 +328,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'image_b64' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/Users/jacoblee/langchain/langchain/docs/docs/integrations/chat/ollama.ipynb Cell 13\u001b[0m line \u001b[0;36m1\n\u001b[1;32m 9\u001b[0m \u001b[39m# Call the chat model with both messages and images\u001b[39;00m\n\u001b[1;32m 10\u001b[0m content_parts \u001b[39m=\u001b[39m []\n\u001b[1;32m 11\u001b[0m image_part \u001b[39m=\u001b[39m {\n\u001b[1;32m 12\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mtype\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39m\"\u001b[39m\u001b[39mimage_url\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m---> 13\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mimage_url\u001b[39m\u001b[39m\"\u001b[39m: {\u001b[39m\"\u001b[39m\u001b[39murl\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mdata:image/jpeg;base64,\u001b[39m\u001b[39m{\u001b[39;00mimage_b64\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m},\n\u001b[1;32m 14\u001b[0m }\n\u001b[1;32m 15\u001b[0m text_part \u001b[39m=\u001b[39m {\u001b[39m\"\u001b[39m\u001b[39mtype\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39m\"\u001b[39m\u001b[39mtext\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39mtext\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39m\"\u001b[39m\u001b[39mWhat is the Daollar-based gross retention rate?\u001b[39m\u001b[39m\"\u001b[39m}\n\u001b[1;32m 17\u001b[0m content_parts\u001b[39m.\u001b[39mappend(image_part)\n", - "\u001b[0;31mNameError\u001b[0m: name 'image_b64' is not defined" - ] + "data": { + "text/plain": [ + "AIMessage(content='90%')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -361,7 +354,7 @@ "content_parts = []\n", "image_part = {\n", " \"type\": \"image_url\",\n", - " \"image_url\": {\"url\": f\"data:image/jpeg;base64,{image_b64}\"},\n", + " \"image_url\": f\"data:image/jpeg;base64,{image_b64}\",\n", "}\n", "text_part = {\"type\": \"text\", \"text\": \"What is the Daollar-based gross retention rate?\"}\n", "\n", @@ -388,7 +381,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/docs/docs/integrations/llms/ollama.ipynb b/docs/docs/integrations/llms/ollama.ipynb index b069bfe56317c..adbf4eccac8ea 100644 --- a/docs/docs/integrations/llms/ollama.ipynb +++ b/docs/docs/integrations/llms/ollama.ipynb @@ -115,7 +115,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -126,20 +126,20 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/Users/jacoblee/langchain/langchain/docs/docs/integrations/llms/ollama.ipynb Cell 7\u001b[0m line \u001b[0;36m3\n\u001b[1;32m 31\u001b[0m display(HTML(image_html))\n\u001b[1;32m 34\u001b[0m file_path \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m---> 35\u001b[0m pil_image \u001b[39m=\u001b[39m Image\u001b[39m.\u001b[39;49mopen(file_path)\n\u001b[1;32m 36\u001b[0m image_b64 \u001b[39m=\u001b[39m convert_to_base64(pil_image)\n\u001b[1;32m 37\u001b[0m plt_img_base64(image_b64)\n", - "File \u001b[0;32m~/langchain/langchain/libs/langchain/.venv/lib/python3.10/site-packages/PIL/Image.py:3243\u001b[0m, in \u001b[0;36mopen\u001b[0;34m(fp, mode, formats)\u001b[0m\n\u001b[1;32m 3240\u001b[0m filename \u001b[39m=\u001b[39m fp\n\u001b[1;32m 3242\u001b[0m \u001b[39mif\u001b[39;00m filename:\n\u001b[0;32m-> 3243\u001b[0m fp \u001b[39m=\u001b[39m builtins\u001b[39m.\u001b[39;49mopen(filename, \u001b[39m\"\u001b[39;49m\u001b[39mrb\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[1;32m 3244\u001b[0m exclusive_fp \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m\n\u001b[1;32m 3246\u001b[0m \u001b[39mtry\u001b[39;00m:\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/Users/rlm/Desktop/Eval_Sets/multi_modal_presentations/DDOG/img_23.jpg'" - ] + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -184,31 +184,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "90%" - ] - }, { "data": { "text/plain": [ "'90%'" ] }, - "execution_count": 18, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "llm_with_image_context = bakllava.bind(images=[image_b64])\n", - "\n", - "llm_with_image_context(prompt=\"What is the dollar based gross retention rate:\")" + "llm_with_image_context.invoke(\"What is the dollar based gross retention rate:\")" ] } ], @@ -228,7 +220,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.9.16" } }, "nbformat": 4,