Milvus와 Towhee로 AI 챗봇을 구축하는 방법
Milvus는 오픈 소스 벡터 데이터베이스로, 효율적이고 확장 가능한 벡터 검색 기능이 필요한 모든 AI 애플리케이션을 위한 완벽한 백본이며, 챗봇의 데이터 관리를 위한 탁월한 선택지입니다. Towhee는 복잡한 ML 모델을 구현하고 오케스트레이션하는 과정을 단순화하는 머신 러닝 워크플로를 위한 떠오르는 프레임워크입니다. 또한 애플리케이션 개발을 관리하기 쉽고 이해하기 쉽게 만들어 줍니다.
이 튜토리얼에서는 Milvus와 Towhee를 사용하여 Python으로 간단한 AI 챗봇을 구축하는 방법을 배우게 됩니다. 비정형 데이터를 수집하고, 분석하고, 임베딩과 함께 저장하고, 쿼리를 처리하는 방법에 집중할 것입니다.
환경 설정하기
먼저, 챗봇을 실행하기 위한 Python 가상 환경을 만드세요.
다음은 Linux의 셸 세션입니다. 환경을 만들고, 활성화하며, pip를 최신 버전으로 업그레이드합니다.
[egoebelbecker@ares milvus_chatbot]$ python -m venv ./chatbot_venv
[egoebelbecker@ares milvus_chatbot]$ source chatbot_venv/bin/activate
(chatbot_venv) [egoebelbecker@ares milvus_chatbot]$ pip install --upgrade pip
Requirement already satisfied: pip in ./chatbot_venv/lib64/python3.11/site-packages (22.2.2)
Collecting pip
Using cached pip-23.1.2-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 22.2.2
Uninstalling pip-22.2.2:
Successfully uninstalled pip-22.2.2
Successfully installed pip-23.1.2
다음으로, 코드를 실행하는 데 필요한 패키지인 pandas, jupyter, langchain, towhee, unstructured, milvus, pymilvus, sentence_transformers 및 gradio를 설치하세요.
(chatbot_venv) [egoebelbecker@ares milvus_chatbot]$ pip install pandas jupyter langchain towhee unstructured milvus pymilvus sentence_transformers gradio
pandas 수집 중
https://files.pythonhosted.org/packages/d0/28/88b81881c056376254618fad622a5e94b5126db8c61157ea1910cd1c040a/pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata에서 pandas에 대한 의존성 정보 가져오는 중
캐시된 pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata 사용 중 (18 kB)
jupyter 수집 중
캐시된 jupyter-1.0.0-py2.py3-none-any.whl 사용 중 (2.7 kB)
(생략)
수집된 패키지 설치 중: webencodings, wcwidth, pytz, pure-eval, ptyprocess, pickleshare, json5, ipython-genutils, filetype, fastjsonschema, executing, backcall, zipp, XlsxWriter, xlrd, widgetsnbextension, websocket-client, webcolors, urllib3, uri-template, tzdata, typing-extensions, traitlets, tqdm, tornado, tinycss2, tenacity, tabulate, soupsieve, sniffio, six, send2trash, rpds-py, rfc3986-validator, rfc3986, regex, pyzmq, PyYAML, python-magic, python-json-logger, pypandoc, pygments, pycparser, psutil, prompt-toolkit, prometheus-client, platformdirs, pkginfo, pillow, pexpect, parso, pandocfilters, packaging, overrides, olefile, numpy, nest-asyncio, mypy-extensions, multidict, more-itertools, mistune, mdurl, markupsafe, markdown, lxml, jupyterlab-widgets, jupyterlab-pygments, jsonpointer, joblib, jeepney, idna, greenlet, frozenlist, fqdn, et-xmlfile, docutils, defusedxml, decorator, debugpy, click, charset-normalizer, chardet, certifi, babel, attrs, async-timeout, async-lru, yarl, typing-inspect, terminado, SQLAlchemy, rfc3339-validator, requests, referencing, qtpy, python-pptx, python-docx, python-dateutil, pydantic, pdf2image, openpyxl, numexpr, nltk, msg-parser, matplotlib-inline, marshmallow, markdown-it-py, jupyter-core, jinja2, jedi, jaraco.classes, importlib-metadata, comm, cffi, bleach, beautifulsoup4, asttokens, anyio, aiosignal, stack-data, rich, requests-toolbelt, readme-renderer, pandas, openapi-schema-pydantic, langsmith, jupyter-server-terminals, jupyter-client, jsonschema-specifications, dataclasses-json, cryptography, arrow, argon2-cffi-bindings, aiohttp, SecretStorage, pdfminer.six, langchain, jsonschema, isoduration, ipython, argon2-cffi, unstructured, nbformat, keyring, ipykernel, twine, qtconsole, nbclient, jupyter-events, jupyter-console, ipywidgets, towhee, nbconvert, jupyter-server, notebook-shim, jupyterlab-server, jupyter-lsp, jupyterlab, notebook, jupyter
성공적으로 설치됨 PyYAML-6.0.1 SQLAlchemy-2.0.19 SecretStorage-3.3.3 XlsxWriter-3.1.2 aiohttp-3.8.5 aiosignal-1.3.1 anyio-3.7.1 argon2-cffi-21.3.0 argon2-cffi-bindings-21.2.0 arrow-1.2.3 asttokens-2.2.1 async-lru-2.0.4 async-timeout-4.0.2 attrs-23.1.0 babel-2.12.1 backcall-0.2.0 beautifulsoup4-4.12.2 bleach-6.0.0 certifi-2023.7.22 cffi-1.15.1 chardet-5.1.0 charset-normalizer-3.2.0 click-8.1.6 comm-0.1.3 cryptography-41.0.2 dataclasses-json-0.5.14 debugpy-1.6.7 decorator-5.1.1 defusedxml-0.7.1 docutils-0.20.1 et-xmlfile-1.1.0 executing-1.2.0 fastjsonschema-2.18.0 filetype-1.2.0 fqdn-1.5.1 frozenlist-1.4.0 greenlet-2.0.2 idna-3.4 importlib-metadata-6.8.0 ipykernel-6.25.0 ipython-8.14.0 ipython-genutils-0.2.0 ipywidgets-8.0.7 isoduration-20.11.0 jaraco.classes-3.3.0 jedi-0.19.0 jeepney-0.8.0 jinja2-3.1.2 joblib-1.3.1 json5-0.9.14 jsonpointer-2.4 jsonschema-4.18.4 jsonschema-specifications-2023.7.1 jupyter-1.0.0 jupyter-client-8.3.0 jupyter-console-6.6.3 jupyter-core-5.3.1 jupyter-events-0.7.0 jupyter-lsp-2.2.0 jupyter-server-2.7.0 jupyter-server-terminals-0.4.4 jupyterlab-4.0.3 jupyterlab-pygments-0.2.2 jupyterlab-server-2.24.0 jupyterlab-widgets-3.0.8 keyring-24.2.0 langchain-0.0.248 langsmith-0.0.15 lxml-4.9.3 markdown-3.4.4 markdown-it-py-3.0.0 markupsafe-2.1.3 marshmallow-3.20.1 matplotlib-inline-0.1.6 mdurl-0.1.2 mistune-3.0.1 more-itertools-10.0.0 msg-parser-1.2.0 multidict-6.0.4 mypy-extensions-1.0.0 nbclient-0.8.0 nbconvert-7.7.3 nbformat-5.9.2 nest-asyncio-1.5.7 nltk-3.8.1 notebook-7.0.1 notebook-shim-0.2.3 numexpr-2.8.4 numpy-1.25.2 olefile-0.46 openapi-schema-pydantic-1.2.4 openpyxl-3.1.2 overrides-7.3.1 packaging-23.1 pandas-2.0.3 pandocfilters-1.5.0 parso-0.8.3 pdf2image-1.16.3 pdfminer.six-20221105 pexpect-4.8.0 pickleshare-0.7.5 pillow-10.0.0 pkginfo-1.9.6 platformdirs-3.10.0 prometheus-client-0.17.1 prompt-toolkit-3.0.39 psutil-5.9.5 ptyprocess-0.7.0 pure-eval-0.2.2 pycparser-2.21 pydantic-1.10.12 pygments-2.15.1 pypandoc-1.11 python-dateutil-2.8.2 python-docx-0.8.11 python-json-logger-2.0.7 python-magic-0.4.27 python-pptx-0.6.21 pytz-2023.3 pyzmq-25.1.0 qtconsole-5.4.3 qtpy-2.3.1 readme-renderer-40.0 referencing-0.30.0 regex-2023.6.3 requests-2.31.0 requests-toolbelt-1.0.0 rfc3339-validator-0.1.4 rfc3986-2.0.0 rfc3986-validator-0.1.1 rich-13.5.1 rpds-py-0.9.2 send2trash-1.8.2 six-1.16.0 sniffio-1.3.0 soupsieve-2.4.1 stack-data-0.6.2 tabulate-0.9.0 tenacity-8.2.2 terminado-0.17.1 tinycss2-1.2.1 tornado-6.3.2 towhee-1.1.1 tqdm-4.65.0 traitlets-5.9.0 twine-4.0.2 typing-extensions-4.7.1 typing-inspect-0.9.0 tzdata-2023.3 unstructured-0.8.7 uri-template-1.3.0 urllib3-2.0.4 wcwidth-0.2.6 webcolors-1.13 webencodings-0.5.1 websocket-client-1.6.1 widgetsnbextension-4.0.8 xlrd-2.0.1 yarl-1.9.2 zipp-3.16.2
(chatbot_venv) [egoebelbecker@ares milvus_chatbot]$
이 튜토리얼의 코드가 포함된 Jupyter 노트북은 여기에서 찾을 수 있습니다. 다운로드하고 Jupyter를 시작한 다음 노트북을 로드하세요:
chatbot_venv) [egoebelbecker@ares milvus_chatbot]$ jupyter notebook milvus_chatbot.ipynb
[I 2023-07-31 11:29:01.748 ServerApp] Package notebook took 0.0000s to import
[I 2023-07-31 11:29:01.759 ServerApp] Package jupyter_lsp took 0.0108s to import
[W 2023-07-31 11:29:01.759 ServerApp] A `_jupyter_server_extension_points` function was not found in jupyter_lsp. Instead, a `_jupyter_server_extension_paths` function was found and will be used for now. This function name will be deprecated in future releases of Jupyter Server.
[I 2023-07-31 11:29:01.764 ServerApp] Package jupyter_server_terminals took 0.0045s to import
[I 2023-07-31 11:29:01.765 ServerApp] Package jupyterlab took 0.0000s to import
[I 2023-07-31 11:29:02.124 ServerApp] Package notebook_shim took 0.0000s to import
챗봇 만들기
이제 챗봇 작업을 시작해 보겠습니다.
문서 저장소
봇은 문서 청크와 Towhee가 여기서 추출한 임베딩을 저장해야 합니다. 이를 위해 Milvus를 사용하게 됩니다. 위에서 이미 milvus 라이브러리와 함께 Milvus의 경량 버전인 Milvus Lite를 설치했습니다.
명령줄에서 서버를 실행할 수 있습니다:
(chatbot_venv) [egoebelbecker@ares milvus_chatbot]$ milvus-server
__ _________ _ ____ ______
/ |/ / _/ /| | / / / / / __/
/ /|_/ // // /_| |/ / /_/ /\ \
/_/ /_/___/____/___/\____/___/ {Lite}
Welcome to use Milvus!
Version: v2.2.12-lite
Process: 139309
Started: 2023-07-31 12:43:43
Config: /home/egoebelbecker/.milvus.io/milvus-server/2.2.12/configs/milvus.yaml
Logs: /home/egoebelbecker/.milvus.io/milvus-server/2.2.12/logs
Ctrl+C to exit …
또는 노트북에 표시된 것처럼 애플리케이션 코드의 일부로 실행할 수 있습니다:
from milvus import default_server
# Start Milvus service
default_server.start()
# # Stop Milvus service
# default_server.stop()
애플리케이션 변수 설정 및 OpenAI API 키 가져오기
다음으로 몇 가지 변수를 설정하고 남아 있는 SQLite 파일을 정리합니다. 아래에서 채팅 기록에 SQLite를 사용하겠습니다.
- MILVUS_URI - Milvus 서버의 연결 정보입니다. 호스트와 포트로 파싱됩니다.
- MILVUS_HOST - Milvus가 실행 중인 호스트입니다.
- MILVUS_PORT - 서버가 수신 대기하는 포트입니다.
- DROP_EXIST - 시작 시 기존 Milvus 컬렉션을 삭제합니다.
- EMBED_MODEL - 코드가 임베딩을 생성하는 데 사용할 sentence_transformers 모델입니다
- COLLECTION_NAME - 데이터와 임베딩을 위한 Milvus 컬렉션 이름입니다
- DIM - 모델이 각 텍스트 조각에 대해 생성하는 임베딩의 차원입니다
- OPENAI_API_KEY - LLM API용 키입니다
import getpass
import os
MILVUS_URI = 'http://localhost:19530'
[MILVUS_HOST, MILVUS_PORT] = MILVUS_URI.split('://')[1].split(':')
DROP_EXIST = True
EMBED_MODEL = 'all-mpnet-base-v2'
COLLECTION_NAME = 'chatbot_demo'
DIM = 768
OPENAI_API_KEY = getpass.getpass('Enter your OpenAI API key: ')
if os.path.exists('./sqlite.db'):
os.remove('./sqlite.db')
이 코드를 실행하여 변수를 정의하고 API 키 프롬프트에 응답하세요.
샘플 파이프라인
다음으로, 데이터를 다운로드하고 Milvus에 저장할 차례입니다. 하지만 그 전에 비정형 데이터를 다운로드하고 처리하기 위한 샘플 파이프라인을 살펴보겠습니다.
이 예제에서는 Towhee 문서 페이지를 사용합니다. 코드가 서로 다른 데이터 세트를 어떻게 처리하는지 확인하기 위해 다른 사이트를 시도해 볼 수 있습니다.
이 코드는 Towhee 파이프라인을 사용합니다:
- input - 전달된 소스로 새 파이프라인을 시작합니다
- map - ops.text_loader()를 사용하여 URL을 가져오고 'doc'에 매핑합니다
- flat_map - ops.text_splitter()를 사용하여 문서를 저장을 위한 "청크"로 처리합니다
- output - 파이프라인을 닫고 사용할 준비를 합니다
이 파이프라인을 DataCollection에 전달하여 어떻게 작동하는지 확인하세요.
from towhee import pipe, ops, DataCollection
pipe_load = (
pipe.input('source')
.map('source', 'doc', ops.text_loader())
.flat_map('doc', 'doc_chunks', ops.text_splitter(chunk_size=300))
.output('source', 'doc_chunks')
)
DataCollection(pipe_load('https://towhee.io')).show()
다음은 show()의 출력입니다:
파이프라인은 문서에서 다섯 개의 청크를 생성했습니다.
샘플 임베딩 파이프라인
파이프라인은 데이터를 검색하고 청크를 생성했습니다. 임베딩도 생성해야 합니다. 또 다른 샘플 파이프라인을 살펴보겠습니다.
이 파이프라인은 map()을 사용하여 각 청크에 ops.sentence_embedding.sbert()를 실행합니다. 이 예제에서는 단일 텍스트 블록을 전달합니다.
pipe_embed = (
pipe.input('doc_chunk')
.map('doc_chunk', 'vec', ops.sentence_embedding.sbert(model_name=EMBED_MODEL))
.map('vec', 'vec', ops.np_normalize())
.output('doc_chunk', 'vec')
)
text = '''SOTA Models
We provide 700+ pre-trained embedding models spanning 5 fields (CV, NLP, Multimodal, Audio, Medical), 15 tasks, and 140+ model architectures.
These include BERT, CLIP, ViT, SwinTransformer, data2vec, etc.
'''
DataCollection(pipe_embed(text)).show()
이 코드를 실행하여 파이프라인이 단일 텍스트 블록을 처리하는 방식을 확인하세요.
Milvus 준비
이제 데이터를 보관할 컬렉션이 필요합니다. 이 코드는 create_collection()을 정의하며, MILVUS_HOST와 MILVUS_PORT를 사용하여 Milvus에 연결하고, 지정된 이름의 기존 컬렉션이 있으면 삭제한 뒤, 다음 스키마로 새 컬렉션을 생성합니다:
- id - 정수 식별자
- embedding - 임베딩을 위한 float 벡터
- text - 임베딩에 해당하는 텍스트
from pymilvus import (
connections, utility, Collection,
CollectionSchema, FieldSchema, DataType
)
def create_collection(collection_name):
connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)
has_collection = utility.has_collection(collection_name)
if has_collection:
collection = Collection(collection_name)
if DROP_EXIST:
collection.drop()
else:
return collection
# Create collection
fields = [
FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, dim=DIM),
FieldSchema(name='text', dtype=DataType.VARCHAR, max_length=500)
]
schema = CollectionSchema(
fields=fields,
description="Towhee demo",
enable_dynamic_field=True
)
collection = Collection(name=collection_name, schema=schema)
index_params = {
'metric_type': 'IP',
'index_type': 'IVF_FLAT',
'params': {'nlist': 1024}
}
collection.create_index(
field_name='embedding',
index_params=index_params
)
return collection
삽입 파이프라인
이제 입력 텍스트를 처리하고 Milvus에 삽입할 시간입니다. 위에서 배운 내용을 하나로 결합한 파이프라인부터 시작해 보겠습니다.
이 함수는 다음을 수행합니다:
- 새 컬렉션 생성
- 데이터 검색
- 청크로 분할
- EMBED_MODEL을 사용하여 임베딩 생성
- 텍스트와 임베딩을 Milvus에 삽입
load_data = (
pipe.input('collection_name', 'source')
.map('collection_name', 'collection', create_collection)
.map('source', 'doc', ops.text_loader())
.flat_map('doc', 'doc_chunk', ops.text_splitter(chunk_size=300))
.map('doc_chunk', 'vec', ops.sentence_embedding.sbert(model_name=EMBED_MODEL))
.map('vec', 'vec', ops.np_normalize())
.map(('collection_name', 'vec', 'doc_chunk'), 'mr',
ops.ann_insert.osschat_milvus(host=MILVUS_HOST, port=MILVUS_PORT))
.output('mr')
)
다음은 실제 동작 예시입니다. Frodo Baggins에 대한 Wikipedia 페이지에 대해 실행해 보세요.
project_name = 'towhee_demo'
data_source = 'https://en.wikipedia.org/wiki/Frodo_Baggins'
mr = load_data(COLLECTION_NAME, data_source)
print('Doc chunks inserted:', len(mr.to_list()))
임베딩과 함께 408개의 청크를 삽입합니다:
2023-07-31 16:50:53,369 - 139993906521792 - node.py-node:167 - INFO: Begin to run Node-_input
2023-07-31 16:50:53,371 - 139993906521792 - node.py-node:167 - INFO: Begin to run Node-create_collection-0
2023-07-31 16:50:53,373 - 139993881343680 - node.py-node:167 - INFO: Begin to run Node-text-loader-1
2023-07-31 16:50:53,374 - 139993898129088 - node.py-node:167 - INFO: Begin to run Node-text-splitter-2
2023-07-31 16:50:53,376 - 139993872950976 - node.py-node:167 - INFO: Begin to run Node-sentence-embedding/sbert-3
2023-07-31 16:50:53,377 - 139993385268928 - node.py-node:167 - INFO: Begin to run Node-np-normalize-4
2023-07-31 16:50:53,378 - 139993376876224 - node.py-node:167 - INFO: Begin to run Node-ann-insert/osschat-milvus-5
2023-07-31 16:50:53,379 - 139993368483520 - node.py-node:167 - INFO: Begin to run Node-_output
(snip)
Categories:
2023-07-31 18:07:53,530 - 140552729257664 - logger.py-logger:14 - DETAIL: Skipping sentence because does not exceed 5 word tokens
Categories
2023-07-31 18:07:53,532 - 140552729257664 - logger.py-logger:14 - DETAIL: Skipping sentence because does not exceed 3 word tokens
Hidden categories
2023-07-31 18:07:53,533 - 140552729257664 - logger.py-logger:14 - DETAIL: Skipping sentence because does not exceed 3 word tokens
Hidden categories
2023-07-31 18:07:53,533 - 140552729257664 - logger.py-logger:14 - DETAIL: Not narrative. Text does not contain a verb:
Hidden categories:
2023-07-31 18:07:53,534 - 140552729257664 - logger.py-logger:14 - DETAIL: Skipping sentence because does not exceed 5 word tokens
Hidden categories
Doc chunks inserted: 408
지식 베이스 검색
이제 임베딩과 텍스트가 Milvus에 저장되었으므로 검색할 수 있습니다.
이 함수는 쿼리 파이프라인을 생성합니다. 가장 중요한 단계는 다음입니다:
ops.ann_search.osschat_milvus(host=MILVUS_HOST, port=MILVUS_PORT,
**{'metric_type': 'IP', 'limit': 3, 'output_fields': ['text']}))
osschat_milvus는 제출된 텍스트와 일치하는 임베딩을 검색합니다.
전체 파이프라인은 다음과 같습니다:
pipe_search = (
pipe.input('collection_name', 'query')
.map('query', 'query_vec', ops.sentence_embedding.sbert(model_name=EMBED_MODEL))
.map('query_vec', 'query_vec', ops.np_normalize())
.map(('collection_name', 'query_vec'), 'search_res',
ops.ann_search.osschat_milvus(host=MILVUS_HOST, port=MILVUS_PORT,
**{'metric_type': 'IP', 'limit': 3, 'output_fields': ['text']}))
.flat_map('search_res', ('id', 'score', 'text'), lambda x: (x[0], x[1], x[2]))
.output('query', 'text', 'score')
)
시도해 보세요:
query = 'Who is Frodo Baggins?'
DataCollection(pipe_search(project_name, query)).show()
모델은 매우 유사하게 일치하는 세 개의 노드를 잘 가져옵니다:
LLM 추가
이제 사용자가 챗봇과 대화할 수 있도록 대형 언어 모델(LLM)을 추가할 차례입니다. 이 예제에서는 ChatGPT와 OpenAI API를 사용합니다.
채팅 기록
LLM에서 더 나은 결과를 얻으려면 채팅 기록을 저장하고 쿼리와 함께 제공해야 합니다. 이 단계에서는 SQLite를 사용합니다.
기록을 가져오는 함수는 다음과 같습니다:
pipe_get_history = (
pipe.input('collection_name', 'session')
.map(('collection_name', 'session'), 'history', ops.chat_message_histories.sql(method='get'))
.output('collection_name', 'session', 'history')
)
저장하는 함수는 다음과 같습니다:
pipe_add_history = (
pipe.input('collection_name', 'session', 'question', 'answer')
.map(('collection_name', 'session', 'question', 'answer'), 'history', ops.chat_message_histories.sql(method='add'))
.output('history')
)
LLM 쿼리 파이프라인
이제 ChatGPT에 쿼리를 제출할 파이프라인이 필요합니다.
이 파이프라인은:
- 사용자의 쿼리를 사용하여 Milvus를 검색합니다
- 현재 채팅 기록을 수집합니다
- 쿼리, Milvus 검색 결과, 채팅 기록을 ChatGPT에 제출합니다
- ChatGPT 결과를 채팅 기록에 추가합니다
- 결과를 호출자에게 반환합니다
chat = (
pipe.input('collection_name', 'query', 'session')
.map('query', 'query_vec', ops.sentence_embedding.sbert(model_name=EMBED_MODEL))
.map('query_vec', 'query_vec', ops.np_normalize())
.map(('collection_name', 'query_vec'), 'search_res',
ops.ann_search.osschat_milvus(host=MILVUS_HOST,
port=MILVUS_PORT,
**{'metric_type': 'IP', 'limit': 3, 'output_fields': ['text']}))
.map('search_res', 'knowledge', lambda y: [x[2] for x in y])
.map(('collection_name', 'session'), 'history', ops.chat_message_histories.sql(method='get'))
.map(('query', 'knowledge', 'history'), 'messages', ops.prompt.question_answer())
.map('messages', 'answer', ops.LLM.OpenAI(api_key=OPENAI_API_KEY,
model_name='gpt-3.5-turbo',
temperature=0.8))
.map(('collection_name', 'session', 'query', 'answer'), 'new_history', ops.chat_message_histories.sql(method='add'))
.output('query', 'history', 'answer', )
)
GUI에 연결하기 전에 이 파이프라인을 테스트해 보겠습니다:
new_query = 'Where did Frodo take the ring?'
DataCollection(chat(COLLECTION_NAME, new_query, session_id)).show()
다음은 노트북의 출력과 결과입니다:
파이프라인이 작동합니다. 이제 Gradio 인터페이스를 구성해 보겠습니다.
Gradio GUI
먼저, 세션 식별자를 생성하고 인터페이스의 쿼리에 응답하는 함수가 필요합니다.
이 함수들은 UUID를 사용하여 세션 ID를 생성하고, 쿼리 파이프라인을 위한 세션과 쿼리를 받습니다.
import uuid
import io
def create_session_id():
uid = str(uuid.uuid4())
suid = ''.join(uid.split('-'))
return 'sess_' + suid
def respond(session, query):
res = chat(COLLECTION_NAME, query, session).get_dict()
answer = res['answer']
response = res['history']
response.append((query, answer))
return response
다음으로, Gradio 인터페이스는 이러한 함수를 사용하여 챗봇을 빌드합니다.
Blocks API를 사용하여 ChatBot 인터페이스를 생성합니다. Send Message 버튼은 respond 함수를 사용하여 ChatGPT에 요청을 보냅니다.
import gradio as gr
with gr.Blocks() as demo:
session_id = gr.State(create_session_id)
with gr.Row():
with gr.Column(scale=2):
gr.Markdown('''## Chat''')
conversation = gr.Chatbot(label='conversation').style(height=300)
question = gr.Textbox(label='question', value=None)
send_btn = gr.Button('Send Message')
send_btn.click(
fn=respond,
inputs=[
session_id,
question
],
outputs=conversation,
)
demo.launch(server_name='127.0.0.1', server_port=8902)
다음과 같습니다:
이제 Milvus를 사용하는 LLM 기반 지능형 챗봇이 생겼습니다!
요약
이 게시물에서는 비정형 데이터를 수집하고, 임베딩을 위해 처리하며, 해당 임베딩을 Milvus에 저장하는 Towhee 파이프라인을 만들었습니다. 그런 다음 채팅 기능을 위한 쿼리 파이프라인을 만들고 챗봇을 LLM과 연결했습니다. 마지막으로 지능형 챗봇을 얻었습니다.
이 튜토리얼은 Milvus로 애플리케이션을 구축하는 것이 얼마나 쉬운지 보여줍니다. Milvus는 애플리케이션, 특히 머신 러닝과 인공 지능에 의존하는 애플리케이션에 통합될 때 수많은 장점을 제공합니다. 챗봇, 추천 시스템, 이미지 또는 텍스트 인식과 같은 애플리케이션에 중요한 매우 효율적이고 확장 가능하며 신뢰할 수 있는 벡터 유사도 검색 및 분석 기능을 제공합니다.
이 글은 Eric Goebelbecker가 작성했습니다. Eric은 뉴욕시 금융 시장에서 25년간 일하며 시장 데이터 및 금융 정보 교환(FIX) 프로토콜 네트워크를 위한 인프라를 개발해 왔습니다. 그는 팀을 효과적으로 만드는 요소(또는 그다지 효과적이지 않게 만드는 요소)에 대해 이야기하는 것을 좋아합니다!
계속 읽기

Zilliz Cloud BYOC Now Available Across AWS, GCP, and Azure
Zilliz Cloud BYOC is now generally available on all three major clouds. Deploy fully managed vector search in your own AWS, GCP, or Azure account — your data never leaves your VPC.

AI Agents Are Quietly Transforming E-Commerce — Here’s How
Discover how AI agents transform e-commerce with autonomous decision-making, enhanced product discovery, and vector search capabilities for today's retailers.

How to Build RAG with Milvus, QwQ-32B and Ollama
Hands-on tutorial on how to create a streamlined, powerful RAG pipeline that balances efficiency, accuracy, and scalability using the QwQ-32B and Milvus.



