diff --git a/README.md b/README.md index 39de539..67e7742 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,80 @@ -# openai +# ChatBot with OpenAI + +*author: Jael, Yuchen* + +
+ +## Description + +A chat-bot operator returns answer in text given input text. +This operator is implemented with GPT models from [OpenAI](https://platform.openai.com/docs/guides/embeddings). +Please note you need an [OpenAI API key](https://platform.openai.com/account/api-keys) to access OpenAI. + +
+ +## Code Example + +Use the default model to answer the question "Who are you?". + +*Write a pipeline with explicit inputs/outputs name specifications:* + +```python +from towhee.dc2 import pipe, ops, DataCollection + +p = ( + pipe.input('question') + .map('question', 'answer', + ops.chatbot.openai(api_key=OPENAI_API_KEY)) + .output('question', 'answer') +) + +DataCollection(p('Who are you?')).show() +``` + +
+ +## Factory Constructor + +Create the operator via the following factory method: + +***chatbot.openai(model_name: str, api_key: str)*** + +**Parameters:** + +***model_name***: *str* + +The model name in string, defaults to 'text-davinci-003'. Supported model names: +- text-davinci-003 + +***api_key***: *str=None* + +The OpenAI API key in string, defaults to None. + +
+ +## Interface + +The operator takes a piece of text in string as input. +It returns a text emabedding in numpy.ndarray. + +***\_\_call\_\_(txt)*** + +**Parameters:** + +***text***: *str* + +​ The text in string. + +**Returns**: + +*answer: str* + +​ The answer in string generated by model. + +
+ +***supported_model_names()*** + +Get a list of supported model names. + diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e79c5ce --- /dev/null +++ b/__init__.py @@ -0,0 +1,5 @@ +from .openai_qa import OpenaiQA + + +def openai(*args, **kwargs): + return OpenaiQA(*args, **kwargs) diff --git a/openai_qa.py b/openai_qa.py new file mode 100644 index 0000000..3b9826c --- /dev/null +++ b/openai_qa.py @@ -0,0 +1,51 @@ +# Copyright 2021 Zilliz. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from openai import Embedding +from tenacity import retry, stop_after_attempt, wait_random_exponential +from towhee.operator.base import PyOperator + + +class OpenaiEmbeding(PyOperator): + def __init__(self, model_name='text-davinci-003', api_key=None): + self._engine = model_name + self._api_key = api_key + + # @retry(wait=wait_random_exponential(min=1, max=20), stop=stop_after_attempt(6)) + def _call(self, prompt): + prompt = prompt.replace("\n", " ") + response = openai.Completion.create( + api_key=self._api_key, + engine=self._engine, + prompt=prompt, + max_tokens=1024, + n=1, + stop=None, + temperature=0.7, + ) + answer = response.choices[0].text.strip() + return answer + + def __call__(self, prompt): + return self._call(prompt) + + @staticmethod + def supported_model_names(): + model_list = [ + 'text-davinci-003', + ] + model_list.sort() + return model_list +