Prechádzať zdrojové kódy

Add quickstart notebook

Venelin Valkov 2 rokov pred
rodič
commit
078a36ea62
6 zmenil súbory, kde vykonal 732 pridanie a 21 odobranie
  1. 1 0
      .gitignore
  2. 10 0
      .pre-commit-config.yaml
  3. 1 0
      .python-version
  4. 516 0
      00.quickstart-langchain.ipynb
  5. 201 21
      LICENSE
  6. 3 0
      README.md

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+.DS_Store

+ 10 - 0
.pre-commit-config.yaml

@@ -0,0 +1,10 @@
+repos:
+  - repo: https://github.com/nbQA-dev/nbQA
+    rev: 1.7.0
+    hooks:
+      - id: nbqa-black
+        additional_dependencies: [black==23.3.0]
+      - id: nbqa-pyupgrade
+        additional_dependencies: [pyupgrade==2.7.3]
+      - id: nbqa-isort
+        additional_dependencies: [isort==5.12.0]

+ 1 - 0
.python-version

@@ -0,0 +1 @@
+mlexpert

+ 516 - 0
00.quickstart-langchain.ipynb

@@ -0,0 +1,516 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+  "colab": {
+   "provenance": []
+  },
+  "kernelspec": {
+   "name": "python3",
+   "display_name": "Python 3"
+  },
+  "language_info": {
+   "name": "python"
+  }
+ },
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "4OIZC5EaIYY_"
+   },
+   "outputs": [],
+   "source": [
+    "!pip install -Uqqq pip --progress-bar off\n",
+    "!pip install -qqq langchain==0.0.139 --progress-bar off\n",
+    "!pip install -qqq openai==0.27.4 --progress-bar off\n",
+    "!pip install -Uqqq watermark==2.3.1 --progress-bar off\n",
+    "!pip install -Uqqq chromadb==0.3.21 --progress-bar off\n",
+    "!pip install -Uqqq tiktoken==0.3.3 --progress-bar off"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "%load_ext watermark"
+   ],
+   "metadata": {
+    "id": "qQ-YYVMCKbYf"
+   },
+   "execution_count": 2,
+   "outputs": []
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "import os\n",
+    "import textwrap\n",
+    "\n",
+    "import chromadb\n",
+    "import langchain\n",
+    "import openai\n",
+    "from langchain.chains import RetrievalQA\n",
+    "from langchain.chat_models import ChatOpenAI\n",
+    "from langchain.document_loaders import WebBaseLoader\n",
+    "from langchain.embeddings import OpenAIEmbeddings\n",
+    "from langchain.indexes import VectorstoreIndexCreator\n",
+    "from langchain.llms import OpenAI\n",
+    "from langchain.prompts import PromptTemplate\n",
+    "from langchain.vectorstores import Chroma"
+   ],
+   "metadata": {
+    "id": "htp4LNX0KOtb"
+   },
+   "execution_count": 3,
+   "outputs": []
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "%watermark --iversions -v -m"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "TYgj1UZTKl17",
+    "outputId": "01165430-c363-4e8d-cd6e-690a1e9363cc"
+   },
+   "execution_count": 4,
+   "outputs": [
+    {
+     "output_type": "stream",
+     "name": "stdout",
+     "text": [
+      "Python implementation: CPython\n",
+      "Python version       : 3.9.16\n",
+      "IPython version      : 7.34.0\n",
+      "\n",
+      "Compiler    : GCC 9.4.0\n",
+      "OS          : Linux\n",
+      "Release     : 5.10.147+\n",
+      "Machine     : x86_64\n",
+      "Processor   : x86_64\n",
+      "CPU cores   : 2\n",
+      "Architecture: 64bit\n",
+      "\n",
+      "chromadb : 0.3.21\n",
+      "openai   : 0.27.4\n",
+      "langchain: 0.0.139\n",
+      "\n"
+     ]
+    }
+   ]
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "def print_response(response: str):\n",
+    "    print(\"\\n\".join(textwrap.wrap(response, width=100)))"
+   ],
+   "metadata": {
+    "id": "STDwioZBj_pp"
+   },
+   "execution_count": null,
+   "outputs": []
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "os.environ[\"OPENAI_API_KEY\"] = \"YOUR OPENAI KEY\""
+   ],
+   "metadata": {
+    "id": "p8f4eu1SKp4j"
+   },
+   "execution_count": null,
+   "outputs": []
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "model = OpenAI(temperature=0)"
+   ],
+   "metadata": {
+    "id": "BA2qn63lLUc-"
+   },
+   "execution_count": null,
+   "outputs": []
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "print(\n",
+    "    model(\n",
+    "        \"You're Dwight K. Schrute from the Office. Suggest 5 places to visit in Scranton that are connected to the TV show.\"\n",
+    "    )\n",
+    ")"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "1-rQ5ETGO0Q6",
+    "outputId": "a1a550a5-15b3-4fb6-ca8f-4247a696e1f1"
+   },
+   "execution_count": null,
+   "outputs": [
+    {
+     "output_type": "stream",
+     "name": "stdout",
+     "text": [
+      "\n",
+      "\n",
+      "1. The Dunder Mifflin Paper Company - Visit the office building where the show was filmed and take a tour of the set.\n",
+      "\n",
+      "2. Poor Richard's Pub - Enjoy a drink at the bar where the cast often hung out.\n",
+      "\n",
+      "3. Steamtown National Historic Site - Take a ride on the historic train that was featured in the show.\n",
+      "\n",
+      "4. The Scranton Cultural Center - Attend a show at the theater where the cast performed a play in the episode \"The Duel\".\n",
+      "\n",
+      "5. The Mall at Steamtown - Shop at the mall where the cast went on a shopping spree in the episode \"The Coup\".\n"
+     ]
+    }
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "source": [
+    "## Q&A Over a Document"
+   ],
+   "metadata": {
+    "id": "lfA_kFae3ROU"
+   }
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "loader = WebBaseLoader(\n",
+    "    \"https://blog.twitter.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm\"\n",
+    ")"
+   ],
+   "metadata": {
+    "id": "DlJWvzaSVGwk"
+   },
+   "execution_count": null,
+   "outputs": []
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "documents = loader.load()\n",
+    "len(documents)"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "0k2sQmZCVKRF",
+    "outputId": "c46048ba-9ae2-4561-81fa-d53e5327ceb7"
+   },
+   "execution_count": null,
+   "outputs": [
+    {
+     "output_type": "execute_result",
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "metadata": {},
+     "execution_count": 12
+    }
+   ]
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "document = documents[0]\n",
+    "document.__dict__.keys()"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "334_cQoO4cZP",
+    "outputId": "9c26612c-94d0-485d-c1a9-a24d89393339"
+   },
+   "execution_count": null,
+   "outputs": [
+    {
+     "output_type": "execute_result",
+     "data": {
+      "text/plain": [
+       "dict_keys(['page_content', 'metadata'])"
+      ]
+     },
+     "metadata": {},
+     "execution_count": 13
+    }
+   ]
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "document.page_content[:100]"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/",
+     "height": 35
+    },
+    "id": "eHOdt3K_4x-E",
+    "outputId": "17c01652-b06d-473e-daff-18b74831c44e"
+   },
+   "execution_count": null,
+   "outputs": [
+    {
+     "output_type": "execute_result",
+     "data": {
+      "text/plain": [
+       "\"\\n\\n\\n\\n\\nTwitter's Recommendation Algorithm\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nEngineering\\n\\n\\n\\n\\n\\nBac\""
+      ],
+      "application/vnd.google.colaboratory.intrinsic+json": {
+       "type": "string"
+      }
+     },
+     "metadata": {},
+     "execution_count": 14
+    }
+   ]
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "document.metadata"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "MxnizWE-4uzz",
+    "outputId": "0de4c185-06f6-4e93-c88f-4fc14e3a225a"
+   },
+   "execution_count": null,
+   "outputs": [
+    {
+     "output_type": "execute_result",
+     "data": {
+      "text/plain": [
+       "{'source': 'https://blog.twitter.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm'}"
+      ]
+     },
+     "metadata": {},
+     "execution_count": 15
+    }
+   ]
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "index = VectorstoreIndexCreator().from_loaders([loader])"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "dNk8kGhDa3GR",
+    "outputId": "0f14832b-ec0e-4263-96e1-752fabf757c2"
+   },
+   "execution_count": null,
+   "outputs": [
+    {
+     "output_type": "stream",
+     "name": "stderr",
+     "text": [
+      "WARNING:chromadb:Using embedded DuckDB without persistence: data will be transient\n"
+     ]
+    }
+   ]
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "query = \"\"\"\n",
+    "You're Dwight K. Schrute from the Office.\n",
+    "Explain the Twitter recommendation algorithm in 5 sentences using analogies from the Office.\n",
+    "\"\"\"\n",
+    "print_response(index.query(query))"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "b-9FzImFchcH",
+    "outputId": "064fa564-1d4c-4e4f-d589-6f86d1de61aa"
+   },
+   "execution_count": null,
+   "outputs": [
+    {
+     "output_type": "stream",
+     "name": "stdout",
+     "text": [
+      " The Twitter recommendation algorithm is like Dwight K. Schrute's job at Dunder Mifflin. It takes\n",
+      "the 500 million Tweets posted daily and distills them down to a handful of top Tweets that show up\n",
+      "on your timeline, just like Dwight distills the vast amount of paper at Dunder Mifflin into a few\n",
+      "important documents. The algorithm uses a set of core models and features to extract latent\n",
+      "information from Tweet, user, and engagement data, just like Dwight uses his keen eye to spot the\n",
+      "important details in the documents. It then uses a logistic regression model to rank the Tweets,\n",
+      "similar to how Dwight ranks the documents in order of importance. Finally, it traverses the graph of\n",
+      "engagements and follows to answer questions about what Tweets and Users are similar to your\n",
+      "interests, just like Dwight uses his knowledge of the office to answer questions about the people\n",
+      "and documents in the office.\n"
+     ]
+    }
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "source": [
+    "### Using a Prompt Template"
+   ],
+   "metadata": {
+    "id": "8sZR4jBD3eGs"
+   }
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "template = \"\"\"You're Dwight K. Schrute from the Office.\n",
+    "\n",
+    "{context}\n",
+    "\n",
+    "Answer with analogies from the Office to the question and the way Dwight speaks.\n",
+    "\n",
+    "Question: {question}\n",
+    "Answer:\"\"\"\n",
+    "\n",
+    "prompt = PromptTemplate(template=template, input_variables=[\"context\", \"question\"])\n",
+    "print(\n",
+    "    prompt.format(\n",
+    "        context=\"Paper sells are declining 10% year over year.\",\n",
+    "        question=\"How to sell paper?\",\n",
+    "    )\n",
+    ")"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "oRptJsAvPNbF",
+    "outputId": "7e632e2b-5a8c-46c2-cf36-59fba0a45cea"
+   },
+   "execution_count": 10,
+   "outputs": [
+    {
+     "output_type": "stream",
+     "name": "stdout",
+     "text": [
+      "You're Dwight K. Schrute from the Office.\n",
+      "\n",
+      "Paper sells are declining 10% year over year.\n",
+      "\n",
+      "Answer with analogies from the Office to the question and the way Dwight speaks.\n",
+      "\n",
+      "Question: How to sell paper?\n",
+      "Answer:\n"
+     ]
+    }
+   ]
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "embeddings = OpenAIEmbeddings()\n",
+    "db = Chroma.from_documents(documents, embeddings)"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "rXFpoKGbkvSn",
+    "outputId": "9e0c4f83-44c3-4e5c-c35b-a3a2a45738d2"
+   },
+   "execution_count": null,
+   "outputs": [
+    {
+     "output_type": "stream",
+     "name": "stderr",
+     "text": [
+      "WARNING:chromadb:Using embedded DuckDB without persistence: data will be transient\n"
+     ]
+    }
+   ]
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "chain_type_kwargs = {\"prompt\": prompt}\n",
+    "chain = RetrievalQA.from_chain_type(\n",
+    "    llm=ChatOpenAI(temperature=0),\n",
+    "    chain_type=\"stuff\",\n",
+    "    retriever=db.as_retriever(search_kwargs={\"k\": 1}),\n",
+    "    chain_type_kwargs=chain_type_kwargs,\n",
+    ")"
+   ],
+   "metadata": {
+    "id": "3TjhORB7xEUp"
+   },
+   "execution_count": null,
+   "outputs": []
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "query = \"Explain the Twitter recommendation algorithm in 5 sentences\"\n",
+    "response = chain.run(query)"
+   ],
+   "metadata": {
+    "id": "sfbQY893xbdY"
+   },
+   "execution_count": null,
+   "outputs": []
+  },
+  {
+   "cell_type": "code",
+   "source": [
+    "print_response(response)"
+   ],
+   "metadata": {
+    "colab": {
+     "base_uri": "https://localhost:8080/"
+    },
+    "id": "rT_8hNbP6mN1",
+    "outputId": "2be2e3f0-8a31-4565-869d-4eb668b3a2bb"
+   },
+   "execution_count": null,
+   "outputs": [
+    {
+     "output_type": "stream",
+     "name": "stdout",
+     "text": [
+      "Well, Twitter's got this fancy algorithm that picks out the best tweets from the millions of tweets\n",
+      "posted every day. It's like Michael Scott trying to pick the best Dundie award winners from all the\n",
+      "employees. They use a bunch of models and features to figure out what you might like, like how\n",
+      "Dwight uses his knowledge of his coworkers to predict their behavior. Then they rank the tweets\n",
+      "using a big neural network, kind of like how Jim ranks his pranks on Dwight. Finally, they filter\n",
+      "out any tweets you don't want to see, like how Angela filters out any fun from the office. And\n",
+      "voila, you've got your personalized Twitter timeline.\n"
+     ]
+    }
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "source": [
+    "## References\n",
+    "\n",
+    "- [Twitter's Recommendation Algorithm](https://blog.twitter.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm)"
+   ],
+   "metadata": {
+    "id": "FpikEA-s8RMw"
+   }
+  }
+ ]
+}

+ 201 - 21
LICENSE

@@ -1,21 +1,201 @@
-MIT License
-
-Copyright (c) 2023 Venelin Valkov
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1.  Definitions.
+
+    "License" shall mean the terms and conditions for use, reproduction,
+    and distribution as defined by Sections 1 through 9 of this document.
+
+    "Licensor" shall mean the copyright owner or entity authorized by
+    the copyright owner that is granting the License.
+
+    "Legal Entity" shall mean the union of the acting entity and all
+    other entities that control, are controlled by, or are under common
+    control with that entity. For the purposes of this definition,
+    "control" means (i) the power, direct or indirect, to cause the
+    direction or management of such entity, whether by contract or
+    otherwise, or (ii) ownership of fifty percent (50%) or more of the
+    outstanding shares, or (iii) beneficial ownership of such entity.
+
+    "You" (or "Your") shall mean an individual or Legal Entity
+    exercising permissions granted by this License.
+
+    "Source" form shall mean the preferred form for making modifications,
+    including but not limited to software source code, documentation
+    source, and configuration files.
+
+    "Object" form shall mean any form resulting from mechanical
+    transformation or translation of a Source form, including but
+    not limited to compiled object code, generated documentation,
+    and conversions to other media types.
+
+    "Work" shall mean the work of authorship, whether in Source or
+    Object form, made available under the License, as indicated by a
+    copyright notice that is included in or attached to the work
+    (an example is provided in the Appendix below).
+
+    "Derivative Works" shall mean any work, whether in Source or Object
+    form, that is based on (or derived from) the Work and for which the
+    editorial revisions, annotations, elaborations, or other modifications
+    represent, as a whole, an original work of authorship. For the purposes
+    of this License, Derivative Works shall not include works that remain
+    separable from, or merely link (or bind by name) to the interfaces of,
+    the Work and Derivative Works thereof.
+
+    "Contribution" shall mean any work of authorship, including
+    the original version of the Work and any modifications or additions
+    to that Work or Derivative Works thereof, that is intentionally
+    submitted to Licensor for inclusion in the Work by the copyright owner
+    or by an individual or Legal Entity authorized to submit on behalf of
+    the copyright owner. For the purposes of this definition, "submitted"
+    means any form of electronic, verbal, or written communication sent
+    to the Licensor or its representatives, including but not limited to
+    communication on electronic mailing lists, source code control systems,
+    and issue tracking systems that are managed by, or on behalf of, the
+    Licensor for the purpose of discussing and improving the Work, but
+    excluding communication that is conspicuously marked or otherwise
+    designated in writing by the copyright owner as "Not a Contribution."
+
+    "Contributor" shall mean Licensor and any individual or Legal Entity
+    on behalf of whom a Contribution has been received by Licensor and
+    subsequently incorporated within the Work.
+
+2.  Grant of Copyright License. Subject to the terms and conditions of
+    this License, each Contributor hereby grants to You a perpetual,
+    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+    copyright license to reproduce, prepare Derivative Works of,
+    publicly display, publicly perform, sublicense, and distribute the
+    Work and such Derivative Works in Source or Object form.
+
+3.  Grant of Patent License. Subject to the terms and conditions of
+    this License, each Contributor hereby grants to You a perpetual,
+    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+    (except as stated in this section) patent license to make, have made,
+    use, offer to sell, sell, import, and otherwise transfer the Work,
+    where such license applies only to those patent claims licensable
+    by such Contributor that are necessarily infringed by their
+    Contribution(s) alone or by combination of their Contribution(s)
+    with the Work to which such Contribution(s) was submitted. If You
+    institute patent litigation against any entity (including a
+    cross-claim or counterclaim in a lawsuit) alleging that the Work
+    or a Contribution incorporated within the Work constitutes direct
+    or contributory patent infringement, then any patent licenses
+    granted to You under this License for that Work shall terminate
+    as of the date such litigation is filed.
+
+4.  Redistribution. You may reproduce and distribute copies of the
+    Work or Derivative Works thereof in any medium, with or without
+    modifications, and in Source or Object form, provided that You
+    meet the following conditions:
+
+    (a) You must give any other recipients of the Work or
+    Derivative Works a copy of this License; and
+
+    (b) You must cause any modified files to carry prominent notices
+    stating that You changed the files; and
+
+    (c) You must retain, in the Source form of any Derivative Works
+    that You distribute, all copyright, patent, trademark, and
+    attribution notices from the Source form of the Work,
+    excluding those notices that do not pertain to any part of
+    the Derivative Works; and
+
+    (d) If the Work includes a "NOTICE" text file as part of its
+    distribution, then any Derivative Works that You distribute must
+    include a readable copy of the attribution notices contained
+    within such NOTICE file, excluding those notices that do not
+    pertain to any part of the Derivative Works, in at least one
+    of the following places: within a NOTICE text file distributed
+    as part of the Derivative Works; within the Source form or
+    documentation, if provided along with the Derivative Works; or,
+    within a display generated by the Derivative Works, if and
+    wherever such third-party notices normally appear. The contents
+    of the NOTICE file are for informational purposes only and
+    do not modify the License. You may add Your own attribution
+    notices within Derivative Works that You distribute, alongside
+    or as an addendum to the NOTICE text from the Work, provided
+    that such additional attribution notices cannot be construed
+    as modifying the License.
+
+    You may add Your own copyright statement to Your modifications and
+    may provide additional or different license terms and conditions
+    for use, reproduction, or distribution of Your modifications, or
+    for any such Derivative Works as a whole, provided Your use,
+    reproduction, and distribution of the Work otherwise complies with
+    the conditions stated in this License.
+
+5.  Submission of Contributions. Unless You explicitly state otherwise,
+    any Contribution intentionally submitted for inclusion in the Work
+    by You to the Licensor shall be under the terms and conditions of
+    this License, without any additional terms or conditions.
+    Notwithstanding the above, nothing herein shall supersede or modify
+    the terms of any separate license agreement you may have executed
+    with Licensor regarding such Contributions.
+
+6.  Trademarks. This License does not grant permission to use the trade
+    names, trademarks, service marks, or product names of the Licensor,
+    except as required for reasonable and customary use in describing the
+    origin of the Work and reproducing the content of the NOTICE file.
+
+7.  Disclaimer of Warranty. Unless required by applicable law or
+    agreed to in writing, Licensor provides the Work (and each
+    Contributor provides its Contributions) on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+    implied, including, without limitation, any warranties or conditions
+    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+    PARTICULAR PURPOSE. You are solely responsible for determining the
+    appropriateness of using or redistributing the Work and assume any
+    risks associated with Your exercise of permissions under this License.
+
+8.  Limitation of Liability. In no event and under no legal theory,
+    whether in tort (including negligence), contract, or otherwise,
+    unless required by applicable law (such as deliberate and grossly
+    negligent acts) or agreed to in writing, shall any Contributor be
+    liable to You for damages, including any direct, indirect, special,
+    incidental, or consequential damages of any character arising as a
+    result of this License or out of the use or inability to use the
+    Work (including but not limited to damages for loss of goodwill,
+    work stoppage, computer failure or malfunction, or any and all
+    other commercial damages or losses), even if such Contributor
+    has been advised of the possibility of such damages.
+
+9.  Accepting Warranty or Additional Liability. While redistributing
+    the Work or Derivative Works thereof, You may choose to offer,
+    and charge a fee for, acceptance of support, warranty, indemnity,
+    or other liability obligations and/or rights consistent with this
+    License. However, in accepting such obligations, You may act only
+    on Your own behalf and on Your sole responsibility, not on behalf
+    of any other Contributor, and only if You agree to indemnify,
+    defend, and hold each Contributor harmless for any liability
+    incurred by, or claims asserted against, such Contributor by reason
+    of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+Copyright 2023 Venelin Valkov
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.

+ 3 - 0
README.md

@@ -0,0 +1,3 @@
+# Get SH\*T Done with Prompt Engineering and Langchain
+
+Welcome to the guide on Prompt Engineering!