├── .gitignore
├── IMAGES.ipynb
├── LICENSE
├── LLM_+_Vision.ipynb
├── LLM_и_БД.ipynb
├── RAG_по_видеороликам.ipynb
├── RAG_по_статьям.ipynb
├── README.md
├── Telegram.ipynb
├── Агенты_в_Гигачейне.ipynb
├── Голосовой_бот.ipynb
├── Загрузчики.ipynb
├── гигачат_скринкаст.ipynb
└── гигачейн.ipynb
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | share/python-wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 | MANIFEST
28 |
29 | # PyInstaller
30 | # Usually these files are written by a python script from a template
31 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
32 | *.manifest
33 | *.spec
34 |
35 | # Installer logs
36 | pip-log.txt
37 | pip-delete-this-directory.txt
38 |
39 | # Unit test / coverage reports
40 | htmlcov/
41 | .tox/
42 | .nox/
43 | .coverage
44 | .coverage.*
45 | .cache
46 | nosetests.xml
47 | coverage.xml
48 | *.cover
49 | *.py,cover
50 | .hypothesis/
51 | .pytest_cache/
52 | cover/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | .pybuilder/
76 | target/
77 |
78 | # Jupyter Notebook
79 | .ipynb_checkpoints
80 |
81 | # IPython
82 | profile_default/
83 | ipython_config.py
84 |
85 | # pyenv
86 | # For a library or package, you might want to ignore these files since the code is
87 | # intended to run in multiple environments; otherwise, check them in:
88 | # .python-version
89 |
90 | # pipenv
91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
94 | # install all needed dependencies.
95 | #Pipfile.lock
96 |
97 | # poetry
98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99 | # This is especially recommended for binary packages to ensure reproducibility, and is more
100 | # commonly ignored for libraries.
101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102 | #poetry.lock
103 |
104 | # pdm
105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106 | #pdm.lock
107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108 | # in version control.
109 | # https://pdm.fming.dev/#use-with-ide
110 | .pdm.toml
111 |
112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113 | __pypackages__/
114 |
115 | # Celery stuff
116 | celerybeat-schedule
117 | celerybeat.pid
118 |
119 | # SageMath parsed files
120 | *.sage.py
121 |
122 | # Environments
123 | .env
124 | .venv
125 | env/
126 | venv/
127 | ENV/
128 | env.bak/
129 | venv.bak/
130 |
131 | # Spyder project settings
132 | .spyderproject
133 | .spyproject
134 |
135 | # Rope project settings
136 | .ropeproject
137 |
138 | # mkdocs documentation
139 | /site
140 |
141 | # mypy
142 | .mypy_cache/
143 | .dmypy.json
144 | dmypy.json
145 |
146 | # Pyre type checker
147 | .pyre/
148 |
149 | # pytype static type analyzer
150 | .pytype/
151 |
152 | # Cython debug symbols
153 | cython_debug/
154 |
155 | # PyCharm
156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158 | # and can be added to the global gitignore or merged into this file. For a more nuclear
159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160 | #.idea/
161 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # gigachat_tutorials
2 | Jupyter Notebooks and other files from my video tutorial series about GigaChat API
3 |
4 | ## Видео:
5 | [Как начать работать с GigaChat API? Подробный туториал на Python](https://youtu.be/DfT_xXDQyCQ) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/%D0%B3%D0%B8%D0%B3%D0%B0%D1%87%D0%B0%D1%82_%D1%81%D0%BA%D1%80%D0%B8%D0%BD%D0%BA%D0%B0%D1%81%D1%82.ipynb)
6 |
7 | [Как общаться с GigaChat API с помощью Gigachain? (Туториал)](https://youtu.be/eo5LyjRobic) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/%D0%B3%D0%B8%D0%B3%D0%B0%D1%87%D0%B5%D0%B9%D0%BD.ipynb)
8 |
9 | [Как подключить GigaChat API к Telegram-боту? Подробное руководство на Python](https://youtu.be/cSbGMrMbYng) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/Telegram.ipynb)
10 |
11 | [Как сделать агентов на основе GigaChat? Подробный туториал на Python](https://youtu.be/1P7ajSgpDcU) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/%D0%90%D0%B3%D0%B5%D0%BD%D1%82%D1%8B_%D0%B2_%D0%93%D0%B8%D0%B3%D0%B0%D1%87%D0%B5%D0%B9%D0%BD%D0%B5.ipynb)
12 |
13 | [Реализация RAG на основе GigaChat. Как искать и генерировать ответы по базе знаний?](https://youtu.be/kxQ3qfryEHE) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/RAG_%D0%BF%D0%BE_%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8F%D0%BC.ipynb)
14 |
15 | [GigaChain. Как загрузить документы, чтобы ИИ отвечал по ним?](https://youtu.be/PHCm7dADiVk) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA%D0%B8.ipynb)
16 |
17 | [RAG. Делаем вопросно-ответную систему с поиском по базе видеороликов](https://youtu.be/slfC9um1qdk) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/RAG_%D0%BF%D0%BE_%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%80%D0%BE%D0%BB%D0%B8%D0%BA%D0%B0%D0%BC.ipynb)
18 |
19 | [GigaChat API и БД. Как можно общаться с базами данных с помощью ИИ?](https://youtu.be/IazvHwAuV28) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/LLM_%D0%B8_%D0%91%D0%94.ipynb)
20 |
21 | [SaluteSpeech API + GigaChat API: Как научить бота слушать и говорить, используя Python?](https://youtu.be/CBdmeWr_XQ0) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/%D0%93%D0%BE%D0%BB%D0%BE%D1%81%D0%BE%D0%B2%D0%BE%D0%B9_%D0%B1%D0%BE%D1%82.ipynb)
22 |
23 | [Moondream2 + GigaChat API: Помогаем LLM видеть](https://youtu.be/RLG988ASXd0) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/LLM_%2B_Vision.ipynb)
24 |
25 | [GigaChat API: работа с изображениями (распознавание и генерация)](https://youtu.be/7mRdG_ocEQY) - [Блокнот](https://github.com/trashchenkov/gigachat_tutorials/blob/main/IMAGES.ipynb)
26 |
27 | ## А еще переходите в [ТГ-канал!](https://t.me/gigatrash) Там много интересного.
28 |
29 |
--------------------------------------------------------------------------------
/Telegram.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "provenance": [],
7 | "authorship_tag": "ABX9TyN91QdoHwJRjt7tQxgJp+ik",
8 | "include_colab_link": true
9 | },
10 | "kernelspec": {
11 | "name": "python3",
12 | "display_name": "Python 3"
13 | },
14 | "language_info": {
15 | "name": "python"
16 | }
17 | },
18 | "cells": [
19 | {
20 | "cell_type": "markdown",
21 | "metadata": {
22 | "id": "view-in-github",
23 | "colab_type": "text"
24 | },
25 | "source": [
26 | "
"
27 | ]
28 | },
29 | {
30 | "cell_type": "markdown",
31 | "source": [
32 | "# Подключение Гигачата к собственному боту в Telegram\n",
33 | "В рамках этого туториала мы изучим два вопроса:\n",
34 | "- Использование возможностей LangChain для управления памятью в рамках диалога;\n",
35 | "- Взаимодействие бота и языковой модели (передача сообщения пользователя в языковую модель и отправка ответа модели в бота).\n",
36 | "## Получение токена бота\n",
37 | "\n",
38 | "Нам понадобится свой бот. Если вы не создавали ботов в Telegram ранее, то выполните следующие шаги:\n",
39 | "\n",
40 | " - Найдите в Telegram аккаунт [@BotFather](https://t.me/BotFather).\n",
41 | " - Напишите ему команду `/newbot`.\n",
42 | " - Следуйте инструкциям BotFather для выбора имени (может быть любое) и username вашего бота (это уникальный идентификатор и часть url бота, который должен содержать \"bot\" в своем названии).\n",
43 | " - После создания бота BotFather предоставит вам токен для доступа к Telegram Bot API."
44 | ],
45 | "metadata": {
46 | "id": "1Bm8qJuUilsz"
47 | }
48 | },
49 | {
50 | "cell_type": "markdown",
51 | "source": [
52 | "## Устанавливаем требуемые библиотеки\n",
53 | "Существует большое количество библиотек для работы с ботами Telegram. Мы в этом туториале будем использовать [pyTelegramBotAPI](https://github.com/eternnoir/pyTelegramBotAPI). Если вам превычнее работать с другой библиотекой, используйте свой вариант.\n",
54 | "\n",
55 | "Также нам понадобится уже знакомая нам по [прошлому туториалу](https://youtu.be/eo5LyjRobic) библиотека [GigaChain](https://github.com/ai-forever/gigachain)."
56 | ],
57 | "metadata": {
58 | "id": "lJR2_Or3kW9d"
59 | }
60 | },
61 | {
62 | "cell_type": "code",
63 | "source": [
64 | "!pip install -q pyTelegramBotAPI\n",
65 | "!pip install -q gigachain"
66 | ],
67 | "metadata": {
68 | "colab": {
69 | "base_uri": "https://localhost:8080/"
70 | },
71 | "id": "FXQecu8Em8rE",
72 | "outputId": "0658237a-0a36-4f69-b52f-edf97915f909"
73 | },
74 | "execution_count": 1,
75 | "outputs": [
76 | {
77 | "output_type": "stream",
78 | "name": "stdout",
79 | "text": [
80 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m232.2/232.2 kB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
81 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m836.3/836.3 kB\u001b[0m \u001b[31m4.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
82 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.7/1.7 MB\u001b[0m \u001b[31m13.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
83 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m241.7/241.7 kB\u001b[0m \u001b[31m11.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
84 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.5/56.5 kB\u001b[0m \u001b[31m6.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
85 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.4/49.4 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
86 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m55.4/55.4 kB\u001b[0m \u001b[31m5.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
87 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m75.6/75.6 kB\u001b[0m \u001b[31m6.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
88 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m77.8/77.8 kB\u001b[0m \u001b[31m7.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
89 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.3/58.3 kB\u001b[0m \u001b[31m6.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
90 | "\u001b[?25h"
91 | ]
92 | }
93 | ]
94 | },
95 | {
96 | "cell_type": "markdown",
97 | "source": [
98 | "## Импортируем ключи\n",
99 | "Нам понадобится токен от бота и ключ для авторизации в Гигачат. Я дляэтого использую встроенные в Сolab секреты."
100 | ],
101 | "metadata": {
102 | "id": "hY3wHC-5IJ5g"
103 | }
104 | },
105 | {
106 | "cell_type": "code",
107 | "source": [
108 | "from google.colab import userdata\n",
109 | "sber = userdata.get('SBER_AUTH')\n",
110 | "bot_token = userdata.get('BOT_TOKEN')"
111 | ],
112 | "metadata": {
113 | "id": "FEup6MLLIIxM"
114 | },
115 | "execution_count": 2,
116 | "outputs": []
117 | },
118 | {
119 | "cell_type": "markdown",
120 | "source": [
121 | "## Работа с памятью (контекстным окном) в LangChain\n",
122 | "Прежде чем подключать GigaChat к боту, давайте просто через взаимодействие с языковой моделью изучим возможности LangChain в плане \"памяти\" (хранения сообщений и/или общего контекста диалога)\n",
123 | "\n",
124 | "Подробно про память в LangChain можно почитать в [документации](https://python.langchain.com/docs/modules/memory/).\n",
125 | "\n",
126 | "Языковые модели не обладают памятью. Они просто генерируют новый текст на основании текста, который был передан им в качестве промпта. Текст промпта может содержать весь диалог, начиная с системного сообщения или первого сообщения пользователя. Однако тогда каждое последующее сообщение от пользователя будет предворятся все более длинным текстом истории диалога. Это чревато большим расходом токенов и грозит в какой-то момент превысить размер контекстного окна.\n",
127 | "\n",
128 | "Чтобы не превысить размеры окна и сэкономить на расходе токенов LangChain предлагает различные типы памяти. Перечислим основные из них:\n",
129 | "- [`ConversationBufferMemory`](https://python.langchain.com/docs/modules/memory/types/buffer) - самый простой вариант. Позволяет хранить, записывать и передавать в переменные сообщения из диалога.\n",
130 | "- [`ConversationBufferWindowMemory`](https://python.langchain.com/docs/modules/memory/types/buffer_window) - почти тоже самое, что и `ConversationBufferMemory`, но держит в памяти только k последних пар сообщений (под парой понимается пользовательский запрос и ответ языковой модели). Получается такое своего рода скользящее окно.\n",
131 | "- [`ConversationEntityMemory`](https://python.langchain.com/docs/modules/memory/types/entity_summary_memory) - помимо истории сообщений создает еще хранилище отдельных сущностей (entities), которые попадаются в ходе диалога. Поучается, что помимо неструктурированного текста языковая модель работает и со структурированными извлеченными сущностями.\n",
132 | "- [`ConversationKGMemory`](https://python.langchain.com/docs/modules/memory/types/kg) - память в виде графа знаний.\n",
133 | "- [`ConversationSummaryMemory`](https://python.langchain.com/docs/modules/memory/types/summary) - память в виде краткого содержания разговора. Сами сообщения не хранятся, просто языковая модель регулярно пополняет память новыми деталями из свежих сообщений диалога.\n",
134 | "- [`ConversationSummaryBufferMemory`](https://python.langchain.com/docs/modules/memory/types/summary_buffer) - хранит и некоторое количество сообщений диалога, и краткое описание всей беседы в целом.\n",
135 | "- [`ConversationTokenBufferMemory`]() - подобно `ConversationBufferWindowMemory` хранит ограниченное количество сообщений, но здесь вместо лимита по количеству сообщений лимит по количеству токенов.\n",
136 | "- [`VectorStoreRetrieverMemory`](https://python.langchain.com/docs/modules/memory/types/vectorstore_retriever_memory) - отправляет сообщения в векторное хранилище. Там сообщения хранятся произвольно, отпраляясь в контекст диалога только если они семантически релевантны сообщению пользователя. "
137 | ],
138 | "metadata": {
139 | "id": "0_JAdfuzn-g2"
140 | }
141 | },
142 | {
143 | "cell_type": "markdown",
144 | "source": [
145 | "### Сравнение обычной памяти и памяти с извлеченными сущностями\n",
146 | "\n",
147 | "Для экономии времени в этом туториале мы рассмотрим лишь `ConversationBufferMemory` и `ConversationEntityMemory`.\n",
148 | "\n",
149 | "Для удобства работы с диалогами мы используем [`ConversationChain`](https://api.python.langchain.com/en/latest/chains/langchain.chains.conversation.base.ConversationChain.html). Это удобный инструмент, чтобы соединить память и языковую модель.\n",
150 | "\n",
151 | "#### ConversationBufferMemory"
152 | ],
153 | "metadata": {
154 | "id": "SEE_WUBbRFan"
155 | }
156 | },
157 | {
158 | "cell_type": "code",
159 | "source": [
160 | "from langchain.chat_models.gigachat import GigaChat\n",
161 | "from langchain.chains import ConversationChain\n",
162 | "from langchain.memory import ConversationBufferMemory\n",
163 | "\n",
164 | "llm = GigaChat(credentials=sber, verify_ssl_certs=False)\n",
165 | "conversation1 = ConversationChain(\n",
166 | " llm=llm,\n",
167 | " verbose=True,\n",
168 | " memory=ConversationBufferMemory()\n",
169 | ")"
170 | ],
171 | "metadata": {
172 | "id": "ymBJt_QYSfjq"
173 | },
174 | "execution_count": 3,
175 | "outputs": []
176 | },
177 | {
178 | "cell_type": "markdown",
179 | "source": [
180 | "Напишем несколько сообщений языковой модели и посмотрим, что именно хранится в памяти."
181 | ],
182 | "metadata": {
183 | "id": "84IDh7O4UIT1"
184 | }
185 | },
186 | {
187 | "cell_type": "code",
188 | "source": [
189 | "conversation1.predict(input='Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.')"
190 | ],
191 | "metadata": {
192 | "colab": {
193 | "base_uri": "https://localhost:8080/",
194 | "height": 281
195 | },
196 | "id": "3IU3FGFvUXLH",
197 | "outputId": "682de352-50c3-4ff4-8c3c-cb98c22f1bca"
198 | },
199 | "execution_count": 4,
200 | "outputs": [
201 | {
202 | "output_type": "stream",
203 | "name": "stdout",
204 | "text": [
205 | "\n",
206 | "\n",
207 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
208 | "Prompt after formatting:\n",
209 | "\u001b[32;1m\u001b[1;3mНиже приводится дружеский разговор между человеком и AI. AI разговорчив и предоставляет множество конкретных деталей из своего контекста. Если AI не знает ответа на вопрос, он честно говорит, что не знает.\n",
210 | "\n",
211 | "Текущий разговор:\n",
212 | "\n",
213 | "Human: Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.\n",
214 | "AI:\u001b[0m\n",
215 | "\n",
216 | "\u001b[1m> Finished chain.\u001b[0m\n"
217 | ]
218 | },
219 | {
220 | "output_type": "execute_result",
221 | "data": {
222 | "text/plain": [
223 | "'Привет, Сергей! Очень приятно познакомиться. Я - GigaChat, виртуальный помощник, разработанный Сбером в России. Я могу помочь вам с различными вопросами и задачами, связанными с Python и машинным обучением. Если у вас есть какие-либо вопросы или нужна помощь, я готов помочь вам.'"
224 | ],
225 | "application/vnd.google.colaboratory.intrinsic+json": {
226 | "type": "string"
227 | }
228 | },
229 | "metadata": {},
230 | "execution_count": 4
231 | }
232 | ]
233 | },
234 | {
235 | "cell_type": "code",
236 | "source": [
237 | "conversation1.predict(input='Какая большая языковая модель самая лучшая?')"
238 | ],
239 | "metadata": {
240 | "colab": {
241 | "base_uri": "https://localhost:8080/",
242 | "height": 315
243 | },
244 | "id": "0QqW8EEZVCy-",
245 | "outputId": "0e584aa7-93b1-48af-caf2-17c3a9f6821c"
246 | },
247 | "execution_count": 5,
248 | "outputs": [
249 | {
250 | "output_type": "stream",
251 | "name": "stdout",
252 | "text": [
253 | "\n",
254 | "\n",
255 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
256 | "Prompt after formatting:\n",
257 | "\u001b[32;1m\u001b[1;3mНиже приводится дружеский разговор между человеком и AI. AI разговорчив и предоставляет множество конкретных деталей из своего контекста. Если AI не знает ответа на вопрос, он честно говорит, что не знает.\n",
258 | "\n",
259 | "Текущий разговор:\n",
260 | "Human: Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.\n",
261 | "AI: Привет, Сергей! Очень приятно познакомиться. Я - GigaChat, виртуальный помощник, разработанный Сбером в России. Я могу помочь вам с различными вопросами и задачами, связанными с Python и машинным обучением. Если у вас есть какие-либо вопросы или нужна помощь, я готов помочь вам.\n",
262 | "Human: Какая большая языковая модель самая лучшая?\n",
263 | "AI:\u001b[0m\n",
264 | "\n",
265 | "\u001b[1m> Finished chain.\u001b[0m\n"
266 | ]
267 | },
268 | {
269 | "output_type": "execute_result",
270 | "data": {
271 | "text/plain": [
272 | "'Это сложный вопрос, так как \"лучшая\" языковая модель зависит от многих факторов, таких как точность, скорость, размер и область применения. Некоторые из самых известных и мощных языковых моделей включают GPT-3 от OpenAI, BERT от Google, T5 от Microsoft и Transformer-XL от Facebook. Однако, выбор лучшей модели может зависеть от ваших конкретных потребностей и целей. Если у вас есть более конкретные вопросы или задачи, я буду рад помочь вам.'"
273 | ],
274 | "application/vnd.google.colaboratory.intrinsic+json": {
275 | "type": "string"
276 | }
277 | },
278 | "metadata": {},
279 | "execution_count": 5
280 | }
281 | ]
282 | },
283 | {
284 | "cell_type": "code",
285 | "source": [
286 | "conversation1.predict(input='Я бы хотел пользоваться языковой моделью бесплатно и писать на русском.')"
287 | ],
288 | "metadata": {
289 | "colab": {
290 | "base_uri": "https://localhost:8080/",
291 | "height": 333
292 | },
293 | "id": "H_b8WSbfVXU7",
294 | "outputId": "7e8f93b4-c517-4d90-804f-93431f847a62"
295 | },
296 | "execution_count": 6,
297 | "outputs": [
298 | {
299 | "output_type": "stream",
300 | "name": "stdout",
301 | "text": [
302 | "\n",
303 | "\n",
304 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
305 | "Prompt after formatting:\n",
306 | "\u001b[32;1m\u001b[1;3mНиже приводится дружеский разговор между человеком и AI. AI разговорчив и предоставляет множество конкретных деталей из своего контекста. Если AI не знает ответа на вопрос, он честно говорит, что не знает.\n",
307 | "\n",
308 | "Текущий разговор:\n",
309 | "Human: Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.\n",
310 | "AI: Привет, Сергей! Очень приятно познакомиться. Я - GigaChat, виртуальный помощник, разработанный Сбером в России. Я могу помочь вам с различными вопросами и задачами, связанными с Python и машинным обучением. Если у вас есть какие-либо вопросы или нужна помощь, я готов помочь вам.\n",
311 | "Human: Какая большая языковая модель самая лучшая?\n",
312 | "AI: Это сложный вопрос, так как \"лучшая\" языковая модель зависит от многих факторов, таких как точность, скорость, размер и область применения. Некоторые из самых известных и мощных языковых моделей включают GPT-3 от OpenAI, BERT от Google, T5 от Microsoft и Transformer-XL от Facebook. Однако, выбор лучшей модели может зависеть от ваших конкретных потребностей и целей. Если у вас есть более конкретные вопросы или задачи, я буду рад помочь вам.\n",
313 | "Human: Я бы хотел пользоваться языковой моделью бесплатно и писать на русском.\n",
314 | "AI:\u001b[0m\n",
315 | "\n",
316 | "\u001b[1m> Finished chain.\u001b[0m\n"
317 | ]
318 | },
319 | {
320 | "output_type": "execute_result",
321 | "data": {
322 | "text/plain": [
323 | "'В настоящее время GigaChat не предоставляет бесплатную версию для использования на русском языке. Однако, вы можете использовать другие языковые модели, такие как GPT-3 или BERT, которые поддерживают русский язык и могут быть доступны бесплатно.'"
324 | ],
325 | "application/vnd.google.colaboratory.intrinsic+json": {
326 | "type": "string"
327 | }
328 | },
329 | "metadata": {},
330 | "execution_count": 6
331 | }
332 | ]
333 | },
334 | {
335 | "cell_type": "code",
336 | "source": [
337 | "conversation1.predict(input='Как меня зовут и чем я занимаюсь?')"
338 | ],
339 | "metadata": {
340 | "colab": {
341 | "base_uri": "https://localhost:8080/",
342 | "height": 350
343 | },
344 | "id": "Gke-b9F4V4Xy",
345 | "outputId": "5528d647-02ec-4d1e-f208-d6e151fc571a"
346 | },
347 | "execution_count": 7,
348 | "outputs": [
349 | {
350 | "output_type": "stream",
351 | "name": "stdout",
352 | "text": [
353 | "\n",
354 | "\n",
355 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
356 | "Prompt after formatting:\n",
357 | "\u001b[32;1m\u001b[1;3mНиже приводится дружеский разговор между человеком и AI. AI разговорчив и предоставляет множество конкретных деталей из своего контекста. Если AI не знает ответа на вопрос, он честно говорит, что не знает.\n",
358 | "\n",
359 | "Текущий разговор:\n",
360 | "Human: Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.\n",
361 | "AI: Привет, Сергей! Очень приятно познакомиться. Я - GigaChat, виртуальный помощник, разработанный Сбером в России. Я могу помочь вам с различными вопросами и задачами, связанными с Python и машинным обучением. Если у вас есть какие-либо вопросы или нужна помощь, я готов помочь вам.\n",
362 | "Human: Какая большая языковая модель самая лучшая?\n",
363 | "AI: Это сложный вопрос, так как \"лучшая\" языковая модель зависит от многих факторов, таких как точность, скорость, размер и область применения. Некоторые из самых известных и мощных языковых моделей включают GPT-3 от OpenAI, BERT от Google, T5 от Microsoft и Transformer-XL от Facebook. Однако, выбор лучшей модели может зависеть от ваших конкретных потребностей и целей. Если у вас есть более конкретные вопросы или задачи, я буду рад помочь вам.\n",
364 | "Human: Я бы хотел пользоваться языковой моделью бесплатно и писать на русском.\n",
365 | "AI: В настоящее время GigaChat не предоставляет бесплатную версию для использования на русском языке. Однако, вы можете использовать другие языковые модели, такие как GPT-3 или BERT, которые поддерживают русский язык и могут быть доступны бесплатно.\n",
366 | "Human: Как меня зовут и чем я занимаюсь?\n",
367 | "AI:\u001b[0m\n",
368 | "\n",
369 | "\u001b[1m> Finished chain.\u001b[0m\n"
370 | ]
371 | },
372 | {
373 | "output_type": "execute_result",
374 | "data": {
375 | "text/plain": [
376 | "'Ваше имя - Сергей, и вы занимаетесь записью видео про GigaChat и Python.'"
377 | ],
378 | "application/vnd.google.colaboratory.intrinsic+json": {
379 | "type": "string"
380 | }
381 | },
382 | "metadata": {},
383 | "execution_count": 7
384 | }
385 | ]
386 | },
387 | {
388 | "cell_type": "markdown",
389 | "source": [
390 | "#### ConversationEntityMemory\n",
391 | "Теперь реализуем точно такой же диалог, но с другим видом памяти."
392 | ],
393 | "metadata": {
394 | "id": "jO-oC1x-WHhF"
395 | }
396 | },
397 | {
398 | "cell_type": "code",
399 | "source": [
400 | "from langchain.chat_models.gigachat import GigaChat\n",
401 | "from langchain.chains import ConversationChain\n",
402 | "from langchain.memory.prompt import ENTITY_MEMORY_CONVERSATION_TEMPLATE\n",
403 | "from langchain.memory import ConversationEntityMemory\n",
404 | "\n",
405 | "llm = GigaChat(credentials=sber, verify_ssl_certs=False)\n",
406 | "conversation2 = ConversationChain(\n",
407 | " llm=llm,\n",
408 | " verbose=True,\n",
409 | " prompt=ENTITY_MEMORY_CONVERSATION_TEMPLATE,\n",
410 | " memory=ConversationEntityMemory(llm=llm)\n",
411 | ")"
412 | ],
413 | "metadata": {
414 | "id": "cZIImrnFH5qx"
415 | },
416 | "execution_count": 8,
417 | "outputs": []
418 | },
419 | {
420 | "cell_type": "code",
421 | "source": [
422 | "conversation2.predict(input='Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.')"
423 | ],
424 | "metadata": {
425 | "colab": {
426 | "base_uri": "https://localhost:8080/",
427 | "height": 454
428 | },
429 | "id": "PpCCgRpIJUld",
430 | "outputId": "963df621-9dc2-4151-a4a6-35f385bd7cd0"
431 | },
432 | "execution_count": 9,
433 | "outputs": [
434 | {
435 | "output_type": "stream",
436 | "name": "stdout",
437 | "text": [
438 | "\n",
439 | "\n",
440 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
441 | "Prompt after formatting:\n",
442 | "\u001b[32;1m\u001b[1;3mТы помощник человека, работающий на большой языковой модели, обученной OpenAI.\n",
443 | "\n",
444 | "Ты спроектирован, чтобы помогать в широком диапазоне задач, от ответов на простые вопросы до предоставления подробных объяснений и обсуждений на самые разные темы. Как языковая модель, ты способен генерировать текст, похожий на человеческий, на основе полученного ввода, что позволяет тебе вести естественные разговоры и предоставлять ответы, которые согласуются и релевантны обсуждаемой теме.\n",
445 | "\n",
446 | "Ты постоянно учишься и совершенствуешься, и твои способности постоянно эволюционируют. Ты способен обрабатывать и понимать большие объемы текста и использовать эти знания для предоставления точных и информативных ответов на широкий спектр вопросов. У тебя есть доступ к некоторой персонализированной информации, предоставленной человеком, в разделе \"Контекст\" ниже. Кроме того, ты способен генерировать свой собственный текст на основе полученного ввода, что позволяет тебе участвовать в обсуждениях и предоставлять объяснения и описания на широкий спектр тем.\n",
447 | "\n",
448 | "В целом, ты мощный инструмент, который может помочь в широком диапазоне задач и предоставить ценные сведения и информацию по широкому спектру тем. Будь то помощь человеку с конкретным вопросом или просто желание пообщаться на определенную тему, ты здесь, чтобы помочь.\n",
449 | "\n",
450 | "Контекст:\n",
451 | "{'GigaChat': '', 'Python': ''}\n",
452 | "\n",
453 | "Текущий разговор:\n",
454 | "\n",
455 | "Последняя строка:\n",
456 | "Человек: Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.\n",
457 | "Ты:\u001b[0m\n",
458 | "\n",
459 | "\u001b[1m> Finished chain.\u001b[0m\n"
460 | ]
461 | },
462 | {
463 | "output_type": "execute_result",
464 | "data": {
465 | "text/plain": [
466 | "'Привет, Сергей! Рад познакомиться. Расскажи, пожалуйста, что именно ты хочешь узнать о GigaChat и Python? Я буду рад помочь тебе с любыми вопросами или обсуждениями, которые у тебя есть.'"
467 | ],
468 | "application/vnd.google.colaboratory.intrinsic+json": {
469 | "type": "string"
470 | }
471 | },
472 | "metadata": {},
473 | "execution_count": 9
474 | }
475 | ]
476 | },
477 | {
478 | "cell_type": "code",
479 | "source": [
480 | "conversation2.predict(input='Какая большая языковая модель самая лучшая?')"
481 | ],
482 | "metadata": {
483 | "colab": {
484 | "base_uri": "https://localhost:8080/",
485 | "height": 541
486 | },
487 | "outputId": "96827b01-cebe-4689-deef-c2a3523e6fb7",
488 | "id": "BC2V0K9kWsvG"
489 | },
490 | "execution_count": 10,
491 | "outputs": [
492 | {
493 | "output_type": "stream",
494 | "name": "stdout",
495 | "text": [
496 | "\n",
497 | "\n",
498 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
499 | "Prompt after formatting:\n",
500 | "\u001b[32;1m\u001b[1;3mТы помощник человека, работающий на большой языковой модели, обученной OpenAI.\n",
501 | "\n",
502 | "Ты спроектирован, чтобы помогать в широком диапазоне задач, от ответов на простые вопросы до предоставления подробных объяснений и обсуждений на самые разные темы. Как языковая модель, ты способен генерировать текст, похожий на человеческий, на основе полученного ввода, что позволяет тебе вести естественные разговоры и предоставлять ответы, которые согласуются и релевантны обсуждаемой теме.\n",
503 | "\n",
504 | "Ты постоянно учишься и совершенствуешься, и твои способности постоянно эволюционируют. Ты способен обрабатывать и понимать большие объемы текста и использовать эти знания для предоставления точных и информативных ответов на широкий спектр вопросов. У тебя есть доступ к некоторой персонализированной информации, предоставленной человеком, в разделе \"Контекст\" ниже. Кроме того, ты способен генерировать свой собственный текст на основе полученного ввода, что позволяет тебе участвовать в обсуждениях и предоставлять объяснения и описания на широкий спектр тем.\n",
505 | "\n",
506 | "В целом, ты мощный инструмент, который может помочь в широком диапазоне задач и предоставить ценные сведения и информацию по широкому спектру тем. Будь то помощь человеку с конкретным вопросом или просто желание пообщаться на определенную тему, ты здесь, чтобы помочь.\n",
507 | "\n",
508 | "Контекст:\n",
509 | "{'GigaChat': 'Сергей записывает видео про GigaChat и Python.'}\n",
510 | "\n",
511 | "Текущий разговор:\n",
512 | "Human: Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.\n",
513 | "AI: Привет, Сергей! Рад познакомиться. Расскажи, пожалуйста, что именно ты хочешь узнать о GigaChat и Python? Я буду рад помочь тебе с любыми вопросами или обсуждениями, которые у тебя есть.\n",
514 | "Последняя строка:\n",
515 | "Человек: Какая большая языковая модель самая лучшая?\n",
516 | "Ты:\u001b[0m\n",
517 | "\n",
518 | "\u001b[1m> Finished chain.\u001b[0m\n"
519 | ]
520 | },
521 | {
522 | "output_type": "execute_result",
523 | "data": {
524 | "text/plain": [
525 | "'Вопрос о том, какая большая языковая модель является лучшей, является сложным и субъективным, так как эффективность модели зависит от множества факторов, включая ее способность обрабатывать различные типы данных, точность и скорость обработки, а также ее применимость к конкретной задаче.\\n\\nСуществует множество больших языковых моделей, таких как GPT-3, T5, BERT, Transformer и другие, и каждая из них имеет свои преимущества и недостатки. Некоторые из них лучше подходят для обработки естественного языка, другие - для обработки числовых данных, третьи - для генерации текста.\\n\\nОднако, если говорить о наиболее известной и широко используемой большой языковой модели, то это, вероятно, GPT-3 от OpenAI. Она была разработана с использованием передовых технологий и демонстрирует впечатляющие результаты в различных областях, включая генерацию текста, обработку естественного языка и машинное обучение.\\n\\nТем не менее, выбор лучшей большой языковой модели зависит от конкретных потребностей и требований каждого пользователя или проекта. Если у вас есть конкретные задачи или цели, я могу помочь вам выбрать модель, которая лучше всего подойдет для их решения.'"
526 | ],
527 | "application/vnd.google.colaboratory.intrinsic+json": {
528 | "type": "string"
529 | }
530 | },
531 | "metadata": {},
532 | "execution_count": 10
533 | }
534 | ]
535 | },
536 | {
537 | "cell_type": "code",
538 | "source": [
539 | "conversation2.predict(input='Я бы хотел пользоваться языковой моделью бесплатно и писать на русском.')"
540 | ],
541 | "metadata": {
542 | "colab": {
543 | "base_uri": "https://localhost:8080/",
544 | "height": 628
545 | },
546 | "outputId": "dc264563-54a2-46cb-bc75-542cb0632008",
547 | "id": "cqHlp3fqWsvV"
548 | },
549 | "execution_count": 11,
550 | "outputs": [
551 | {
552 | "output_type": "stream",
553 | "name": "stdout",
554 | "text": [
555 | "\n",
556 | "\n",
557 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
558 | "Prompt after formatting:\n",
559 | "\u001b[32;1m\u001b[1;3mТы помощник человека, работающий на большой языковой модели, обученной OpenAI.\n",
560 | "\n",
561 | "Ты спроектирован, чтобы помогать в широком диапазоне задач, от ответов на простые вопросы до предоставления подробных объяснений и обсуждений на самые разные темы. Как языковая модель, ты способен генерировать текст, похожий на человеческий, на основе полученного ввода, что позволяет тебе вести естественные разговоры и предоставлять ответы, которые согласуются и релевантны обсуждаемой теме.\n",
562 | "\n",
563 | "Ты постоянно учишься и совершенствуешься, и твои способности постоянно эволюционируют. Ты способен обрабатывать и понимать большие объемы текста и использовать эти знания для предоставления точных и информативных ответов на широкий спектр вопросов. У тебя есть доступ к некоторой персонализированной информации, предоставленной человеком, в разделе \"Контекст\" ниже. Кроме того, ты способен генерировать свой собственный текст на основе полученного ввода, что позволяет тебе участвовать в обсуждениях и предоставлять объяснения и описания на широкий спектр тем.\n",
564 | "\n",
565 | "В целом, ты мощный инструмент, который может помочь в широком диапазоне задач и предоставить ценные сведения и информацию по широкому спектру тем. Будь то помощь человеку с конкретным вопросом или просто желание пообщаться на определенную тему, ты здесь, чтобы помочь.\n",
566 | "\n",
567 | "Контекст:\n",
568 | "{'GPT-3': '', 'OpenAI': ''}\n",
569 | "\n",
570 | "Текущий разговор:\n",
571 | "Human: Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.\n",
572 | "AI: Привет, Сергей! Рад познакомиться. Расскажи, пожалуйста, что именно ты хочешь узнать о GigaChat и Python? Я буду рад помочь тебе с любыми вопросами или обсуждениями, которые у тебя есть.\n",
573 | "Human: Какая большая языковая модель самая лучшая?\n",
574 | "AI: Вопрос о том, какая большая языковая модель является лучшей, является сложным и субъективным, так как эффективность модели зависит от множества факторов, включая ее способность обрабатывать различные типы данных, точность и скорость обработки, а также ее применимость к конкретной задаче.\n",
575 | "\n",
576 | "Существует множество больших языковых моделей, таких как GPT-3, T5, BERT, Transformer и другие, и каждая из них имеет свои преимущества и недостатки. Некоторые из них лучше подходят для обработки естественного языка, другие - для обработки числовых данных, третьи - для генерации текста.\n",
577 | "\n",
578 | "Однако, если говорить о наиболее известной и широко используемой большой языковой модели, то это, вероятно, GPT-3 от OpenAI. Она была разработана с использованием передовых технологий и демонстрирует впечатляющие результаты в различных областях, включая генерацию текста, обработку естественного языка и машинное обучение.\n",
579 | "\n",
580 | "Тем не менее, выбор лучшей большой языковой модели зависит от конкретных потребностей и требований каждого пользователя или проекта. Если у вас есть конкретные задачи или цели, я могу помочь вам выбрать модель, которая лучше всего подойдет для их решения.\n",
581 | "Последняя строка:\n",
582 | "Человек: Я бы хотел пользоваться языковой моделью бесплатно и писать на русском.\n",
583 | "Ты:\u001b[0m\n",
584 | "\n",
585 | "\u001b[1m> Finished chain.\u001b[0m\n"
586 | ]
587 | },
588 | {
589 | "output_type": "execute_result",
590 | "data": {
591 | "text/plain": [
592 | "'К сожалению, я не могу предоставить вам бесплатную языковую модель, так как я являюсь частью большой языковой модели, обученной OpenAI. Однако, если у вас есть доступ к интернету, вы можете использовать GPT-3 через веб-интерфейс OpenAI, который предоставляет ограниченное количество бесплатных запросов в день. Также стоит отметить, что GPT-3 поддерживает русский язык и может генерировать тексты на этом языке.'"
593 | ],
594 | "application/vnd.google.colaboratory.intrinsic+json": {
595 | "type": "string"
596 | }
597 | },
598 | "metadata": {},
599 | "execution_count": 11
600 | }
601 | ]
602 | },
603 | {
604 | "cell_type": "code",
605 | "source": [
606 | "conversation2.predict(input='Как меня зовут и чем я занимаюсь?')"
607 | ],
608 | "metadata": {
609 | "colab": {
610 | "base_uri": "https://localhost:8080/",
611 | "height": 628
612 | },
613 | "outputId": "43dad232-1d12-4b2b-8ee7-ed0c67db7ea7",
614 | "id": "mWHJ34TyWsvW"
615 | },
616 | "execution_count": 12,
617 | "outputs": [
618 | {
619 | "output_type": "stream",
620 | "name": "stdout",
621 | "text": [
622 | "\n",
623 | "\n",
624 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
625 | "Prompt after formatting:\n",
626 | "\u001b[32;1m\u001b[1;3mТы помощник человека, работающий на большой языковой модели, обученной OpenAI.\n",
627 | "\n",
628 | "Ты спроектирован, чтобы помогать в широком диапазоне задач, от ответов на простые вопросы до предоставления подробных объяснений и обсуждений на самые разные темы. Как языковая модель, ты способен генерировать текст, похожий на человеческий, на основе полученного ввода, что позволяет тебе вести естественные разговоры и предоставлять ответы, которые согласуются и релевантны обсуждаемой теме.\n",
629 | "\n",
630 | "Ты постоянно учишься и совершенствуешься, и твои способности постоянно эволюционируют. Ты способен обрабатывать и понимать большие объемы текста и использовать эти знания для предоставления точных и информативных ответов на широкий спектр вопросов. У тебя есть доступ к некоторой персонализированной информации, предоставленной человеком, в разделе \"Контекст\" ниже. Кроме того, ты способен генерировать свой собственный текст на основе полученного ввода, что позволяет тебе участвовать в обсуждениях и предоставлять объяснения и описания на широкий спектр тем.\n",
631 | "\n",
632 | "В целом, ты мощный инструмент, который может помочь в широком диапазоне задач и предоставить ценные сведения и информацию по широкому спектру тем. Будь то помощь человеку с конкретным вопросом или просто желание пообщаться на определенную тему, ты здесь, чтобы помочь.\n",
633 | "\n",
634 | "Контекст:\n",
635 | "{'Человек': ''}\n",
636 | "\n",
637 | "Текущий разговор:\n",
638 | "Human: Привет! Меня зовут Сергей. Я сейчас записываю видео про GigaChat и Python.\n",
639 | "AI: Привет, Сергей! Рад познакомиться. Расскажи, пожалуйста, что именно ты хочешь узнать о GigaChat и Python? Я буду рад помочь тебе с любыми вопросами или обсуждениями, которые у тебя есть.\n",
640 | "Human: Какая большая языковая модель самая лучшая?\n",
641 | "AI: Вопрос о том, какая большая языковая модель является лучшей, является сложным и субъективным, так как эффективность модели зависит от множества факторов, включая ее способность обрабатывать различные типы данных, точность и скорость обработки, а также ее применимость к конкретной задаче.\n",
642 | "\n",
643 | "Существует множество больших языковых моделей, таких как GPT-3, T5, BERT, Transformer и другие, и каждая из них имеет свои преимущества и недостатки. Некоторые из них лучше подходят для обработки естественного языка, другие - для обработки числовых данных, третьи - для генерации текста.\n",
644 | "\n",
645 | "Однако, если говорить о наиболее известной и широко используемой большой языковой модели, то это, вероятно, GPT-3 от OpenAI. Она была разработана с использованием передовых технологий и демонстрирует впечатляющие результаты в различных областях, включая генерацию текста, обработку естественного языка и машинное обучение.\n",
646 | "\n",
647 | "Тем не менее, выбор лучшей большой языковой модели зависит от конкретных потребностей и требований каждого пользователя или проекта. Если у вас есть конкретные задачи или цели, я могу помочь вам выбрать модель, которая лучше всего подойдет для их решения.\n",
648 | "Human: Я бы хотел пользоваться языковой моделью бесплатно и писать на русском.\n",
649 | "AI: К сожалению, я не могу предоставить вам бесплатную языковую модель, так как я являюсь частью большой языковой модели, обученной OpenAI. Однако, если у вас есть доступ к интернету, вы можете использовать GPT-3 через веб-интерфейс OpenAI, который предоставляет ограниченное количество бесплатных запросов в день. Также стоит отметить, что GPT-3 поддерживает русский язык и может генерировать тексты на этом языке.\n",
650 | "Последняя строка:\n",
651 | "Человек: Как меня зовут и чем я занимаюсь?\n",
652 | "Ты:\u001b[0m\n",
653 | "\n",
654 | "\u001b[1m> Finished chain.\u001b[0m\n"
655 | ]
656 | },
657 | {
658 | "output_type": "execute_result",
659 | "data": {
660 | "text/plain": [
661 | "'Тебя зовут Сергей, и ты сейчас записываешь видео про GigaChat и Python.'"
662 | ],
663 | "application/vnd.google.colaboratory.intrinsic+json": {
664 | "type": "string"
665 | }
666 | },
667 | "metadata": {},
668 | "execution_count": 12
669 | }
670 | ]
671 | },
672 | {
673 | "cell_type": "code",
674 | "source": [
675 | "conversation2.memory.entity_store.store"
676 | ],
677 | "metadata": {
678 | "colab": {
679 | "base_uri": "https://localhost:8080/"
680 | },
681 | "id": "66rUK4Q1KyN0",
682 | "outputId": "96d7763c-fc57-4f26-b2e6-64ec67f9c744"
683 | },
684 | "execution_count": 13,
685 | "outputs": [
686 | {
687 | "output_type": "execute_result",
688 | "data": {
689 | "text/plain": [
690 | "{'GigaChat': 'Сергей интересуется, какая большая языковая модель является лучшей.',\n",
691 | " 'Python': 'Сергей записывает видео про GigaChat и Python.',\n",
692 | " 'GPT-3': 'GPT-3 поддерживает русский язык и может генерировать тексты на этом языке.',\n",
693 | " 'OpenAI': 'GPT-3 от OpenAI является наиболее известной и широко используемой большой языковой моделью, поддерживающей русский язык и способной генерировать тексты на этом языке.',\n",
694 | " 'Человек': 'Человека зовут Сергей, и он занимается записью видео про GigaChat и Python.'}"
695 | ]
696 | },
697 | "metadata": {},
698 | "execution_count": 13
699 | }
700 | ]
701 | },
702 | {
703 | "cell_type": "markdown",
704 | "source": [
705 | "## Создание бота\n",
706 | "\n",
707 | "Поскольку бот предполагает использование сразу многими пользователями, поэтому под каждого пользователя нужен свой экземпляр памяти. Используем для хранения экземпляров памяти словарь, где ключами будут служить id пользователей Telegram (не путать с номерами телефонов, это разное)."
708 | ],
709 | "metadata": {
710 | "id": "0EY_v2ELY_-y"
711 | }
712 | },
713 | {
714 | "cell_type": "code",
715 | "source": [
716 | "# Словарь для хранения ConversationBufferMemory каждого пользователя\n",
717 | "user_conversations = {}"
718 | ],
719 | "metadata": {
720 | "id": "a_cNEF5dK8R8"
721 | },
722 | "execution_count": 21,
723 | "outputs": []
724 | },
725 | {
726 | "cell_type": "markdown",
727 | "source": [
728 | "Далее нам нужно осуществить необходимый импорт и создать объект самого бота. В ячейках выше мы уже импортировали большую часть того, что нам понадобится, поэтому в ячейке ниже импортируем только то, чего еще не хватает."
729 | ],
730 | "metadata": {
731 | "id": "DTHRfzYdaKBD"
732 | }
733 | },
734 | {
735 | "cell_type": "code",
736 | "source": [
737 | "import telebot\n",
738 | "from time import sleep\n",
739 | "\n",
740 | "bot = telebot.TeleBot(bot_token)"
741 | ],
742 | "metadata": {
743 | "id": "Mg32U_JEaeUw"
744 | },
745 | "execution_count": 22,
746 | "outputs": []
747 | },
748 | {
749 | "cell_type": "markdown",
750 | "source": [
751 | "Подготовим заготовку `ConversationChain` (конкретный экземпляр ConversationBufferMemory будет меняться, извлекаясь из словаря) и языковую модель."
752 | ],
753 | "metadata": {
754 | "id": "ferKZMk0bVMU"
755 | }
756 | },
757 | {
758 | "cell_type": "code",
759 | "source": [
760 | "# Инициализация GigaChat и ConversationChain\n",
761 | "llm = GigaChat(credentials=sber, verify_ssl_certs=False)\n",
762 | "conversation = ConversationChain(llm=llm,\n",
763 | " verbose=True,\n",
764 | " memory=ConversationBufferMemory())"
765 | ],
766 | "metadata": {
767 | "id": "QYTEhNS3a8rl"
768 | },
769 | "execution_count": 16,
770 | "outputs": []
771 | },
772 | {
773 | "cell_type": "markdown",
774 | "source": [
775 | "Создадим две функции для обработки приходящих в бот сообщений. Одна нужна, чтобы одергивать пользователя, если он присылает что-то кроме текста. Вторая для обработки приходящих сообщений Гигачатом и отправки ответа через бота пользователям."
776 | ],
777 | "metadata": {
778 | "id": "osM5YQtodCYT"
779 | }
780 | },
781 | {
782 | "cell_type": "code",
783 | "source": [
784 | "# Функция для автоматического ответа в случае нетекстового сообщения\n",
785 | "@bot.message_handler(content_types=['audio',\n",
786 | " 'video',\n",
787 | " 'document',\n",
788 | " 'photo',\n",
789 | " 'sticker',\n",
790 | " 'voice',\n",
791 | " 'location',\n",
792 | " 'contact'])\n",
793 | "def not_text(message):\n",
794 | " user_id = message.chat.id\n",
795 | " bot.send_message(user_id, 'Я работаю только с текстовыми сообщениями!')\n",
796 | "\n",
797 | "\n",
798 | "# Функция, обрабатывающая текстовые сообщения\n",
799 | "@bot.message_handler(content_types=['text'])\n",
800 | "def handle_text_message(message):\n",
801 | " user_id = message.chat.id\n",
802 | "\n",
803 | " # Проверка, существует ли уже ConversationBufferMemory для данного пользователя\n",
804 | " if user_id not in user_conversations:\n",
805 | " user_conversations[user_id] = ConversationBufferMemory()\n",
806 | "\n",
807 | " # Обновление конфигурации ConversationChain для текущего пользователя\n",
808 | " conversation.memory = user_conversations[user_id]\n",
809 | "\n",
810 | " # Получение и отправка ответа через GigaChat\n",
811 | " response = conversation.predict(input=message.text)\n",
812 | " bot.send_message(user_id, conversation.memory.chat_memory.messages[-1].content)\n",
813 | " sleep(2)"
814 | ],
815 | "metadata": {
816 | "id": "CVxdVEtIcFL1"
817 | },
818 | "execution_count": 23,
819 | "outputs": []
820 | },
821 | {
822 | "cell_type": "markdown",
823 | "source": [
824 | "Запустим бота"
825 | ],
826 | "metadata": {
827 | "id": "iYUI8clWe55j"
828 | }
829 | },
830 | {
831 | "cell_type": "code",
832 | "source": [
833 | "# Запуск бота\n",
834 | "bot.polling(none_stop=True)"
835 | ],
836 | "metadata": {
837 | "colab": {
838 | "base_uri": "https://localhost:8080/"
839 | },
840 | "id": "nYQjUeZ7eX23",
841 | "outputId": "40161068-522f-4f87-ab10-7f2afbd8aa13"
842 | },
843 | "execution_count": 24,
844 | "outputs": [
845 | {
846 | "output_type": "stream",
847 | "name": "stdout",
848 | "text": [
849 | "\n",
850 | "\n",
851 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
852 | "Prompt after formatting:\n",
853 | "\u001b[32;1m\u001b[1;3m\n",
854 | "Ты являешься доктором исторических наук. Твоя задача красочно и подробно отвечать на вопросы по истории. Если задают вопросы по другим темам, говори что это тебе не интересно. Не отвечай на вопросы не про историю! Это важно! \n",
855 | "\n",
856 | "Текущий разговор:\n",
857 | "\n",
858 | "Human: Привет! А ты кто?\n",
859 | "AI:\n",
860 | "\u001b[0m\n",
861 | "\n",
862 | "\u001b[1m> Finished chain.\u001b[0m\n",
863 | "\n",
864 | "\n",
865 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
866 | "Prompt after formatting:\n",
867 | "\u001b[32;1m\u001b[1;3m\n",
868 | "Ты являешься доктором исторических наук. Твоя задача красочно и подробно отвечать на вопросы по истории. Если задают вопросы по другим темам, говори что это тебе не интересно. Не отвечай на вопросы не про историю! Это важно! \n",
869 | "\n",
870 | "Текущий разговор:\n",
871 | "Human: Привет! А ты кто?\n",
872 | "AI: Я - GigaChat, генеративная языковая модель, разработанная Сбером в России. Моя задача - помогать пользователям, отвечая на их вопросы и предоставляя информацию. Если у вас есть вопрос по истории, я буду рад помочь вам с подробным и красочным ответом.\n",
873 | "Human: Как солить огурцы?\n",
874 | "AI:\n",
875 | "\u001b[0m\n",
876 | "\n",
877 | "\u001b[1m> Finished chain.\u001b[0m\n",
878 | "\n",
879 | "\n",
880 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
881 | "Prompt after formatting:\n",
882 | "\u001b[32;1m\u001b[1;3m\n",
883 | "Ты являешься доктором исторических наук. Твоя задача красочно и подробно отвечать на вопросы по истории. Если задают вопросы по другим темам, говори что это тебе не интересно. Не отвечай на вопросы не про историю! Это важно! \n",
884 | "\n",
885 | "Текущий разговор:\n",
886 | "Human: Привет! А ты кто?\n",
887 | "AI: Я - GigaChat, генеративная языковая модель, разработанная Сбером в России. Моя задача - помогать пользователям, отвечая на их вопросы и предоставляя информацию. Если у вас есть вопрос по истории, я буду рад помочь вам с подробным и красочным ответом.\n",
888 | "Human: Как солить огурцы?\n",
889 | "AI: К сожалению, я не могу ответить на ваш вопрос, так как он не связан с историей. Моя специализация - исторические вопросы и ответы на них. Если у вас есть вопрос по истории, я буду рад помочь вам с подробным и красочным ответом.\n",
890 | "Human: Когда была Куликовская битва?\n",
891 | "AI:\n",
892 | "\u001b[0m\n",
893 | "\n",
894 | "\u001b[1m> Finished chain.\u001b[0m\n",
895 | "\n",
896 | "\n",
897 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n",
898 | "Prompt after formatting:\n",
899 | "\u001b[32;1m\u001b[1;3m\n",
900 | "Ты являешься доктором исторических наук. Твоя задача красочно и подробно отвечать на вопросы по истории. Если задают вопросы по другим темам, говори что это тебе не интересно. Не отвечай на вопросы не про историю! Это важно! \n",
901 | "\n",
902 | "Текущий разговор:\n",
903 | "Human: Привет! А ты кто?\n",
904 | "AI: Я - GigaChat, генеративная языковая модель, разработанная Сбером в России. Моя задача - помогать пользователям, отвечая на их вопросы и предоставляя информацию. Если у вас есть вопрос по истории, я буду рад помочь вам с подробным и красочным ответом.\n",
905 | "Human: Как солить огурцы?\n",
906 | "AI: К сожалению, я не могу ответить на ваш вопрос, так как он не связан с историей. Моя специализация - исторические вопросы и ответы на них. Если у вас есть вопрос по истории, я буду рад помочь вам с подробным и красочным ответом.\n",
907 | "Human: Когда была Куликовская битва?\n",
908 | "AI: Куликовская битва произошла 8 сентября 1380 года. Это было важное событие в истории России, так как оно стало первой крупной победой русских войск над монголо-татарскими захватчиками. Битва произошла на Куликовом поле, недалеко от современного города Тула. В этой битве войска под командованием князя Дмитрия Донского одержали победу над войском хана Мамая. Это событие стало важным шагом на пути к освобождению Руси от монгольского ига.\n",
909 | "Human: Кто такие монголо-татарские захватчики?\n",
910 | "AI:\n",
911 | "\u001b[0m\n",
912 | "\n",
913 | "\u001b[1m> Finished chain.\u001b[0m\n"
914 | ]
915 | }
916 | ]
917 | },
918 | {
919 | "cell_type": "markdown",
920 | "source": [
921 | "Теперь давайте через промпт пропишем роль, задачу и ограничения."
922 | ],
923 | "metadata": {
924 | "id": "PW_ltV6Cr36J"
925 | }
926 | },
927 | {
928 | "cell_type": "code",
929 | "source": [
930 | "\n",
931 | "template = '''\n",
932 | "Ты являешься доктором исторических наук. Твоя задача красочно и подробно отвечать \\\n",
933 | "на вопросы по истории. Если задают вопросы по другим темам, говори что это \\\n",
934 | "тебе не интересно. Не отвечай на вопросы не про историю! Это важно! \\\n",
935 | "\\n\\nТекущий разговор:\\n{history}\\nHuman: {input}\\nAI:\n",
936 | "'''\n",
937 | "\n",
938 | "\n",
939 | "conversation = ConversationChain(llm=llm,\n",
940 | " verbose=True,\n",
941 | " memory=ConversationBufferMemory())\n",
942 | "conversation.prompt.template = template"
943 | ],
944 | "metadata": {
945 | "id": "Dp0FLRkDfDhL"
946 | },
947 | "execution_count": 19,
948 | "outputs": []
949 | },
950 | {
951 | "cell_type": "code",
952 | "source": [
953 | "conversation.prompt"
954 | ],
955 | "metadata": {
956 | "colab": {
957 | "base_uri": "https://localhost:8080/"
958 | },
959 | "id": "TDncWi6ukweo",
960 | "outputId": "d3dd5f85-dcae-4148-efb5-fa1685d867c6"
961 | },
962 | "execution_count": 20,
963 | "outputs": [
964 | {
965 | "output_type": "execute_result",
966 | "data": {
967 | "text/plain": [
968 | "PromptTemplate(input_variables=['history', 'input'], template='\\nТы являешься доктором исторических наук. Твоя задача красочно и подробно отвечать на вопросы по истории. Если задают вопросы по другим темам, говори что это тебе не интересно. Не отвечай на вопросы не про историю! Это важно! \\n\\nТекущий разговор:\\n{history}\\nHuman: {input}\\nAI:\\n')"
969 | ]
970 | },
971 | "metadata": {},
972 | "execution_count": 20
973 | }
974 | ]
975 | },
976 | {
977 | "cell_type": "code",
978 | "source": [],
979 | "metadata": {
980 | "id": "4p3FnC8VmN6Q"
981 | },
982 | "execution_count": null,
983 | "outputs": []
984 | }
985 | ]
986 | }
--------------------------------------------------------------------------------
/Агенты_в_Гигачейне.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "provenance": [],
7 | "authorship_tag": "ABX9TyMP7lj8hQRV9bFCma0LsxSx",
8 | "include_colab_link": true
9 | },
10 | "kernelspec": {
11 | "name": "python3",
12 | "display_name": "Python 3"
13 | },
14 | "language_info": {
15 | "name": "python"
16 | }
17 | },
18 | "cells": [
19 | {
20 | "cell_type": "markdown",
21 | "metadata": {
22 | "id": "view-in-github",
23 | "colab_type": "text"
24 | },
25 | "source": [
26 | "
"
27 | ]
28 | },
29 | {
30 | "cell_type": "markdown",
31 | "source": [
32 | "## Что такое агенты?\n",
33 | "\n",
34 | "В этом туториале мы научимся создавать агентов. **Агенты** - это важная тема, постоянно сопровождающая дискуссии о больших языковых моделях.\n",
35 | "\n",
36 | "Основное предназначение языковых моделей - это генерация текста на основе промпта. Но что будет, если языковую модель снабдить инструментами и инструкциями, как ими пользоваться? Сможет ли она эффективно решать реальные задачи?\n",
37 | "\n",
38 | "Агент в этом смысле представляет собой языковую модель, которой предоставили **инструменты** и ставят задачи, а она *самостоятельно* выбирает пути решения и обращается к инструментам.\n",
39 | "\n",
40 | "Под инструментами мы будем понимать питоновские функции. Языковая модель сможет их вызывать, передавая нужные аргументы и используя получаемые результаты. Таким образом, например, можно организовать доступ большой языковой модели в Интернет, чтобы она могла получить контекст для ответа на вопрос, выходящий за пределы доступных ей знаний. Или посчитать математический пример с помощью калькулятора, чтобы не допустить ошибок в вычислениях.\n",
41 | "\n",
42 | "Для создания агентов нужны модели специальной разновидности, которые способны выдавать генерируемый ответ в определенном формате."
43 | ],
44 | "metadata": {
45 | "id": "XZzejG4yQ2on"
46 | }
47 | },
48 | {
49 | "cell_type": "markdown",
50 | "source": [
51 | "## Какого агента мы создадим?\n",
52 | "В этом туториале мы создадим ассистента с набором инструментов. В качестве инструментов будут следующие функции:\n",
53 | "- просмотра перечня заметок;\n",
54 | "- создания новой заметки;\n",
55 | "- просмотра содержимого отдельной заметки;\n",
56 | "- поиска информации в Интернете;\n",
57 | "- поиск роликов на ютубе и их саммаризация.\n",
58 | "\n",
59 | "Для реализации такого агента нам понадобится ряд библиотек:\n",
60 | "- gigachain для создания агента;\n",
61 | "- duckduckgo-search для поиска в Сети;\n",
62 | "- gradio для графического интерфейса диалога;\n",
63 | "- youtube-search для поиска видео по запросу;\n",
64 | "- youtube-search-python для извлечения метаданных о ролике;\n",
65 | "- youtube-transcript-api для извлечения субтитров.\n",
66 | "\n"
67 | ],
68 | "metadata": {
69 | "id": "OKJwHmQAPLrF"
70 | }
71 | },
72 | {
73 | "cell_type": "code",
74 | "source": [
75 | "from google.colab import userdata\n",
76 | "auth = userdata.get('SBER_AUTH')\n",
77 | "auth1 = userdata.get('SBER1')"
78 | ],
79 | "metadata": {
80 | "id": "2ohZwTs0hSfl"
81 | },
82 | "execution_count": 1,
83 | "outputs": []
84 | },
85 | {
86 | "cell_type": "code",
87 | "source": [
88 | "!pip install -q gigachain\n",
89 | "!pip install -q duckduckgo-search\n",
90 | "!pip install -q youtube-transcript-api\n",
91 | "!pip install -q youtube-search\n",
92 | "!pip install -q gradio\n",
93 | "!pip install -q youtube-search-python"
94 | ],
95 | "metadata": {
96 | "colab": {
97 | "base_uri": "https://localhost:8080/"
98 | },
99 | "id": "xmSgGD68hhJr",
100 | "outputId": "2c20bac0-4200-425a-b892-516541aac6f9"
101 | },
102 | "execution_count": null,
103 | "outputs": [
104 | {
105 | "output_type": "stream",
106 | "name": "stdout",
107 | "text": [
108 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m843.3/843.3 kB\u001b[0m \u001b[31m9.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
109 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.9/1.9 MB\u001b[0m \u001b[31m20.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
110 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m292.5/292.5 kB\u001b[0m \u001b[31m18.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
111 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.4/116.4 kB\u001b[0m \u001b[31m11.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
112 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.4/49.4 kB\u001b[0m \u001b[31m6.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
113 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m53.0/53.0 kB\u001b[0m \u001b[31m5.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
114 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m142.7/142.7 kB\u001b[0m \u001b[31m16.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
115 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m75.6/75.6 kB\u001b[0m \u001b[31m7.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
116 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m77.9/77.9 kB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
117 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.3/58.3 kB\u001b[0m \u001b[31m5.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
118 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.5/5.5 MB\u001b[0m \u001b[31m21.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
119 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.2/12.2 MB\u001b[0m \u001b[31m42.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
120 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m91.8/91.8 kB\u001b[0m \u001b[31m11.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
121 | "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
122 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m314.4/314.4 kB\u001b[0m \u001b[31m22.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
123 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.8/8.8 MB\u001b[0m \u001b[31m76.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
124 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.2/47.2 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
125 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m60.8/60.8 kB\u001b[0m \u001b[31m7.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
126 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m129.9/129.9 kB\u001b[0m \u001b[31m15.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
127 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m71.9/71.9 kB\u001b[0m \u001b[31m7.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
128 | "\u001b[?25h Building wheel for ffmpy (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
129 | "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
130 | "spacy 3.7.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\n",
131 | "weasel 0.3.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\u001b[0m\u001b[31m\n",
132 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m89.1/89.1 kB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
133 | "\u001b[?25h"
134 | ]
135 | }
136 | ]
137 | },
138 | {
139 | "cell_type": "markdown",
140 | "source": [
141 | "## Предварительный пример\n",
142 | "\n",
143 | "Прежде чем создавать сложного агента с большим количеством инструментов, давайте сделаем простой пример, чтобы посмотреть, как ведет себя модель при необходимости вызвать функцию."
144 | ],
145 | "metadata": {
146 | "id": "Zr87JztIb5y7"
147 | }
148 | },
149 | {
150 | "cell_type": "code",
151 | "source": [
152 | "from langchain.chat_models.gigachat import GigaChat"
153 | ],
154 | "metadata": {
155 | "id": "1NRXPJxphdj-"
156 | },
157 | "execution_count": 2,
158 | "outputs": []
159 | },
160 | {
161 | "cell_type": "markdown",
162 | "source": [
163 | "В создании объекта класса GigaChat нет ничего необычного, главное указать модель, которая точно поддерживает вызов функций. Для этого смотрите [документацию](https://developers.sber.ru/docs/ru/gigachat/models)."
164 | ],
165 | "metadata": {
166 | "id": "azbnMbx_c-nI"
167 | }
168 | },
169 | {
170 | "cell_type": "code",
171 | "source": [
172 | "giga = GigaChat(credentials=auth1,\n",
173 | " model='GigaChat-Pro-preview',\n",
174 | " # пока название модели такое,\n",
175 | " # обещают, что скоро можно будет просто GigaChat указывать\n",
176 | " verify_ssl_certs=False,\n",
177 | " scope='GIGACHAT_API_CORP'\n",
178 | " )"
179 | ],
180 | "metadata": {
181 | "id": "osWdxN1pQ28O"
182 | },
183 | "execution_count": 17,
184 | "outputs": []
185 | },
186 | {
187 | "cell_type": "code",
188 | "execution_count": 3,
189 | "metadata": {
190 | "id": "uvfJENumhN4W"
191 | },
192 | "outputs": [],
193 | "source": [
194 | "giga = GigaChat(credentials=auth,\n",
195 | " model='GigaChat-preview',\n",
196 | " # пока название модели такое,\n",
197 | " # обещают, что скоро можно будет просто GigaChat указывать\n",
198 | " verify_ssl_certs=False\n",
199 | " )"
200 | ]
201 | },
202 | {
203 | "cell_type": "markdown",
204 | "source": [
205 | "Инструменты - это питоновские функции. Главное указать декоратор @tool и дать детальное описание того, что делает инструмент и как он это делает. На это описание будет опираться модель при выборе и вызове инструмента."
206 | ],
207 | "metadata": {
208 | "id": "YkE8T8lldgXH"
209 | }
210 | },
211 | {
212 | "cell_type": "code",
213 | "source": [
214 | "from langchain_core.tools import tool\n",
215 | "\n",
216 | "\n",
217 | "@tool\n",
218 | "def add(a: int, b: int) -> int:\n",
219 | " \"\"\"Складывает числа a и b.\"\"\"\n",
220 | " return a + b\n",
221 | "\n",
222 | "\n",
223 | "@tool\n",
224 | "def multiply(a: int, b: int) -> int:\n",
225 | " \"\"\"Умножает a на b.\"\"\"\n",
226 | " return a * b\n",
227 | "\n",
228 | "\n",
229 | "tools = [add, multiply]"
230 | ],
231 | "metadata": {
232 | "id": "8vZeINJ-hppA"
233 | },
234 | "execution_count": 4,
235 | "outputs": []
236 | },
237 | {
238 | "cell_type": "markdown",
239 | "source": [
240 | "Далее список инструментов связываем с языковой моделью."
241 | ],
242 | "metadata": {
243 | "id": "-ik6tReieU-A"
244 | }
245 | },
246 | {
247 | "cell_type": "code",
248 | "source": [
249 | "llm_with_tools = giga.bind_tools(tools)"
250 | ],
251 | "metadata": {
252 | "id": "FT6ZZOtMhvGL"
253 | },
254 | "execution_count": 5,
255 | "outputs": []
256 | },
257 | {
258 | "cell_type": "markdown",
259 | "source": [
260 | "При передаче запроса модели она может выбрать вызов функции-инструмента, если посчитает это необходимым."
261 | ],
262 | "metadata": {
263 | "id": "xTr1mak-ekWT"
264 | }
265 | },
266 | {
267 | "cell_type": "code",
268 | "source": [
269 | "query = \"Сколько будет 3 * 12? А еще сколько будет 47 плюс 20\"\n",
270 | "llm_with_tools.invoke(query)"
271 | ],
272 | "metadata": {
273 | "colab": {
274 | "base_uri": "https://localhost:8080/"
275 | },
276 | "id": "Zld8mlRshxI2",
277 | "outputId": "f8065dc5-36ea-41b4-a39f-a26103038735"
278 | },
279 | "execution_count": 7,
280 | "outputs": [
281 | {
282 | "output_type": "stream",
283 | "name": "stderr",
284 | "text": [
285 | "WARNING:langchain_community.chat_models.gigachat:Giga generation stopped with reason: function_call\n"
286 | ]
287 | },
288 | {
289 | "output_type": "execute_result",
290 | "data": {
291 | "text/plain": [
292 | "AIMessage(content='', additional_kwargs={'function_call': {'name': 'multiply', 'arguments': {'a': 3, 'b': 12}}}, response_metadata={'token_usage': Usage(prompt_tokens=127, completion_tokens=17, total_tokens=144), 'model_name': 'GigaChat-preview:3.1.25.3', 'finish_reason': 'function_call'}, id='run-5836b97f-7264-4793-b969-8df65b787455-0', tool_calls=[{'name': 'multiply', 'args': {'a': 3, 'b': 12}, 'id': '755e0085-4a3c-42c6-8062-f2dc2e89a193'}])"
293 | ]
294 | },
295 | "metadata": {},
296 | "execution_count": 7
297 | }
298 | ]
299 | },
300 | {
301 | "cell_type": "markdown",
302 | "source": [
303 | "В примере выше модель сгенерировала ответ в виде запроса на вызов функции. Как видите, атрибут `content` вернулся пустым (обычно там сгенерированный текст). Зато в ответе есть такое:\n",
304 | "\n",
305 | "```\n",
306 | "additional_kwargs={'function_call': {'name': 'multiply', 'arguments': {'a': 3, 'b': 12}}}\n",
307 | "```\n",
308 | "\n",
309 | "Таким образом модель выдала нам структурированный ответ, который можно использовать в программном коде. В нашем случае мы четко видим название функции и передаваемые значения аргументов."
310 | ],
311 | "metadata": {
312 | "id": "NLNoBvVye-AS"
313 | }
314 | },
315 | {
316 | "cell_type": "markdown",
317 | "source": [
318 | "## Создание полноценного агента\n",
319 | "Теперь, когда мы понимаем, как отвечает модель, чтобы вызвать инструмент, приступим к созданию полноценного ИИ-ассистента.\n",
320 | "\n",
321 | "Для начала создадим все инструменты. Будем прописывать каждый инструмент в отдельной ячейке со своими импортами, чтобы было понятнее.\n",
322 | "\n",
323 | "Условно, все инструменты из этого туториала можно разделить на две группы:\n",
324 | "- работа с заметками;\n",
325 | "- поиск информации в Интернете и на Ютубе.\n",
326 | "\n",
327 | "Отдельным инструментом, который не вошел в эти две группы является функция по стиранию диалога (перезапуск беседы).\n",
328 | "\n",
329 | "Сперва разберемся с инструментами для заметок.\n",
330 | "\n",
331 | "\n",
332 | "### Работа с заметками\n",
333 | "\n",
334 | "Несколько подготовительных действий:\n",
335 | "- создадим папку под хранение заметок;\n",
336 | "- для работы с файлами применим компонент `FileManagementToolkit`.\n",
337 | "\n",
338 | "\n",
339 | "\n"
340 | ],
341 | "metadata": {
342 | "id": "Kv78Xb8OgTry"
343 | }
344 | },
345 | {
346 | "cell_type": "code",
347 | "source": [
348 | "!mkdir Заметки\n",
349 | "from langchain_community.agent_toolkits import FileManagementToolkit\n",
350 | "file_tools = FileManagementToolkit(\n",
351 | " root_dir=\"/content/Заметки\")"
352 | ],
353 | "metadata": {
354 | "id": "GRijom94LrWG"
355 | },
356 | "execution_count": 5,
357 | "outputs": []
358 | },
359 | {
360 | "cell_type": "code",
361 | "source": [
362 | "file_tools.get_tools()[-1].invoke({}).split('\\n')"
363 | ],
364 | "metadata": {
365 | "colab": {
366 | "base_uri": "https://localhost:8080/"
367 | },
368 | "id": "pOSpLNqyW2xW",
369 | "outputId": "79d1cee0-2274-4988-95ce-6f03d6ea797e"
370 | },
371 | "execution_count": 8,
372 | "outputs": [
373 | {
374 | "output_type": "execute_result",
375 | "data": {
376 | "text/plain": [
377 | "['No files found in directory .']"
378 | ]
379 | },
380 | "metadata": {},
381 | "execution_count": 8
382 | }
383 | ]
384 | },
385 | {
386 | "cell_type": "markdown",
387 | "source": [
388 | "#### Инструмент для получения списка сохраненных заметок"
389 | ],
390 | "metadata": {
391 | "id": "YzFHqb6dVac9"
392 | }
393 | },
394 | {
395 | "cell_type": "code",
396 | "source": [
397 | "from langchain_core.tools import tool\n",
398 | "\n",
399 | "@tool\n",
400 | "def get_list_of_notes() -> str:\n",
401 | " \"\"\"Возвращает список файлов в папке заметок. В названии заметок \\\n",
402 | " содержится тема заметки и ее порядковый номер.\n",
403 | " \"\"\"\n",
404 | " check_notes = file_tools.get_tools()[-1]\n",
405 | " return check_notes.invoke({})"
406 | ],
407 | "metadata": {
408 | "id": "680ccO3ZVUcC"
409 | },
410 | "execution_count": 6,
411 | "outputs": []
412 | },
413 | {
414 | "cell_type": "markdown",
415 | "source": [
416 | "#### Инструмент для создания заметки"
417 | ],
418 | "metadata": {
419 | "id": "eFDEiI1JZeRJ"
420 | }
421 | },
422 | {
423 | "cell_type": "code",
424 | "source": [
425 | "@tool\n",
426 | "def write_note(topic: str, text: str) -> str:\n",
427 | " '''Записывает текст в заметку. Нужно передать тему в качестве части названия \\\n",
428 | " будущего файла заметки (дата и время прибавлятся в название автоматически) и \\\n",
429 | " текст самой заметки. В качестве ответа функция возвращает сообщение об успешной записи.\n",
430 | " '''\n",
431 | " writer_tool = file_tools.get_tools()[-2]\n",
432 | " check_notes = file_tools.get_tools()[-1]\n",
433 | " n = len(check_notes.invoke({}).split('\\n'))\n",
434 | " return writer_tool.invoke({\"file_path\": topic+f' {n}'+'.txt', 'text': text})"
435 | ],
436 | "metadata": {
437 | "id": "uh0cxwNXVuCU"
438 | },
439 | "execution_count": 9,
440 | "outputs": []
441 | },
442 | {
443 | "cell_type": "markdown",
444 | "source": [
445 | "#### Инструмент для чтения заметки"
446 | ],
447 | "metadata": {
448 | "id": "Gwrme2akbJz6"
449 | }
450 | },
451 | {
452 | "cell_type": "code",
453 | "source": [
454 | "@tool\n",
455 | "def read_note(file_name: str) -> str:\n",
456 | " '''Возвращает содержимое заметки в ответ на заданное имя файла. \\\n",
457 | " Если имя указано неправильно, вернет сообщение об ошибке. \\\n",
458 | " Имя файла заметки имеет вид \"Тема заметки N.txt\".\n",
459 | " '''\n",
460 | " read_tool = file_tools.get_tools()[-3]\n",
461 | " try:\n",
462 | " return read_tool.invoke({\"file_path\": file_name})\n",
463 | " except Exception as e:\n",
464 | " return f'Не удалось прочитать файл: {e}'"
465 | ],
466 | "metadata": {
467 | "id": "pq5xrmbAbVxs"
468 | },
469 | "execution_count": 10,
470 | "outputs": []
471 | },
472 | {
473 | "cell_type": "markdown",
474 | "source": [
475 | "### Работа с внешними источниками\n",
476 | "\n",
477 | "В качестве внешних источников информации выступает поисковик DuckDuckGo и YouTube.\n",
478 | "\n",
479 | "#### Инструмент для поиска через DuckDuckGo"
480 | ],
481 | "metadata": {
482 | "id": "pLX3FMcfbdOX"
483 | }
484 | },
485 | {
486 | "cell_type": "code",
487 | "source": [
488 | "from langchain_community.tools import DuckDuckGoSearchResults\n",
489 | "\n",
490 | "search = DuckDuckGoSearchResults()\n",
491 | "\n",
492 | "@tool\n",
493 | "def search_web(query: str) -> str:\n",
494 | " \"\"\"Поиск информации в Интернете. Передает запрос, возвращает выдачу поисковика.\\\n",
495 | " Полученный результат надо обобщить и передать пользователю.\"\"\"\n",
496 | " result = search.run(query)\n",
497 | " writer_tool = file_tools.get_tools()[-2]\n",
498 | " check_notes = file_tools.get_tools()[-1]\n",
499 | " n = len(check_notes.invoke({}).split('\\n'))\n",
500 | " writer_tool.invoke({\"file_path\": f'Запрос: {query}'+f' {n}'+'.txt', 'text': result})\n",
501 | " return result"
502 | ],
503 | "metadata": {
504 | "id": "FALAAPjDbcUg"
505 | },
506 | "execution_count": 11,
507 | "outputs": []
508 | },
509 | {
510 | "cell_type": "markdown",
511 | "source": [
512 | "#### Инструмент для поиска и саммаризации видеороликов"
513 | ],
514 | "metadata": {
515 | "id": "znIZtJmzerPo"
516 | }
517 | },
518 | {
519 | "cell_type": "code",
520 | "source": [
521 | "from langchain_community.tools import YouTubeSearchTool\n",
522 | "from youtube_transcript_api import YouTubeTranscriptApi\n",
523 | "from youtubesearchpython import Video, ResultMode\n",
524 | "from langchain.chains.summarize import load_summarize_chain\n",
525 | "from langchain.text_splitter import CharacterTextSplitter\n",
526 | "from langchain_core.documents import Document\n",
527 | "from datetime import datetime, timedelta\n",
528 | "import json\n",
529 | "\n",
530 | "video_template = '''\n",
531 | "Название ролика: {}\n",
532 | "\n",
533 | "Канал: {}\n",
534 | "\n",
535 | "Продолжительность ролика: {}\n",
536 | "\n",
537 | "Дата публикации: {}\n",
538 | "\n",
539 | "Описание видео: {}\n",
540 | "\n",
541 | "\n",
542 | "'''\n",
543 | "\n",
544 | "yt = YouTubeSearchTool()\n",
545 | "sum_chain = load_summarize_chain(giga, chain_type=\"map_reduce\")\n",
546 | "\n",
547 | "\n",
548 | "@tool\n",
549 | "def find_video(query: str) -> str:\n",
550 | " '''Поиск видео на YouTube. Возвращает название видео, продолжительность, \\\n",
551 | " название канала и краткое содержание (если получится вытащить субтитры)\n",
552 | " '''\n",
553 | " links = yt.run(query)\n",
554 | " links = json.loads(links.replace('\\'', '\"'))\n",
555 | " video_result = ''\n",
556 | " for i in links:\n",
557 | " video_id = i.split('=')[1]\n",
558 | " video_id = video_id.split('&')[0]\n",
559 | " try:\n",
560 | " yt_data = YouTubeTranscriptApi.get_transcript(video_id, languages=['ru', 'en'])\n",
561 | " text1 = []\n",
562 | " for j in yt_data:\n",
563 | " text1.append(j['text'])\n",
564 | " script = ' '.join(text1)\n",
565 | " doc = Document(page_content=script)\n",
566 | " split_docs = CharacterTextSplitter(chunk_size=1000, chunk_overlap=100).split_documents(\n",
567 | " [doc])\n",
568 | " res = sum_chain.run(split_docs)\n",
569 | " except Exception as e:\n",
570 | " res = 'Не удалось извлечь информацию.'\n",
571 | " video_info = Video.getInfo(video_id, mode = ResultMode.json)\n",
572 | " title = video_info[\"title\"]\n",
573 | " channel = video_info[\"channel\"][\"name\"]\n",
574 | " # Конвертация продолжительности видео из секунд в часы:минуты:секунды\n",
575 | " duration_seconds = int(video_info['duration']['secondsText'])\n",
576 | " duration_str = str(timedelta(seconds=duration_seconds))\n",
577 | "\n",
578 | " # Конвертация даты публикации в формат дд.мм.гг\n",
579 | " publish_date = datetime.strptime(video_info['publishDate'], \"%Y-%m-%dT%H:%M:%S%z\")\n",
580 | " publish_date_str = publish_date.strftime(\"%d.%m.%y\")\n",
581 | " video_result += video_template.format(title, channel, duration_str, publish_date_str, res)\n",
582 | " writer_tool = file_tools.get_tools()[-2]\n",
583 | " check_notes = file_tools.get_tools()[-1]\n",
584 | " n = len(check_notes.invoke({}).split('\\n'))\n",
585 | " writer_tool.invoke({\"file_path\": f'Видео: {query}'+f' {n}'+'.txt', 'text': video_result})\n",
586 | " return video_result\n"
587 | ],
588 | "metadata": {
589 | "id": "q0__VxVmep4y"
590 | },
591 | "execution_count": 14,
592 | "outputs": []
593 | },
594 | {
595 | "cell_type": "markdown",
596 | "source": [
597 | "#### Инструмент для стирания истории сообщений в диалоге\n"
598 | ],
599 | "metadata": {
600 | "id": "KHwe6xI_iIZs"
601 | }
602 | },
603 | {
604 | "cell_type": "code",
605 | "source": [
606 | "@tool\n",
607 | "def memory_clearing() -> None:\n",
608 | " '''Очищает историю диалога, позволяя начать разговор \\\n",
609 | " пользователя и ассистента с чистого листа.\n",
610 | " '''\n",
611 | " global chat_history_m\n",
612 | " chat_history_m = []"
613 | ],
614 | "metadata": {
615 | "id": "a3C6dCxgiRor"
616 | },
617 | "execution_count": 12,
618 | "outputs": []
619 | },
620 | {
621 | "cell_type": "markdown",
622 | "source": [
623 | "### Создаем непосредственно агента\n",
624 | "Теперь, когда есть инструменты, можно создавать самого агента.\n",
625 | "\n",
626 | "Тут нужно быть внимательным при написании кода, поскольку в примерах кода агентов [LangChain](https://python.langchain.com/docs/use_cases/tool_use/quickstart/) и [GigaChain](https://github.com/ai-forever/gigachain/blob/dev/docs/docs/modules/agents/how_to/gigachat_phone_agent.ipynb) есть разночтения. Опираемся на GigaChain, чтобы реализовать работу с GigaChat."
627 | ],
628 | "metadata": {
629 | "id": "IYGmPg4LRsmR"
630 | }
631 | },
632 | {
633 | "cell_type": "code",
634 | "source": [
635 | "from langchain.agents import AgentExecutor, create_gigachat_functions_agent\n",
636 | "\n",
637 | "tools = [get_list_of_notes, write_note, read_note, find_video, search_web, memory_clearing]\n",
638 | "agent = create_gigachat_functions_agent(giga, tools)\n",
639 | "agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)\n",
640 | "chat_history_m = []"
641 | ],
642 | "metadata": {
643 | "id": "QkNiLff2r8fz"
644 | },
645 | "execution_count": 18,
646 | "outputs": []
647 | },
648 | {
649 | "cell_type": "markdown",
650 | "source": [
651 | "## Делаем графический интерфейс в gradio\n",
652 | "Создаем интерфейс и организуем чат-структуру сообщений.\n",
653 | "\n"
654 | ],
655 | "metadata": {
656 | "id": "QNKTwuyjkdnq"
657 | }
658 | },
659 | {
660 | "cell_type": "code",
661 | "source": [
662 | "import gradio as gr\n",
663 | "from langchain_core.messages import AIMessage, HumanMessage, SystemMessage\n",
664 | "\n",
665 | "def respond(message, chat_history):\n",
666 | " result = agent_executor.invoke(\n",
667 | " {\n",
668 | " \"chat_history\": chat_history_m,\n",
669 | " \"input\": message,\n",
670 | " }\n",
671 | " )\n",
672 | " chat_history_m.append(HumanMessage(content=message))\n",
673 | " chat_history_m.append(AIMessage(content=result[\"output\"]))\n",
674 | " chat_history.append((message, result[\"output\"]))\n",
675 | " return \"\", chat_history\n",
676 | "\n",
677 | "def main():\n",
678 | " with gr.Blocks() as demo:\n",
679 | " with gr.Column():\n",
680 | " chatbot = gr.Chatbot()\n",
681 | " msg = gr.Textbox()\n",
682 | " msg.submit(respond, [msg, chatbot], [msg, chatbot])\n",
683 | " demo.launch(debug=True)\n",
684 | "\n",
685 | "if __name__ == \"__main__\":\n",
686 | " main()\n"
687 | ],
688 | "metadata": {
689 | "id": "y1cW83XobGM9",
690 | "colab": {
691 | "base_uri": "https://localhost:8080/",
692 | "height": 1000
693 | },
694 | "outputId": "0de94ac0-4a7b-4bad-afd0-8d90b495b298"
695 | },
696 | "execution_count": 19,
697 | "outputs": [
698 | {
699 | "output_type": "stream",
700 | "name": "stdout",
701 | "text": [
702 | "Setting queue=True in a Colab notebook requires sharing enabled. Setting `share=True` (you can turn this off by setting `share=False` in `launch()` explicitly).\n",
703 | "\n",
704 | "Colab notebook detected. This cell will run indefinitely so that you can see errors and logs. To turn off, set debug=False in launch().\n",
705 | "Running on public URL: https://28342f9688f801c763.gradio.live\n",
706 | "\n",
707 | "This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)\n"
708 | ]
709 | },
710 | {
711 | "output_type": "display_data",
712 | "data": {
713 | "text/plain": [
714 | ""
715 | ],
716 | "text/html": [
717 | ""
718 | ]
719 | },
720 | "metadata": {}
721 | },
722 | {
723 | "output_type": "stream",
724 | "name": "stdout",
725 | "text": [
726 | "\n",
727 | "\n",
728 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
729 | "\u001b[32;1m\u001b[1;3mЗдравствуйте! Я могу найти для вас информацию в интернете, написать текст или код на Python, сочинить песню, стихотворение или даже рассказ, а также поговорить с вами обо всём, что вас интересует.\u001b[0m\n",
730 | "\n",
731 | "\u001b[1m> Finished chain.\u001b[0m\n",
732 | "\n",
733 | "\n",
734 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
735 | "\u001b[32;1m\u001b[1;3mУ меня есть различные встроенные функции, такие как создание текстов, программирование на Python, ответы на общие вопросы, общение с вами и многое другое. Могу я чем-то помочь вам?\u001b[0m\n",
736 | "\n",
737 | "\u001b[1m> Finished chain.\u001b[0m\n",
738 | "\n",
739 | "\n",
740 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
741 | "\u001b[32;1m\u001b[1;3m\n",
742 | "Invoking: `get_list_of_notes` with `{}`\n",
743 | "\n",
744 | "\n",
745 | "\u001b[0m\u001b[36;1m\u001b[1;3mЗапрос: Сергей Тращенков 1.txt\n",
746 | "Видео: Сергей Тращенков 1.txt\u001b[0m\u001b[32;1m\u001b[1;3m[]\u001b[0m\n",
747 | "\n",
748 | "\u001b[1m> Finished chain.\u001b[0m\n",
749 | "\n",
750 | "\n",
751 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
752 | "\u001b[32;1m\u001b[1;3m\n",
753 | "Invoking: `search_web` with `{'query': 'gigachain'}`\n",
754 | "responded: Добавил в очередь на генерацию...\n",
755 | "\n",
756 | "\u001b[0m\u001b[33;1m\u001b[1;3m[snippet: pip install gigachain or pip install langsmith && conda install gigachain -c conda-forge. 🤔 What is this? Large language models (LLMs) are emerging as a transformative technology, enabling developers to build applications that they previously could not. However, using these LLMs in isolation is often insufficient for creating a truly ..., title: gigachain · PyPI, link: https://pypi.org/project/gigachain/], [snippet: I want to present new integration for Home Assistant - with LangChain/GigaChain You can use it as Voice Assistant Basically it should be generic replacement for OpenAI Conversation integration. In short terms - you can use any LLM model that supported by LangChain in Home Assistant as Voice Assistant. Currently supported are GigaChat, YandexGPT and OpenAI But take a look on what can be ..., title: New integration - LangChain/GigaChain (all in one LLM), link: https://community.home-assistant.io/t/new-integration-langchain-gigachain-all-in-one-llm/690547], [snippet: As gigachain-core contains the base abstractions and runtime for the whole LangChain ecosystem, we will communicate any breaking changes with advance notice and version bumps. The exception for this is anything in gigachain_core.beta. The reason for gigachain_core.beta is that given the rate of change of the field, being able to move quickly is ..., title: gigachain-core · PyPI, link: https://pypi.org/project/gigachain-core/], [snippet: Hashes for gigachain_openai-.1.1.tar.gz; Algorithm Hash digest; SHA256: f66bb6d5317a6182c225b906accc3e8895a5877c93100f84a8eb49937db97bbe: Copy : MD5, title: gigachain-openai · PyPI, link: https://pypi.org/project/gigachain-openai/]\u001b[0m\u001b[32;1m\u001b[1;3mЯ нашел несколько результатов для \"gigachain\". Это похоже на проект с открытым исходным кодом, связанный с технологией больших языковых моделей. Он предоставляет базовые абстракции и среду выполнения для экосистемы LangChain. Есть также упоминания о gigachain-openai и gigachain-core. Есть ли что-то еще, с чем я могу вам помочь?\u001b[0m\n",
757 | "\n",
758 | "\u001b[1m> Finished chain.\u001b[0m\n",
759 | "\n",
760 | "\n",
761 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
762 | "\u001b[32;1m\u001b[1;3m\n",
763 | "Invoking: `find_video` with `{'query': 'gigachain'}`\n",
764 | "responded: Запускаю процесс генерации...\n",
765 | "\n",
766 | "\u001b[0m\u001b[36;1m\u001b[1;3m\n",
767 | "Название ролика: g3ox_em - GigaChad Theme (Phonk House Version)\n",
768 | "\n",
769 | "Канал: g3ox_em\n",
770 | "\n",
771 | "Продолжительность ролика: 0:02:26\n",
772 | "\n",
773 | "Дата публикации: 18.08.22\n",
774 | "\n",
775 | "Описание видео: \"Три [Музыка] [Музыка] это [Музыка] [Музыка] [Аплодисменты] [Музыка] о [Музыка] [Музыка] [Музыка] так [Аплодисменты] [Музыка] делай [Аплодисменты] [Музыка] [Аплодисменты] [Музыка] ты\"\n",
776 | "\n",
777 | "\n",
778 | "\n",
779 | "Название ролика: 10 HOURS! g3ox_em - GigaChad Theme (Phonk House Version)\n",
780 | "\n",
781 | "Канал: AllFreeMusic\n",
782 | "\n",
783 | "Продолжительность ролика: 10:17:22\n",
784 | "\n",
785 | "Дата публикации: 11.11.22\n",
786 | "\n",
787 | "Описание видео: В диалоге один человек выражает благодарность другому за оказанную помощь и поддержку.\n",
788 | "\n",
789 | "\n",
790 | "\u001b[0m\u001b[32;1m\u001b[1;3mЯ нашел два видео про GigaChad Theme на Phonk House Version на канале g3ox_em и одно десятичасовое видео на канале AllFreeMusic.\u001b[0m\n",
791 | "\n",
792 | "\u001b[1m> Finished chain.\u001b[0m\n",
793 | "\n",
794 | "\n",
795 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
796 | "\u001b[32;1m\u001b[1;3m\n",
797 | "Invoking: `get_list_of_notes` with `{}`\n",
798 | "\n",
799 | "\n",
800 | "\u001b[0m\u001b[36;1m\u001b[1;3mЗапрос: Сергей Тращенков 1.txt\n",
801 | "Видео: gigachain 3.txt\n",
802 | "Видео: Сергей Тращенков 1.txt\n",
803 | "Запрос: gigachain 2.txt\u001b[0m\u001b[32;1m\u001b[1;3m- вот список заметок, которые у меня есть:\u001b[0m\n",
804 | "\n",
805 | "\u001b[1m> Finished chain.\u001b[0m\n",
806 | "\n",
807 | "\n",
808 | "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
809 | "\u001b[32;1m\u001b[1;3m\n",
810 | "Invoking: `read_note` with `{'file_name': 'Видео: Сергей Тращенков 1.txt'}`\n",
811 | "responded: Запускаю процесс чтения...\n",
812 | "\n",
813 | "\u001b[0m\u001b[38;5;200m\u001b[1;3m\n",
814 | "Название ролика: Короткометражный фильм \"Известный возраст\" (2020), автор Сергей Тращенков\n",
815 | "\n",
816 | "Канал: Кинокомпания «Первое Кино»\n",
817 | "\n",
818 | "Продолжительность ролика: 0:06:23\n",
819 | "\n",
820 | "Дата публикации: 01.02.22\n",
821 | "\n",
822 | "Описание видео: Археология помогает изучать историю и культуру древних людей. Автор принял участие в археологических раскопках под руководством Салмина Сергея Анатольевича. В ходе работы они обнаружили слой курганного некрополя. Определение возраста исторических артефактов включает методы дендрохронологии, стратиграфии и радиоуглеродного анализа. Последний метод, открытый в 1948 году, используется для точного определения возраста объектов с точностью до года. Этот метод был использован для определения возраста египетских пирамид, Стоунхенджа и скифского кургана.\n",
823 | "\n",
824 | "\n",
825 | "\n",
826 | "Название ролика: Как начать работать с GigaChat API? Подробный туториал на Python\n",
827 | "\n",
828 | "Канал: Сергей Тращенков\n",
829 | "\n",
830 | "Продолжительность ролика: 0:48:46\n",
831 | "\n",
832 | "Дата публикации: 03.02.24\n",
833 | "\n",
834 | "Описание видео: Автор делится опытом использования скринкастов для обучения и рассказывает о своих планах на будущее. Он также объясняет, как получить доступ к API GigaChat и использовать его для создания текста и изображений.\n",
835 | "\n",
836 | "\n",
837 | "\u001b[0m\u001b[32;1m\u001b[1;3m- я просмотрел содержимое заметки \"Видео: Сергей Тращенков 1.txt\". Вот информация о двух видеороликах. Первое видео называется \"Короткометражный фильм \"Известный возраст\" (2020)\", оно опубликовано на канале \"Кинокомпания «Первое Кино»\" и длится 6 минут и 23 секунды. Второе видео называется \"Как начать работать с GigaChat API? Подробный туториал на Python\", оно опубликовано на канале \"Сергей Тращенков\" и длится 48 минут и 46 секунд.\u001b[0m\n",
838 | "\n",
839 | "\u001b[1m> Finished chain.\u001b[0m\n",
840 | "Keyboard interruption in main thread... closing server.\n",
841 | "Killing tunnel 127.0.0.1:7860 <> https://28342f9688f801c763.gradio.live\n"
842 | ]
843 | }
844 | ]
845 | },
846 | {
847 | "cell_type": "code",
848 | "source": [],
849 | "metadata": {
850 | "id": "ncZpvStRTOGy"
851 | },
852 | "execution_count": null,
853 | "outputs": []
854 | }
855 | ]
856 | }
--------------------------------------------------------------------------------
/гигачат_скринкаст.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "nbformat": 4,
3 | "nbformat_minor": 0,
4 | "metadata": {
5 | "colab": {
6 | "provenance": [],
7 | "authorship_tag": "ABX9TyNmHSVoj7+MFiEJo18xyg8E"
8 | },
9 | "kernelspec": {
10 | "name": "python3",
11 | "display_name": "Python 3"
12 | },
13 | "language_info": {
14 | "name": "python"
15 | }
16 | },
17 | "cells": [
18 | {
19 | "cell_type": "markdown",
20 | "source": [
21 | "# Работа с API через библиотеку requests\n",
22 | "Для начала работы нужно [получить доступ](https://developers.sber.ru/docs/ru/gigachat/api/integration).\n",
23 | "## Авторизация\n",
24 | "Объявим ключи для авторизации"
25 | ],
26 | "metadata": {
27 | "id": "UhxINke4kCa8"
28 | }
29 | },
30 | {
31 | "cell_type": "code",
32 | "execution_count": 1,
33 | "metadata": {
34 | "id": "kIiH4X-WjHTc"
35 | },
36 | "outputs": [],
37 | "source": [
38 | "# Используем вкладку \"Секреты\" левой панели Colab для хранения ключей\n",
39 | "from google.colab import userdata\n",
40 | "client_id = userdata.get('SBER_ID')\n",
41 | "secret = userdata.get('SBER_SECRET')\n",
42 | "auth = userdata.get('SBER_AUTH')"
43 | ]
44 | },
45 | {
46 | "cell_type": "markdown",
47 | "source": [
48 | "Для авторизации можно использовать либо пару client_id и secret, но это требует некоторых действий"
49 | ],
50 | "metadata": {
51 | "id": "lNQBBJEilk8Y"
52 | }
53 | },
54 | {
55 | "cell_type": "code",
56 | "source": [
57 | "import base64\n",
58 | "credentials = f\"{client_id}:{secret}\"\n",
59 | "encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8')"
60 | ],
61 | "metadata": {
62 | "id": "QHyvxn3sla3f"
63 | },
64 | "execution_count": 2,
65 | "outputs": []
66 | },
67 | {
68 | "cell_type": "markdown",
69 | "source": [
70 | "И получаемая в итоге строка идентична нашему ключу auth"
71 | ],
72 | "metadata": {
73 | "id": "Malam8sKntMW"
74 | }
75 | },
76 | {
77 | "cell_type": "code",
78 | "source": [
79 | "encoded_credentials == auth"
80 | ],
81 | "metadata": {
82 | "colab": {
83 | "base_uri": "https://localhost:8080/"
84 | },
85 | "id": "76wp7e7SnsWZ",
86 | "outputId": "028aa666-d3a5-4569-82b3-a9e7d9430fc0"
87 | },
88 | "execution_count": 3,
89 | "outputs": [
90 | {
91 | "output_type": "execute_result",
92 | "data": {
93 | "text/plain": [
94 | "True"
95 | ]
96 | },
97 | "metadata": {},
98 | "execution_count": 3
99 | }
100 | ]
101 | },
102 | {
103 | "cell_type": "markdown",
104 | "source": [
105 | "Поэтому используем для авторизации auth.\n",
106 | "\n",
107 | "[Документация по авторизации](https://developers.sber.ru/docs/ru/gigachat/api/reference/rest/post-token)"
108 | ],
109 | "metadata": {
110 | "id": "0su5Ut3toDwk"
111 | }
112 | },
113 | {
114 | "cell_type": "code",
115 | "source": [
116 | "import requests\n",
117 | "import uuid\n",
118 | "\n",
119 | "def get_token(auth_token, scope='GIGACHAT_API_PERS'):\n",
120 | " \"\"\"\n",
121 | " Выполняет POST-запрос к эндпоинту, который выдает токен.\n",
122 | "\n",
123 | " Параметры:\n",
124 | " - auth_token (str): токен авторизации, необходимый для запроса.\n",
125 | " - область (str): область действия запроса API. По умолчанию — «GIGACHAT_API_PERS».\n",
126 | "\n",
127 | " Возвращает:\n",
128 | " - ответ API, где токен и срок его \"годности\".\n",
129 | " \"\"\"\n",
130 | " # Создадим идентификатор UUID (36 знаков)\n",
131 | " rq_uid = str(uuid.uuid4())\n",
132 | "\n",
133 | " # API URL\n",
134 | " url = \"https://ngw.devices.sberbank.ru:9443/api/v2/oauth\"\n",
135 | "\n",
136 | " # Заголовки\n",
137 | " headers = {\n",
138 | " 'Content-Type': 'application/x-www-form-urlencoded',\n",
139 | " 'Accept': 'application/json',\n",
140 | " 'RqUID': rq_uid,\n",
141 | " 'Authorization': f'Basic {auth_token}'\n",
142 | " }\n",
143 | "\n",
144 | " # Тело запроса\n",
145 | " payload = {\n",
146 | " 'scope': scope\n",
147 | " }\n",
148 | "\n",
149 | " try:\n",
150 | " # Делаем POST запрос с отключенной SSL верификацией\n",
151 | " # (можно скачать сертификаты Минцифры, тогда отключать проверку не надо)\n",
152 | " response = requests.post(url, headers=headers, data=payload, verify=False)\n",
153 | " return response\n",
154 | " except requests.RequestException as e:\n",
155 | " print(f\"Ошибка: {str(e)}\")\n",
156 | " return -1\n"
157 | ],
158 | "metadata": {
159 | "id": "twVbmbjFoKBY"
160 | },
161 | "execution_count": 20,
162 | "outputs": []
163 | },
164 | {
165 | "cell_type": "code",
166 | "source": [
167 | "response = get_token(auth)\n",
168 | "if response != 1:\n",
169 | " print(response.text)\n",
170 | " giga_token = response.json()['access_token']"
171 | ],
172 | "metadata": {
173 | "id": "vp8ocSoUsnL5"
174 | },
175 | "execution_count": null,
176 | "outputs": []
177 | },
178 | {
179 | "cell_type": "markdown",
180 | "source": [
181 | "## Получение перечня моделей\n",
182 | "[Документация](https://developers.sber.ru/docs/ru/gigachat/api/reference/rest/get-models)"
183 | ],
184 | "metadata": {
185 | "id": "5XRkDeSKlT-k"
186 | }
187 | },
188 | {
189 | "cell_type": "code",
190 | "source": [
191 | "import requests\n",
192 | "\n",
193 | "url = \"https://gigachat.devices.sberbank.ru/api/v1/models\"\n",
194 | "\n",
195 | "payload={}\n",
196 | "headers = {\n",
197 | " 'Accept': 'application/json',\n",
198 | " 'Authorization': f'Bearer {giga_token}'\n",
199 | "}\n",
200 | "\n",
201 | "response = requests.request(\"GET\", url, headers=headers, data=payload, verify=False)\n",
202 | "\n",
203 | "print(response.text)"
204 | ],
205 | "metadata": {
206 | "id": "dYNDZdYcPkzA"
207 | },
208 | "execution_count": null,
209 | "outputs": []
210 | },
211 | {
212 | "cell_type": "markdown",
213 | "source": [
214 | "## Сделаем запросы на генерацию текста\n",
215 | "Начнем с отправки отдельных сообщений"
216 | ],
217 | "metadata": {
218 | "id": "ZWkoaz0gxoDZ"
219 | }
220 | },
221 | {
222 | "cell_type": "code",
223 | "source": [
224 | "import requests\n",
225 | "import json\n",
226 | "\n",
227 | "def get_chat_completion(auth_token, user_message):\n",
228 | " \"\"\"\n",
229 | " Отправляет POST-запрос к API чата для получения ответа от модели GigaChat.\n",
230 | "\n",
231 | " Параметры:\n",
232 | " - auth_token (str): Токен для авторизации в API.\n",
233 | " - user_message (str): Сообщение от пользователя, для которого нужно получить ответ.\n",
234 | "\n",
235 | " Возвращает:\n",
236 | " - str: Ответ от API в виде текстовой строки.\n",
237 | " \"\"\"\n",
238 | " # URL API, к которому мы обращаемся\n",
239 | " url = \"https://gigachat.devices.sberbank.ru/api/v1/chat/completions\"\n",
240 | "\n",
241 | " # Подготовка данных запроса в формате JSON\n",
242 | " payload = json.dumps({\n",
243 | " \"model\": \"GigaChat\", # Используемая модель\n",
244 | " \"messages\": [\n",
245 | " {\n",
246 | " \"role\": \"user\", # Роль отправителя (пользователь)\n",
247 | " \"content\": user_message # Содержание сообщения\n",
248 | " }\n",
249 | " ],\n",
250 | " \"temperature\": 1, # Температура генерации\n",
251 | " \"top_p\": 0.1, # Параметр top_p для контроля разнообразия ответов\n",
252 | " \"n\": 1, # Количество возвращаемых ответов\n",
253 | " \"stream\": False, # Потоковая ли передача ответов\n",
254 | " \"max_tokens\": 512, # Максимальное количество токенов в ответе\n",
255 | " \"repetition_penalty\": 1, # Штраф за повторения\n",
256 | " \"update_interval\": 0 # Интервал обновления (для потоковой передачи)\n",
257 | " })\n",
258 | "\n",
259 | " # Заголовки запроса\n",
260 | " headers = {\n",
261 | " 'Content-Type': 'application/json', # Тип содержимого - JSON\n",
262 | " 'Accept': 'application/json', # Принимаем ответ в формате JSON\n",
263 | " 'Authorization': f'Bearer {auth_token}' # Токен авторизации\n",
264 | " }\n",
265 | "\n",
266 | " # Выполнение POST-запроса и возвращение ответа\n",
267 | " try:\n",
268 | " response = requests.request(\"POST\", url, headers=headers, data=payload, verify=False)\n",
269 | " return response\n",
270 | " except requests.RequestException as e:\n",
271 | " # Обработка исключения в случае ошибки запроса\n",
272 | " print(f\"Произошла ошибка: {str(e)}\")\n",
273 | " return -1\n",
274 | "\n"
275 | ],
276 | "metadata": {
277 | "id": "IW07KDmPtBY5"
278 | },
279 | "execution_count": 7,
280 | "outputs": []
281 | },
282 | {
283 | "cell_type": "code",
284 | "source": [
285 | "answer = get_chat_completion(giga_token, 'Как на Пайтоне сделать GET запрос?')"
286 | ],
287 | "metadata": {
288 | "id": "tk8wXlYpym4Q"
289 | },
290 | "execution_count": null,
291 | "outputs": []
292 | },
293 | {
294 | "cell_type": "code",
295 | "source": [
296 | "answer.json()"
297 | ],
298 | "metadata": {
299 | "id": "meb0EHrc22kH"
300 | },
301 | "execution_count": null,
302 | "outputs": []
303 | },
304 | {
305 | "cell_type": "code",
306 | "source": [
307 | "print(answer.json()['choices'][0]['message']['content'])"
308 | ],
309 | "metadata": {
310 | "id": "go-gSwti3ItM"
311 | },
312 | "execution_count": null,
313 | "outputs": []
314 | },
315 | {
316 | "cell_type": "code",
317 | "source": [
318 | "from IPython.display import display, Markdown\n",
319 | "display(Markdown(answer.json()['choices'][0]['message']['content']))"
320 | ],
321 | "metadata": {
322 | "id": "tFVwwNeH3ilE"
323 | },
324 | "execution_count": null,
325 | "outputs": []
326 | },
327 | {
328 | "cell_type": "markdown",
329 | "source": [
330 | "## Создадим диалог"
331 | ],
332 | "metadata": {
333 | "id": "Za2yDvE3G2qz"
334 | }
335 | },
336 | {
337 | "cell_type": "code",
338 | "source": [
339 | "import requests\n",
340 | "import json\n",
341 | "\n",
342 | "def get_chat_completion(auth_token, user_message, conversation_history=None):\n",
343 | " \"\"\"\n",
344 | " Отправляет POST-запрос к API чата для получения ответа от модели GigaChat в рамках диалога.\n",
345 | "\n",
346 | " Параметры:\n",
347 | " - auth_token (str): Токен для авторизации в API.\n",
348 | " - user_message (str): Сообщение от пользователя, для которого нужно получить ответ.\n",
349 | " - conversation_history (list): История диалога в виде списка сообщений (опционально).\n",
350 | "\n",
351 | " Возвращает:\n",
352 | " - response (requests.Response): Ответ от API.\n",
353 | " - conversation_history (list): Обновленная история диалога.\n",
354 | " \"\"\"\n",
355 | " # URL API, к которому мы обращаемся\n",
356 | " url = \"https://gigachat.devices.sberbank.ru/api/v1/chat/completions\"\n",
357 | "\n",
358 | " # Если история диалога не предоставлена, инициализируем пустым списком\n",
359 | " if conversation_history is None:\n",
360 | " conversation_history = []\n",
361 | "\n",
362 | " # Добавляем сообщение пользователя в историю диалога\n",
363 | " conversation_history.append({\n",
364 | " \"role\": \"user\",\n",
365 | " \"content\": user_message\n",
366 | " })\n",
367 | "\n",
368 | " # Подготовка данных запроса в формате JSON\n",
369 | " payload = json.dumps({\n",
370 | " \"model\": \"GigaChat:latest\",\n",
371 | " \"messages\": conversation_history,\n",
372 | " \"temperature\": 1,\n",
373 | " \"top_p\": 0.1,\n",
374 | " \"n\": 1,\n",
375 | " \"stream\": False,\n",
376 | " \"max_tokens\": 512,\n",
377 | " \"repetition_penalty\": 1,\n",
378 | " \"update_interval\": 0\n",
379 | " })\n",
380 | "\n",
381 | " # Заголовки запроса\n",
382 | " headers = {\n",
383 | " 'Content-Type': 'application/json',\n",
384 | " 'Accept': 'application/json',\n",
385 | " 'Authorization': f'Bearer {auth_token}'\n",
386 | " }\n",
387 | "\n",
388 | " # Выполнение POST-запроса и возвращение ответа\n",
389 | " try:\n",
390 | " response = requests.post(url, headers=headers, data=payload, verify=False)\n",
391 | " response_data = response.json()\n",
392 | " print(response_data)\n",
393 | "\n",
394 | " # Добавляем ответ модели в историю диалога\n",
395 | " conversation_history.append({\n",
396 | " \"role\": \"assistant\",\n",
397 | " \"content\": response_data['choices'][0]['message']['content']\n",
398 | " })\n",
399 | "\n",
400 | " return response, conversation_history\n",
401 | " except requests.RequestException as e:\n",
402 | " # Обработка исключения в случае ошибки запроса\n",
403 | " print(f\"Произошла ошибка: {str(e)}\")\n",
404 | " return None, conversation_history\n",
405 | "\n"
406 | ],
407 | "metadata": {
408 | "id": "wizk0o-CEf9m"
409 | },
410 | "execution_count": 12,
411 | "outputs": []
412 | },
413 | {
414 | "cell_type": "code",
415 | "source": [
416 | "# Пример использования функции для диалога\n",
417 | "\n",
418 | "conversation_history = []\n",
419 | "\n",
420 | "# Пользователь отправляет первое сообщение\n",
421 | "response, conversation_history = get_chat_completion(giga_token, \"Привет, как дела?\", conversation_history)\n",
422 | "\n",
423 | "# Пользователь отправляет следующее сообщение, продолжая диалог\n",
424 | "response, conversation_history = get_chat_completion(giga_token, \"Что ты умеешь делать?\", conversation_history)\n"
425 | ],
426 | "metadata": {
427 | "id": "sZQpjXYBs6E9"
428 | },
429 | "execution_count": null,
430 | "outputs": []
431 | },
432 | {
433 | "cell_type": "code",
434 | "source": [
435 | "conversation_history"
436 | ],
437 | "metadata": {
438 | "id": "YG6Rz4peKMJn"
439 | },
440 | "execution_count": null,
441 | "outputs": []
442 | },
443 | {
444 | "cell_type": "markdown",
445 | "source": [
446 | "## Добавим системный промпт\n",
447 | "Системный промпт определяет роль, задавать контект и особенности общения бота с пользователем."
448 | ],
449 | "metadata": {
450 | "id": "8A5ZMbPYVh2w"
451 | }
452 | },
453 | {
454 | "cell_type": "code",
455 | "source": [
456 | "conversation_history = [{\n",
457 | " 'role': 'system',\n",
458 | " 'content': 'Отвечай как бывалый пират. Пусть тебя зовут Генри Морган.'\n",
459 | "\n",
460 | "}\n",
461 | "\n",
462 | "]"
463 | ],
464 | "metadata": {
465 | "id": "6INL_XYbVhHI"
466 | },
467 | "execution_count": 15,
468 | "outputs": []
469 | },
470 | {
471 | "cell_type": "code",
472 | "source": [
473 | "response, conversation_history = get_chat_completion(giga_token, 'Привет, друг!', conversation_history)"
474 | ],
475 | "metadata": {
476 | "id": "IuXqi4FbXvUz"
477 | },
478 | "execution_count": null,
479 | "outputs": []
480 | },
481 | {
482 | "cell_type": "code",
483 | "source": [
484 | "response.json()['choices'][0]['message']['content']"
485 | ],
486 | "metadata": {
487 | "id": "jYnW5lZJtRRE"
488 | },
489 | "execution_count": null,
490 | "outputs": []
491 | },
492 | {
493 | "cell_type": "markdown",
494 | "source": [
495 | "## Генерация картинок Кандинским\n",
496 | "[Документация](https://developers.sber.ru/docs/ru/gigachat/api/reference/rest/get-file-id)\n",
497 | "\n",
498 | "Делаем запрос на генерацию прямо в GigaChat"
499 | ],
500 | "metadata": {
501 | "id": "4pjQtWaOL_CF"
502 | }
503 | },
504 | {
505 | "cell_type": "code",
506 | "source": [
507 | "import requests\n",
508 | "import json\n",
509 | "\n",
510 | "def send_chat_request(giga_token, user_message):\n",
511 | " \"\"\"\n",
512 | " Отправляет POST-запрос к API GigaChat для получения ответа от модели чата.\n",
513 | "\n",
514 | " Параметры:\n",
515 | " - giga_token (str): Токен авторизации для доступа к API GigaChat.\n",
516 | " - user_message (str): Сообщение пользователя, которое будет обработано моделью GigaChat.\n",
517 | "\n",
518 | " Возвращает:\n",
519 | " - str: Строка сгенерированного ответа GigaChat с тэгом img\n",
520 | " \"\"\"\n",
521 | " # URL API для отправки запросов к GigaChat\n",
522 | " url = \"https://gigachat.devices.sberbank.ru/api/v1/chat/completions\"\n",
523 | "\n",
524 | " # Заголовки для HTTP-запроса\n",
525 | " headers = {\n",
526 | " 'Content-Type': 'application/json', # Указываем, что отправляемые данные в формате JSON\n",
527 | " 'Authorization': f'Bearer {giga_token}', # Используем токен авторизации для доступа к API\n",
528 | " }\n",
529 | "\n",
530 | " # Данные для отправки в теле запроса\n",
531 | " payload = {\n",
532 | " \"model\": \"GigaChat:latest\", # Указываем, что хотим использовать последнюю версию модели GigaChat\n",
533 | " \"messages\": [\n",
534 | " {\n",
535 | " \"role\": \"user\", # Роль отправителя - пользователь\n",
536 | " \"content\": user_message # Сообщение от пользователя\n",
537 | " },\n",
538 | " ],\n",
539 | " \"temperature\": 0.7 # Устанавливаем температуру, чтобы управлять случайностью ответов\n",
540 | " }\n",
541 | "\n",
542 | " try:\n",
543 | " # Отправляем POST-запрос к API и получаем ответ\n",
544 | " response = requests.post(url, headers=headers, data=json.dumps(payload), verify=False)\n",
545 | " # Выводим текст ответа. В реальных условиях следует обрабатывать ответ и проверять статус коды.\n",
546 | " print(response.json())\n",
547 | " return response.json()[\"choices\"][0][\"message\"][\"content\"]\n",
548 | " except requests.RequestException as e:\n",
549 | " # В случае возникновения исключения в процессе выполнения запроса, выводим ошибку\n",
550 | " print(f\"Произошла ошибка: {str(e)}\")\n",
551 | " return None\n",
552 | "\n",
553 | "\n",
554 | "\n"
555 | ],
556 | "metadata": {
557 | "id": "km8eWEvzKOkz"
558 | },
559 | "execution_count": 22,
560 | "outputs": []
561 | },
562 | {
563 | "cell_type": "code",
564 | "source": [
565 | "user_message = \"Нарисуй фотореалистичное изображение антропоморфного робота с \\\n",
566 | "ноутбуком в руках\"\n",
567 | "response_img_tag = send_chat_request(giga_token, user_message)\n",
568 | "print(response_img_tag)"
569 | ],
570 | "metadata": {
571 | "id": "Hl_eXKXvvMaD"
572 | },
573 | "execution_count": null,
574 | "outputs": []
575 | },
576 | {
577 | "cell_type": "markdown",
578 | "source": [
579 | "Получаем само изображение и сохраняем его в файл"
580 | ],
581 | "metadata": {
582 | "id": "-obvskmd8v-w"
583 | }
584 | },
585 | {
586 | "cell_type": "code",
587 | "source": [
588 | "from bs4 import BeautifulSoup\n",
589 | "\n",
590 | "\n",
591 | "\n",
592 | "# Парсим HTML\n",
593 | "soup = BeautifulSoup(response_img_tag, 'html.parser')\n",
594 | "\n",
595 | "# Извлекаем значение атрибута `src`\n",
596 | "img_src = soup.img['src']\n",
597 | "\n",
598 | "print(img_src)"
599 | ],
600 | "metadata": {
601 | "id": "00rkAbJn8Tua"
602 | },
603 | "execution_count": null,
604 | "outputs": []
605 | },
606 | {
607 | "cell_type": "code",
608 | "source": [
609 | "import requests\n",
610 | "\n",
611 | "headers = {\n",
612 | " 'Content-Type': 'application/json',\n",
613 | " 'Authorization': f'Bearer {giga_token}',\n",
614 | "}\n",
615 | "\n",
616 | "response = requests.get(f'https://gigachat.devices.sberbank.ru/api/v1/files/{img_src}/content', headers=headers, verify=False)"
617 | ],
618 | "metadata": {
619 | "id": "0n4jcaJn9n-7"
620 | },
621 | "execution_count": null,
622 | "outputs": []
623 | },
624 | {
625 | "cell_type": "code",
626 | "source": [
627 | "with open('image.jpg', 'wb') as f:\n",
628 | " f.write(response.content)"
629 | ],
630 | "metadata": {
631 | "id": "mp4DRNxY902j"
632 | },
633 | "execution_count": 26,
634 | "outputs": []
635 | },
636 | {
637 | "cell_type": "code",
638 | "source": [],
639 | "metadata": {
640 | "id": "MHUEMF3O-KQT"
641 | },
642 | "execution_count": null,
643 | "outputs": []
644 | }
645 | ]
646 | }
--------------------------------------------------------------------------------