{
 "cells": [
  {
   "cell_type": "raw",
   "id": "62439ac0-882e-43d5-8e69-424c437c7f56",
   "metadata": {},
   "source": [
    "---\n",
    "sidebar_position: 2\n",
    "title: LLMs\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc68673f-2227-4ff3-8b7f-f672c0d662ed",
   "metadata": {},
   "source": [
    ":::info\n",
    "\n",
    "Head to [Integrations](/docs/integrations/llms/) for documentation on built-in integrations with LLM providers.\n",
    "\n",
    ":::\n",
    "\n",
    "Large Language Models (LLMs) are a core component of LangChain.\n",
    "LangChain does not serve its own LLMs, but rather provides a standard interface for interacting with many different LLMs.\n",
    "\n",
    "\n",
    "There are lots of LLM providers (OpenAI, Cohere, Hugging Face, etc) - the `LLM` class is designed to provide a standard interface for all of them.\n",
    "\n",
    "In this walkthrough we'll work with an OpenAI LLM wrapper, although the functionalities highlighted are generic for all LLM types.\n",
    "\n",
    "### Setup\n",
    "\n",
    "For this example we'll need to install the OpenAI Python package:\n",
    "\n",
    "```bash\n",
    "pip install openai\n",
    "```\n",
    "\n",
    "Accessing the API requires an API key, which you can get by creating an account and heading [here](https://platform.openai.com/account/api-keys). Once we have a key we'll want to set it as an environment variable by running:\n",
    "\n",
    "```bash\n",
    "export OPENAI_API_KEY=\"...\"\n",
    "```\n",
    "\n",
    "If you'd prefer not to set an environment variable you can pass the key in directly via the `openai_api_key` named parameter when initiating the OpenAI LLM class:\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3937ea24-7ce8-44c8-9ae5-346429ae1e9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.llms import OpenAI\n",
    "\n",
    "llm = OpenAI(openai_api_key=\"...\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "765e2ad5-4546-498b-b63b-a299c14a4c8a",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "otherwise you can initialize without any params:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4ceb3739-61b8-4ec2-a716-d4238962e3cd",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.llms import OpenAI\n",
    "\n",
    "llm = OpenAI()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "966b5d74-defd-4f89-8c37-a68ca4a161d9",
   "metadata": {},
   "source": [
    "## LCEL\n",
    "\n",
    "LLMs implement the [Runnable interface](/docs/expression_language/interface), the basic building block of the [LangChain Expression Language (LCEL)](/docs/expression_language/). This means they support `invoke`, `ainvoke`, `stream`, `astream`, `batch`, `abatch`, `astream_log` calls.\n",
    "\n",
    "LLMs accept **strings** as inputs, or objects which can be coerced to string prompts, including `List[BaseMessage]` and `PromptValue`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "33324dab-375f-4663-8e76-4b6592ebe8a5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\n\\n1. The Phillips Curve Theory: This suggests that there is an inverse relationship between unemployment and inflation, meaning that when unemployment is low, inflation will be higher, and when unemployment is high, inflation will be lower.\\n\\n2. The Monetarist Theory: This theory suggests that the relationship between unemployment and inflation is weak, and that changes in the money supply are more important in determining inflation.\\n\\n3. The Resource Utilization Theory: This suggests that when unemployment is low, firms are able to raise wages and prices in order to take advantage of the increased demand for their products and services. This leads to higher inflation.'"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm.invoke(\n",
    "    \"What are some theories about the relationship between unemployment and inflation?\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a9a5d8a7-b7f1-4454-8c52-1a537f4a68fc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "1. The Phillips Curve Theory: This theory states that there is an inverse relationship between unemployment and inflation. As unemployment decreases, inflation increases and vice versa.\n",
      "\n",
      "2. The Cost-Push Inflation Theory: This theory suggests that an increase in unemployment leads to a decrease in aggregate demand, which causes prices to go up due to a decrease in supply.\n",
      "\n",
      "3. The Wage-Push Inflation Theory: This theory states that when unemployment is low, wages tend to increase due to competition for labor, which causes prices to rise.\n",
      "\n",
      "4. The Monetarist Theory: This theory states that there is no direct relationship between unemployment and inflation, but rather, an increase in the money supply leads to inflation, which can be caused by an increase in unemployment."
     ]
    }
   ],
   "source": [
    "for chunk in llm.stream(\n",
    "    \"What are some theories about the relationship between unemployment and inflation?\"\n",
    "):\n",
    "    print(chunk, end=\"\", flush=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "462697a4-6377-4e1d-9d14-768b54198ef9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['\\n\\n1. The Phillips Curve Theory: This theory suggests that there is an inverse relationship between unemployment and inflation, meaning that when unemployment decreases, inflation rises, and when unemployment increases, inflation decreases. This theory is based on the idea that when the economy is doing well, there is more demand for goods and services, causing prices to increase.\\n\\n2. The Cost-Push Theory: This theory suggests that when the cost of production increases, it leads to higher prices and lower output. This can lead to higher unemployment and eventually higher inflation.\\n\\n3. The Demand-Pull Theory: This theory suggests that when demand for goods and services increases, it leads to higher prices and eventually higher inflation. This can lead to higher unemployment as businesses cannot keep up with the higher demand.\\n\\n4. The Structural Unemployment Theory: This theory suggests that when there is a mismatch between the skills of the unemployed and the skills required in the job market, it leads to higher unemployment and eventually higher inflation.']"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm.batch(\n",
    "    [\n",
    "        \"What are some theories about the relationship between unemployment and inflation?\"\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "a52817f2-4102-47f3-a985-22547b75aa89",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\n\\n1. Phillips Curve Theory: This theory states that there is an inverse relationship between inflation and unemployment. As unemployment decreases, inflation increases, and vice versa.\\n\\n2. Cost-Push Theory: This theory suggests that inflation is caused by rising costs, which can be caused by an increase in unemployment. As unemployment rises, businesses are unable to keep up with demand and have to raise prices to compensate.\\n\\n3. Demand-Pull Theory: This theory suggests that inflation occurs when demand exceeds supply. As unemployment increases, demand for goods and services decreases, leading to a decrease in inflation.\\n\\n4. Monetary Theory: This theory suggests that the money supply and inflation are related to unemployment. When the money supply increases, prices increase, leading to an increase in inflation. If unemployment is high, then the money supply increases, leading to an increase in inflation.'"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "await llm.ainvoke(\n",
    "    \"What are some theories about the relationship between unemployment and inflation?\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "94390456-9542-4d75-91bd-6994ddae56f2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "1. Phillips Curve Theory: This theory suggests that there is an inverse relationship between unemployment and inflation, meaning that when unemployment is low, inflation rises and vice versa.\n",
      "\n",
      "2. Cost-Push Theory: This theory suggests that inflation is caused by rising costs of production, such as wages, raw materials, and energy. It states that when costs increase, firms must pass these costs onto the consumer, thus raising the price of goods and services and leading to inflation.\n",
      "\n",
      "3. Demand-Pull Theory: This theory suggests that inflation is caused by an increase in demand for goods and services, leading to a rise in prices. It suggests that when unemployment is low, people have more money to spend and this increased demand pushes up prices.\n",
      "\n",
      "4. Monetarist Theory: This theory states that inflation is caused by an increase in the money supply. It suggests that when the money supply increases, people have more money to spend, leading to higher prices."
     ]
    }
   ],
   "source": [
    "async for chunk in llm.astream(\n",
    "    \"What are some theories about the relationship between unemployment and inflation?\"\n",
    "):\n",
    "    print(chunk, end=\"\", flush=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c10291b6-5848-46b0-af7d-0602f21d1c81",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['\\n\\n1. The Phillips Curve Theory: This theory states that there is an inverse relationship between unemployment and inflation. When unemployment is low, wages increase, leading to higher prices and overall inflation.\\n\\n2. The Cost-Push Theory: This theory states that inflation is caused by increases in the costs of production, such as wages, goods, and services. When the cost of production increases, the prices of goods and services must also increase, leading to inflation.\\n\\n3. The Demand Pull Theory: This theory states that inflation is caused by an increase in aggregate demand for goods and services. When the demand is high, prices must increase in order to meet the demand. This leads to inflation.\\n\\n4. The Structural Unemployment Theory: This theory states that when unemployment is high, there is an excess supply of labor. This excess supply of labor can result in lower wages, which can cause inflation as people are willing to accept lower wages for the same amount of work.']"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "await llm.abatch(\n",
    "    [\n",
    "        \"What are some theories about the relationship between unemployment and inflation?\"\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "519f566d-9817-414e-8a73-1483a67c2726",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RunLogPatch({'op': 'replace',\n",
      "  'path': '',\n",
      "  'value': {'final_output': None,\n",
      "            'id': 'baf410ad-618e-44db-93c8-809da4e3ed44',\n",
      "            'logs': {},\n",
      "            'streamed_output': []}})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '\\n'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '\\n'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '1'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '.'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' The'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' Phillips'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' Curve'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ':'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' This'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' theory'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' suggests'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' that'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' there'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' is'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' an'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' inverse'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' relationship'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' between'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' unemployment and'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' inflation'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '.'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' When'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' unemployment'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' is'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' low'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ','})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' inflation'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' tends'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' to'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' be'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' high'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ','})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' and'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' when'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' unemployment'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' is'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' high'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ','})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' inflation'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' tends'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' to'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' be'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' low'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '.'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' '})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '\\n'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '\\n'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '2'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '.'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' The'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' NA'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'IR'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'U'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' Theory'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ':'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' This'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' theory'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' suggests'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' that there is'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' a'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' natural'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' rate'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' of'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' unemployment'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ','})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' also'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' known'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' as'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' the'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' Non'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '-'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'Ac'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'celer'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'ating'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' In'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'flation'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' Rate'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' of'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' Unemployment'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' ('})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'NA'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'IR'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'U'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ').'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' According'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' to'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' this'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' theory'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ','})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' when'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' unemployment'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' is'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' below'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' the'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' NA'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'IR'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'U'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ','})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' then'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' inflation'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' will'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' increase'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ','})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' and'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' when'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' unemployment'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' is'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' above'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' the'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' NA'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'IR'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'U'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ','})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' then'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' inflation'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' will'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' decrease'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '.'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '\\n'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '\\n'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '3'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '.'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' The'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' Cost'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '-'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'Push'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' In'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': 'flation'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' Theory'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ':'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' This'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' theory'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' suggests'})\n",
      "RunLogPatch({'op': 'add',\n",
      "  'path': '/streamed_output/-',\n",
      "  'value': ' that high unemployment'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' leads'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' to'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' higher'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' wages'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ','})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' which'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' in'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' turn'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' leads'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' to'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' higher'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' prices'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ' and higher inflation'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': '.'})\n",
      "RunLogPatch({'op': 'add', 'path': '/streamed_output/-', 'value': ''})\n",
      "RunLogPatch({'op': 'replace',\n",
      "  'path': '/final_output',\n",
      "  'value': {'generations': [[{'generation_info': {'finish_reason': 'stop',\n",
      "                                                  'logprobs': None},\n",
      "                              'text': '\\n'\n",
      "                                      '\\n'\n",
      "                                      '1. The Phillips Curve: This theory '\n",
      "                                      'suggests that there is an inverse '\n",
      "                                      'relationship between unemployment and '\n",
      "                                      'inflation. When unemployment is low, '\n",
      "                                      'inflation tends to be high, and when '\n",
      "                                      'unemployment is high, inflation tends '\n",
      "                                      'to be low. \\n'\n",
      "                                      '\\n'\n",
      "                                      '2. The NAIRU Theory: This theory '\n",
      "                                      'suggests that there is a natural rate '\n",
      "                                      'of unemployment, also known as the '\n",
      "                                      'Non-Accelerating Inflation Rate of '\n",
      "                                      'Unemployment (NAIRU). According to this '\n",
      "                                      'theory, when unemployment is below the '\n",
      "                                      'NAIRU, then inflation will increase, '\n",
      "                                      'and when unemployment is above the '\n",
      "                                      'NAIRU, then inflation will decrease.\\n'\n",
      "                                      '\\n'\n",
      "                                      '3. The Cost-Push Inflation Theory: This '\n",
      "                                      'theory suggests that high unemployment '\n",
      "                                      'leads to higher wages, which in turn '\n",
      "                                      'leads to higher prices and higher '\n",
      "                                      'inflation.'}]],\n",
      "            'llm_output': None,\n",
      "            'run': None}})\n"
     ]
    }
   ],
   "source": [
    "async for chunk in llm.astream_log(\n",
    "    \"What are some theories about the relationship between unemployment and inflation?\"\n",
    "):\n",
    "    print(chunk)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09108687-ed15-468b-9ac5-674e75785199",
   "metadata": {},
   "source": [
    "## [LangSmith](/docs/langsmith)\n",
    "\n",
    "All `LLM`s come with built-in LangSmith tracing. Just set the following environment variables:\n",
    "```bash\n",
    "export LANGCHAIN_TRACING_V2=\"true\"\n",
    "export LANGCHAIN_API_KEY=<your-api-key>\n",
    "```\n",
    "\n",
    "and any `LLM` invocation (whether it's nested in a chain or not) will automatically be traced. A trace will include inputs, outputs, latency, token usage, invocation params, environment params, and more. See an example here: https://smith.langchain.com/public/7924621a-ff58-4b1c-a2a2-035a354ef434/r.\n",
    "\n",
    "In LangSmith you can then provide feedback for any trace, compile annotated datasets for evals, debug performance in the playground, and more."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20ef52be-6e51-43a3-be2a-b1a862d5fc80",
   "metadata": {},
   "source": [
    "### [Legacy] `__call__`: string in -> string out\n",
    "The simplest way to use an LLM is a callable: pass in a string, get a string completion."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1ce7ca36-35f6-4584-acd1-a082e1c01983",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\n\\nQ: What did the fish say when it hit the wall?\\nA: Dam!'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm(\"Tell me a joke\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b4ad9e5-50ec-4031-bfaa-23a0130da3c6",
   "metadata": {},
   "source": [
    "### [Legacy] `generate`: batch calls, richer outputs\n",
    "`generate` lets you call the model with a list of strings, getting back a more complete response than just the text. This complete response can include things like multiple top responses and other LLM provider-specific information:\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "af7b2d3d-ab7a-4b2a-a67a-9dd8129ca026",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "30"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm_result = llm.generate([\"Tell me a joke\", \"Tell me a poem\"] * 15)\n",
    "len(llm_result.generations)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "351c2604-e995-4395-8b0e-640332e0b290",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Generation(text=\"\\n\\nQ: Why don't scientists trust atoms?\\nA: Because they make up everything!\", generation_info={'finish_reason': 'stop', 'logprobs': None})]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm_result.generations[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "8324d177-badc-494c-ab41-afe4d0682d8e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Generation(text='\\n\\nRoses are red,\\nViolets are blue,\\nSugar is sweet,\\nAnd so are you!', generation_info={'finish_reason': 'stop', 'logprobs': None})]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm_result.generations[-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ec12f03-749c-4487-b1f3-7dde5db9f82a",
   "metadata": {},
   "source": [
    "You can also access provider specific information that is returned. This information is **not** standardized across providers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "cad9e4c5-bdae-4641-b78f-42eedffccaff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'token_usage': {'completion_tokens': 900,\n",
       "  'total_tokens': 1020,\n",
       "  'prompt_tokens': 120},\n",
       " 'model_name': 'text-davinci-003'}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "llm_result.llm_output"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
