From 8a17099dd2948d6d5d6e6018ddff2585337efb80 Mon Sep 17 00:00:00 2001 From: Fangyin Cheng Date: Fri, 22 Mar 2024 15:36:57 +0800 Subject: [PATCH] feat(rag): Support RAG SDK (#1322) --- .mypy.ini | 3 + CONTRIBUTING.md | 106 ++++-- Makefile | 5 +- dbgpt/_version.py | 2 +- .../app/initialization/embedding_component.py | 6 +- dbgpt/app/knowledge/service.py | 5 +- dbgpt/core/awel/dag/base.py | 43 ++- dbgpt/core/awel/operators/common_operator.py | 8 +- dbgpt/datasource/__init__.py | 13 +- .../operators/datasource_operator.py | 6 +- dbgpt/datasource/rdbms/base.py | 2 +- .../embeddings_loader.py} | 51 ++- .../model/cluster/worker/embedding_worker.py | 34 +- dbgpt/rag/__init__.py | 10 + dbgpt/rag/assembler/__init__.py | 16 + dbgpt/{serve => }/rag/assembler/base.py | 25 +- dbgpt/rag/assembler/db_schema.py | 135 +++++++ dbgpt/{serve => }/rag/assembler/embedding.py | 80 ++-- dbgpt/{serve => }/rag/assembler/summary.py | 45 ++- .../assembler/tests}/__init__.py | 0 .../tests/test_db_struct_assembler.py | 4 +- .../tests/test_embedding_assembler.py | 16 +- dbgpt/rag/embedding/__init__.py | 7 +- dbgpt/rag/embedding/_wrapped.py | 32 ++ dbgpt/rag/embedding/embedding_factory.py | 188 ++++++++- dbgpt/rag/knowledge/__init__.py | 51 ++- dbgpt/rag/knowledge/base.py | 1 + dbgpt/rag/knowledge/datasource.py | 57 +++ dbgpt/rag/knowledge/factory.py | 1 + dbgpt/rag/operators/__init__.py | 12 +- .../base.py => rag/operators/assembler.py} | 3 +- dbgpt/rag/operators/datasource.py | 14 +- dbgpt/rag/operators/db_schema.py | 58 ++- dbgpt/rag/operators/embedding.py | 44 ++- dbgpt/rag/operators/knowledge.py | 8 +- dbgpt/rag/operators/rerank.py | 4 +- dbgpt/rag/operators/schema_linking.py | 8 +- dbgpt/rag/operators/summary.py | 4 +- dbgpt/rag/retriever/db_schema.py | 22 +- dbgpt/rag/retriever/tests/test_db_struct.py | 2 +- dbgpt/rag/schemalinker/schema_linking.py | 10 +- dbgpt/rag/summary/db_summary_client.py | 4 +- dbgpt/rag/summary/rdbms_db_summary.py | 10 +- dbgpt/serve/rag/assembler/db_schema.py | 153 -------- dbgpt/serve/rag/operators/db_schema.py | 36 -- dbgpt/serve/rag/operators/embedding.py | 44 --- .../tests => retriever}/__init__.py | 0 dbgpt/serve/rag/service/service.py | 2 +- dbgpt/storage/vector_store/chroma_store.py | 3 +- dbgpt/util/chat_util.py | 10 +- dbgpt/util/parameter_utils.py | 2 +- docs/docs/api/introduction.md | 6 + .../getting_started/1.1_hello_world.md | 2 +- .../docs/awel/cookbook/first_rag_with_awel.md | 358 ++++++++++++++++++ docs/sidebars.js | 4 + .../awel/cookbook/first_rag_knowledge_dag.png | Bin 0 -> 88387 bytes .../img/awel/cookbook/first_rag_rag_dag.png | Bin 0 -> 189669 bytes .../simple_nl_schema_sql_chart_example.py | 14 +- examples/awel/simple_rag_rewrite_example.py | 2 +- examples/awel/simple_rag_summary_example.py | 5 +- examples/rag/db_schema_rag_example.py | 4 +- examples/rag/embedding_rag_example.py | 4 +- examples/rag/rag_embedding_api_example.py | 4 +- examples/rag/retriever_evaluation_example.py | 4 +- .../rag/simple_dbschema_retriever_example.py | 16 +- examples/rag/simple_rag_embedding_example.py | 5 +- examples/rag/summary_extractor_example.py | 8 +- examples/sdk/simple_sdk_llm_sql_example.py | 4 +- setup.py | 45 ++- 69 files changed, 1332 insertions(+), 558 deletions(-) rename dbgpt/model/{cluster/embedding/loader.py => adapter/embeddings_loader.py} (53%) create mode 100644 dbgpt/rag/assembler/__init__.py rename dbgpt/{serve => }/rag/assembler/base.py (81%) create mode 100644 dbgpt/rag/assembler/db_schema.py rename dbgpt/{serve => }/rag/assembler/embedding.py (59%) rename dbgpt/{serve => }/rag/assembler/summary.py (78%) rename dbgpt/{serve/rag/assembler => rag/assembler/tests}/__init__.py (100%) rename dbgpt/{serve => }/rag/assembler/tests/test_db_struct_assembler.py (94%) rename dbgpt/{serve => }/rag/assembler/tests/test_embedding_assembler.py (82%) create mode 100644 dbgpt/rag/embedding/_wrapped.py create mode 100644 dbgpt/rag/knowledge/datasource.py rename dbgpt/{serve/rag/operators/base.py => rag/operators/assembler.py} (87%) delete mode 100644 dbgpt/serve/rag/assembler/db_schema.py delete mode 100644 dbgpt/serve/rag/operators/db_schema.py delete mode 100644 dbgpt/serve/rag/operators/embedding.py rename dbgpt/serve/rag/{assembler/tests => retriever}/__init__.py (100%) create mode 100644 docs/docs/awel/cookbook/first_rag_with_awel.md create mode 100644 docs/static/img/awel/cookbook/first_rag_knowledge_dag.png create mode 100644 docs/static/img/awel/cookbook/first_rag_rag_dag.png diff --git a/.mypy.ini b/.mypy.ini index 5fb04d0d7..a1a204741 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -11,6 +11,9 @@ follow_imports = skip [mypy-dbgpt.serve.*] follow_imports = skip +[mypy-dbgpt.model.*] +follow_imports = skip + [mypy-dbgpt.util.*] follow_imports = skip diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 31014e1d1..e5799f43d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,11 @@ +# Contribution -To contribute to this GitHub project, you can follow these steps: +First of all, thank you for considering contributing to this project. +It's people like you that make it a reality for the community. There are many ways to contribute, and we appreciate all of them. + +This guide will help you get started with contributing to this project. + +## Fork The Repository 1. Fork the repository you want to contribute to by clicking the "Fork" button on the project page. @@ -8,71 +14,107 @@ To contribute to this GitHub project, you can follow these steps: ``` git clone https://github.com//DB-GPT ``` +Please replace `` with your GitHub username. -3. Install the project requirements + +## Create A New Development Environment + +1. Create a new virtual environment using the following command: ``` +# Make sure python >= 3.10 +conda create -n dbgpt_env python=3.10 +conda activate dbgpt_env +``` + +2. Change to the project directory using the following command: +``` +cd DB-GPT +``` + +3. Install the project from the local source using the following command: +``` +# it will take some minutes pip install -e ".[default]" ``` -4. Install pre-commit hooks +4. Install development requirements +``` +pip install -r requirements/dev-requirements.txt +pip install -r requirements/lint-requirements.txt +``` + +5. Install pre-commit hooks ``` pre-commit install ``` -5. Create a new branch for your changes using the following command: +6. Install `make` command +The `make` command has been installed by default on most Unix-based systems. If you not +have it, you can install it by searching on the internet. + +## New Branch And Make Changes + +1. Create a new branch for your changes using the following command: ``` -git checkout -b "branch-name" +git checkout -b ``` +Please replace `` with a descriptive name for your branch. -6. Make your changes to the code or documentation. +2. Make your changes to the code or documentation. -- Example: Improve User Interface or Add Documentation. +3. Add tests for your changes if necessary. -7. Format the code using the following command: +4. Format your code using the following command: ``` make fmt ``` -8. Add the changes to the staging area using the following command: +5. Run the tests using the following command: ``` -git add . +make test ``` -9. Make sure the tests pass and your code lints using the following command: +6. Check types using the following command: ``` -make pre-commit +make mypy ``` -10. Commit the changes with a meaningful commit message using the following command: +7. Check lint using the following command: +``` +make fmt-check +``` + +8. If all checks pass, you can add and commit your changes using the following commands: +``` +git add xxxx +``` +make sure to replace `xxxx` with the files you want to commit. + +then commit your changes using the following command: ``` git commit -m "your commit message" ``` -11. Push the changes to your forked repository using the following command: +Please replace `your commit message` with a meaningful commit message. + +It will take some time to get used to the process, but it's worth it. And it will run +all git hooks and checks before you commit. If it fails, you need to fix the issues +then re-commit it. + +9. Push the changes to your forked repository using the following command: ``` -git push origin branch-name +git push origin ``` -12. Go to the GitHub website and navigate to your forked repository. -13. Click the "New pull request" button. +## Create A Pull Request -14. Select the branch you just pushed to and the branch you want to merge into on the original repository. +1. Go to the GitHub website and navigate to your forked repository. -15. Add a description of your changes and click the "Create pull request" button. +2. Click the "New pull request" button. -16. Wait for the project maintainer to review your changes and provide feedback. +3. Select the branch you just pushed to and the branch you want to merge into on the original repository. +Write necessary information about your changes and click "Create pull request". -17. Make any necessary changes based on feedback and repeat steps 5-12 until your changes are accepted and merged into the main project. +4. Wait for the project maintainer to review your changes and provide feedback. -18. Once your changes are merged, you can update your forked repository and local copy of the repository with the following commands: - -``` -git fetch upstream -git checkout master -git merge upstream/master -``` -Finally, delete the branch you created with the following command: -``` -git branch -d branch-name -``` That's it you made it 🐣⭐⭐ diff --git a/Makefile b/Makefile index a0b2bd217..58229a709 100644 --- a/Makefile +++ b/Makefile @@ -26,8 +26,7 @@ testenv: $(VENV)/.testenv $(VENV)/.testenv: $(VENV)/bin/activate # $(VENV_BIN)/pip install -e ".[framework]" - # $(VENV_BIN)/pip install -e ".[knowledge]" - # the openai optional dependency is include framework and knowledge dependencies + # the openai optional dependency is include framework and rag dependencies $(VENV_BIN)/pip install -e ".[openai]" touch $(VENV)/.testenv @@ -100,7 +99,7 @@ package: clean-dist ## Package the project for distribution IS_DEV_MODE=false python setup.py sdist bdist_wheel .PHONY: upload -upload: package ## Upload the package to PyPI +upload: ## Upload the package to PyPI # upload to testpypi: twine upload --repository testpypi dist/* twine upload dist/* diff --git a/dbgpt/_version.py b/dbgpt/_version.py index abe1e1c01..4e1777d95 100644 --- a/dbgpt/_version.py +++ b/dbgpt/_version.py @@ -1 +1 @@ -version = "0.5.1" +version = "0.5.2" diff --git a/dbgpt/app/initialization/embedding_component.py b/dbgpt/app/initialization/embedding_component.py index 83552a681..71070d466 100644 --- a/dbgpt/app/initialization/embedding_component.py +++ b/dbgpt/app/initialization/embedding_component.py @@ -82,8 +82,10 @@ class LocalEmbeddingFactory(EmbeddingFactory): return self._model def _load_model(self) -> "Embeddings": - from dbgpt.model.cluster.embedding.loader import EmbeddingLoader - from dbgpt.model.cluster.worker.embedding_worker import _parse_embedding_params + from dbgpt.model.adapter.embeddings_loader import ( + EmbeddingLoader, + _parse_embedding_params, + ) from dbgpt.model.parameter import ( EMBEDDING_NAME_TO_PARAMETER_CLASS_CONFIG, BaseEmbeddingModelParameters, diff --git a/dbgpt/app/knowledge/service.py b/dbgpt/app/knowledge/service.py index 5b59bc803..b6a2fab68 100644 --- a/dbgpt/app/knowledge/service.py +++ b/dbgpt/app/knowledge/service.py @@ -27,6 +27,8 @@ from dbgpt.component import ComponentType from dbgpt.configs.model_config import EMBEDDING_MODEL_CONFIG from dbgpt.core import Chunk from dbgpt.model import DefaultLLMClient +from dbgpt.rag.assembler.embedding import EmbeddingAssembler +from dbgpt.rag.assembler.summary import SummaryAssembler from dbgpt.rag.chunk_manager import ChunkParameters from dbgpt.rag.embedding.embedding_factory import EmbeddingFactory from dbgpt.rag.knowledge.base import ChunkStrategy, KnowledgeType @@ -36,8 +38,6 @@ from dbgpt.rag.text_splitter.text_splitter import ( SpacyTextSplitter, ) from dbgpt.serve.rag.api.schemas import KnowledgeSyncRequest -from dbgpt.serve.rag.assembler.embedding import EmbeddingAssembler -from dbgpt.serve.rag.assembler.summary import SummaryAssembler from dbgpt.serve.rag.models.models import KnowledgeSpaceDao, KnowledgeSpaceEntity from dbgpt.serve.rag.service.service import Service, SyncStatus from dbgpt.storage.vector_store.base import VectorStoreConfig @@ -347,6 +347,7 @@ class KnowledgeService: assembler = EmbeddingAssembler.load_from_knowledge( knowledge=knowledge, chunk_parameters=chunk_parameters, + embeddings=embedding_fn, vector_store_connector=vector_store_connector, ) chunk_docs = assembler.get_chunks() diff --git a/dbgpt/core/awel/dag/base.py b/dbgpt/core/awel/dag/base.py index e727c1e59..e77757386 100644 --- a/dbgpt/core/awel/dag/base.py +++ b/dbgpt/core/awel/dag/base.py @@ -710,6 +710,11 @@ class DAG: self.print_tree() return _visualize_dag(self, view=view, **kwargs) + def show(self, mermaid: bool = False) -> Any: + """Return the graph of current DAG.""" + dot, mermaid_str = _get_graph(self) + return mermaid_str if mermaid else dot + def __enter__(self): """Enter a DAG context.""" DAGVar.enter_dag(self) @@ -813,26 +818,12 @@ def _handle_dag_nodes( _handle_dag_nodes(is_down_to_up, level, node, func) -def _visualize_dag( - dag: DAG, view: bool = True, generate_mermaid: bool = True, **kwargs -) -> Optional[str]: - """Visualize the DAG. - - Args: - dag (DAG): The DAG to visualize - view (bool, optional): Whether view the DAG graph. Defaults to True. - generate_mermaid (bool, optional): Whether to generate a Mermaid syntax file. - Defaults to True. - - Returns: - Optional[str]: The filename of the DAG graph - """ +def _get_graph(dag: DAG): try: from graphviz import Digraph except ImportError: logger.warn("Can't import graphviz, skip visualize DAG") - return None - + return None, None dot = Digraph(name=dag.dag_id) mermaid_str = "graph TD;\n" # Initialize Mermaid graph definition # Record the added edges to avoid adding duplicate edges @@ -851,6 +842,26 @@ def _visualize_dag( for root in dag.root_nodes: add_edges(root) + return dot, mermaid_str + + +def _visualize_dag( + dag: DAG, view: bool = True, generate_mermaid: bool = True, **kwargs +) -> Optional[str]: + """Visualize the DAG. + + Args: + dag (DAG): The DAG to visualize + view (bool, optional): Whether view the DAG graph. Defaults to True. + generate_mermaid (bool, optional): Whether to generate a Mermaid syntax file. + Defaults to True. + + Returns: + Optional[str]: The filename of the DAG graph + """ + dot, mermaid_str = _get_graph(dag) + if not dot: + return None filename = f"dag-vis-{dag.dag_id}.gv" if "filename" in kwargs: filename = kwargs["filename"] diff --git a/dbgpt/core/awel/operators/common_operator.py b/dbgpt/core/awel/operators/common_operator.py index 25cc058fa..9adab201c 100644 --- a/dbgpt/core/awel/operators/common_operator.py +++ b/dbgpt/core/awel/operators/common_operator.py @@ -1,12 +1,13 @@ """Common operators of AWEL.""" import asyncio import logging -from typing import Awaitable, Callable, Dict, Generic, List, Optional, Union +from typing import Any, Awaitable, Callable, Dict, Generic, List, Optional, Union from ..dag.base import DAGContext from ..task.base import ( IN, OUT, + SKIP_DATA, InputContext, InputSource, JoinFunc, @@ -276,6 +277,11 @@ class InputOperator(BaseOperator, Generic[OUT]): curr_task_ctx.set_task_output(task_output) return task_output + @classmethod + def dummy_input(cls, dummy_data: Any = SKIP_DATA, **kwargs) -> "InputOperator[OUT]": + """Create a dummy InputOperator with a given input value.""" + return cls(input_source=InputSource.from_data(dummy_data), **kwargs) + class TriggerOperator(InputOperator[OUT], Generic[OUT]): """Operator node that triggers the DAG to run.""" diff --git a/dbgpt/datasource/__init__.py b/dbgpt/datasource/__init__.py index 264fd164c..10724efe1 100644 --- a/dbgpt/datasource/__init__.py +++ b/dbgpt/datasource/__init__.py @@ -1,6 +1,17 @@ """Module to define the data source connectors.""" +from typing import Any + from .base import BaseConnector # noqa: F401 -from .rdbms.base import RDBMSConnector # noqa: F401 + + +def __getattr__(name: str) -> Any: + if name == "RDBMSConnector": + from .rdbms.base import RDBMSConnector # noqa: F401 + + return RDBMSConnector + else: + raise AttributeError(f"Could not find: {name} in datasource") + __ALL__ = ["BaseConnector", "RDBMSConnector"] diff --git a/dbgpt/datasource/operators/datasource_operator.py b/dbgpt/datasource/operators/datasource_operator.py index d6a3d3b54..65336de15 100644 --- a/dbgpt/datasource/operators/datasource_operator.py +++ b/dbgpt/datasource/operators/datasource_operator.py @@ -12,10 +12,10 @@ from ..base import BaseConnector class DatasourceOperator(MapOperator[str, Any]): """The Datasource Operator.""" - def __init__(self, connection: BaseConnector, **kwargs): + def __init__(self, connector: BaseConnector, **kwargs): """Create the datasource operator.""" super().__init__(**kwargs) - self._connection = connection + self._connector = connector async def map(self, input_value: str) -> Any: """Execute the query.""" @@ -23,4 +23,4 @@ class DatasourceOperator(MapOperator[str, Any]): def query(self, input_value: str) -> Any: """Execute the query.""" - return self._connection.run_to_df(input_value) + return self._connector.run_to_df(input_value) diff --git a/dbgpt/datasource/rdbms/base.py b/dbgpt/datasource/rdbms/base.py index 3197e211d..b9072d7cb 100644 --- a/dbgpt/datasource/rdbms/base.py +++ b/dbgpt/datasource/rdbms/base.py @@ -3,11 +3,11 @@ from __future__ import annotations import logging +import re from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, cast from urllib.parse import quote from urllib.parse import quote_plus as urlquote -import regex as re import sqlalchemy import sqlparse from sqlalchemy import MetaData, Table, create_engine, inspect, select, text diff --git a/dbgpt/model/cluster/embedding/loader.py b/dbgpt/model/adapter/embeddings_loader.py similarity index 53% rename from dbgpt/model/cluster/embedding/loader.py rename to dbgpt/model/adapter/embeddings_loader.py index 5ce7d6c28..07885c5d2 100644 --- a/dbgpt/model/cluster/embedding/loader.py +++ b/dbgpt/model/adapter/embeddings_loader.py @@ -1,25 +1,27 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Union, cast +import logging +from typing import List, Optional, Type, cast -from dbgpt.model.parameter import BaseEmbeddingModelParameters, ProxyEmbeddingParameters -from dbgpt.util.parameter_utils import _get_dict_from_obj +from dbgpt.configs.model_config import get_device +from dbgpt.core import Embeddings +from dbgpt.model.parameter import ( + BaseEmbeddingModelParameters, + EmbeddingModelParameters, + ProxyEmbeddingParameters, +) +from dbgpt.util.parameter_utils import EnvArgumentParser, _get_dict_from_obj from dbgpt.util.system_utils import get_system_info from dbgpt.util.tracer import SpanType, SpanTypeRunName, root_tracer -if TYPE_CHECKING: - from langchain.embeddings.base import Embeddings as LangChainEmbeddings - - from dbgpt.rag.embedding import Embeddings, HuggingFaceEmbeddings +logger = logging.getLogger(__name__) class EmbeddingLoader: def __init__(self) -> None: pass - def load( - self, model_name: str, param: BaseEmbeddingModelParameters - ) -> "Union[LangChainEmbeddings, Embeddings]": + def load(self, model_name: str, param: BaseEmbeddingModelParameters) -> Embeddings: metadata = { "model_name": model_name, "run_service": SpanTypeRunName.EMBEDDING_MODEL.value, @@ -33,7 +35,9 @@ class EmbeddingLoader: if model_name in ["proxy_openai", "proxy_azure"]: from langchain.embeddings import OpenAIEmbeddings - return OpenAIEmbeddings(**param.build_kwargs()) + from dbgpt.rag.embedding._wrapped import WrappedEmbeddings + + return WrappedEmbeddings(OpenAIEmbeddings(**param.build_kwargs())) elif model_name in ["proxy_http_openapi"]: from dbgpt.rag.embedding import OpenAPIEmbeddings @@ -51,3 +55,28 @@ class EmbeddingLoader: kwargs = param.build_kwargs(model_name=param.model_path) return HuggingFaceEmbeddings(**kwargs) + + +def _parse_embedding_params( + model_name: Optional[str] = None, + model_path: Optional[str] = None, + command_args: List[str] = None, + param_cls: Optional[Type] = EmbeddingModelParameters, + **kwargs, +): + model_args = EnvArgumentParser() + env_prefix = EnvArgumentParser.get_env_prefix(model_name) + model_params: BaseEmbeddingModelParameters = model_args.parse_args_into_dataclass( + param_cls, + env_prefixes=[env_prefix], + command_args=command_args, + model_name=model_name, + model_path=model_path, + **kwargs, + ) + if not model_params.device: + model_params.device = get_device() + logger.info( + f"[EmbeddingsModelWorker] Parameters of device is None, use {model_params.device}" + ) + return model_params diff --git a/dbgpt/model/cluster/worker/embedding_worker.py b/dbgpt/model/cluster/worker/embedding_worker.py index 3b2aff0fd..e3ac95f02 100644 --- a/dbgpt/model/cluster/worker/embedding_worker.py +++ b/dbgpt/model/cluster/worker/embedding_worker.py @@ -1,10 +1,12 @@ import logging -from typing import Dict, List, Optional, Type +from typing import Dict, List, Type -from dbgpt.configs.model_config import get_device from dbgpt.core import ModelMetadata +from dbgpt.model.adapter.embeddings_loader import ( + EmbeddingLoader, + _parse_embedding_params, +) from dbgpt.model.adapter.loader import _get_model_real_path -from dbgpt.model.cluster.embedding.loader import EmbeddingLoader from dbgpt.model.cluster.worker_base import ModelWorker from dbgpt.model.parameter import ( EMBEDDING_NAME_TO_PARAMETER_CLASS_CONFIG, @@ -13,14 +15,13 @@ from dbgpt.model.parameter import ( WorkerType, ) from dbgpt.util.model_utils import _clear_model_cache -from dbgpt.util.parameter_utils import EnvArgumentParser logger = logging.getLogger(__name__) class EmbeddingsModelWorker(ModelWorker): def __init__(self) -> None: - from dbgpt.rag.embedding import Embeddings, HuggingFaceEmbeddings + from dbgpt.rag.embedding import Embeddings self._embeddings_impl: Embeddings = None self._model_params = None @@ -97,26 +98,3 @@ class EmbeddingsModelWorker(ModelWorker): logger.info(f"Receive embeddings request, model: {model}") input: List[str] = params["input"] return self._embeddings_impl.embed_documents(input) - - -def _parse_embedding_params( - model_name: str, - model_path: str, - command_args: List[str] = None, - param_cls: Optional[Type] = EmbeddingModelParameters, -): - model_args = EnvArgumentParser() - env_prefix = EnvArgumentParser.get_env_prefix(model_name) - model_params: BaseEmbeddingModelParameters = model_args.parse_args_into_dataclass( - param_cls, - env_prefixes=[env_prefix], - command_args=command_args, - model_name=model_name, - model_path=model_path, - ) - if not model_params.device: - model_params.device = get_device() - logger.info( - f"[EmbeddingsModelWorker] Parameters of device is None, use {model_params.device}" - ) - return model_params diff --git a/dbgpt/rag/__init__.py b/dbgpt/rag/__init__.py index 99f150c72..abf340460 100644 --- a/dbgpt/rag/__init__.py +++ b/dbgpt/rag/__init__.py @@ -1 +1,11 @@ """Module of RAG.""" + +from dbgpt.core import Chunk, Document # noqa: F401 + +from .chunk_manager import ChunkParameters # noqa: F401 + +__ALL__ = [ + "Chunk", + "Document", + "ChunkParameters", +] diff --git a/dbgpt/rag/assembler/__init__.py b/dbgpt/rag/assembler/__init__.py new file mode 100644 index 000000000..595a89746 --- /dev/null +++ b/dbgpt/rag/assembler/__init__.py @@ -0,0 +1,16 @@ +"""Assembler Module For RAG. + +The Assembler is a module that is responsible for assembling the knowledge. +""" + +from .base import BaseAssembler # noqa: F401 +from .db_schema import DBSchemaAssembler # noqa: F401 +from .embedding import EmbeddingAssembler # noqa: F401 +from .summary import SummaryAssembler # noqa: F401 + +__all__ = [ + "BaseAssembler", + "DBSchemaAssembler", + "EmbeddingAssembler", + "SummaryAssembler", +] diff --git a/dbgpt/serve/rag/assembler/base.py b/dbgpt/rag/assembler/base.py similarity index 81% rename from dbgpt/serve/rag/assembler/base.py rename to dbgpt/rag/assembler/base.py index 20bb439bc..2dbbfe245 100644 --- a/dbgpt/serve/rag/assembler/base.py +++ b/dbgpt/rag/assembler/base.py @@ -1,36 +1,41 @@ +"""Base Assembler.""" from abc import ABC, abstractmethod from typing import Any, List, Optional from dbgpt.core import Chunk -from dbgpt.rag.chunk_manager import ChunkManager, ChunkParameters -from dbgpt.rag.extractor.base import Extractor -from dbgpt.rag.knowledge.base import Knowledge -from dbgpt.rag.retriever.base import BaseRetriever from dbgpt.util.tracer import root_tracer +from ..chunk_manager import ChunkManager, ChunkParameters +from ..extractor.base import Extractor +from ..knowledge.base import Knowledge +from ..retriever.base import BaseRetriever + class BaseAssembler(ABC): - """Base Assembler""" + """Base Assembler.""" def __init__( self, - knowledge: Optional[Knowledge] = None, + knowledge: Knowledge, chunk_parameters: Optional[ChunkParameters] = None, extractor: Optional[Extractor] = None, **kwargs: Any, ) -> None: """Initialize with Assembler arguments. + Args: - knowledge: (Knowledge) Knowledge datasource. - chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for chunking. - extractor: (Optional[Extractor]) Extractor to use for summarization.""" + knowledge(Knowledge): Knowledge datasource. + chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for + chunking. + extractor(Optional[Extractor]): Extractor to use for summarization. + """ self._knowledge = knowledge self._chunk_parameters = chunk_parameters or ChunkParameters() self._extractor = extractor self._chunk_manager = ChunkManager( knowledge=self._knowledge, chunk_parameter=self._chunk_parameters ) - self._chunks = None + self._chunks: List[Chunk] = [] metadata = { "knowledge_cls": self._knowledge.__class__.__name__ if self._knowledge diff --git a/dbgpt/rag/assembler/db_schema.py b/dbgpt/rag/assembler/db_schema.py new file mode 100644 index 000000000..18c78c333 --- /dev/null +++ b/dbgpt/rag/assembler/db_schema.py @@ -0,0 +1,135 @@ +"""DBSchemaAssembler.""" +from typing import Any, List, Optional + +from dbgpt.core import Chunk, Embeddings +from dbgpt.datasource.base import BaseConnector +from dbgpt.storage.vector_store.connector import VectorStoreConnector + +from ..assembler.base import BaseAssembler +from ..chunk_manager import ChunkParameters +from ..embedding.embedding_factory import DefaultEmbeddingFactory +from ..knowledge.datasource import DatasourceKnowledge +from ..retriever.db_schema import DBSchemaRetriever + + +class DBSchemaAssembler(BaseAssembler): + """DBSchemaAssembler. + + Example: + .. code-block:: python + + from dbgpt.datasource.rdbms.conn_sqlite import SQLiteTempConnector + from dbgpt.serve.rag.assembler.db_struct import DBSchemaAssembler + from dbgpt.storage.vector_store.connector import VectorStoreConnector + from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig + + connection = SQLiteTempConnector.create_temporary_db() + assembler = DBSchemaAssembler.load_from_connection( + connector=connection, + embedding_model=embedding_model_path, + ) + assembler.persist() + # get db struct retriever + retriever = assembler.as_retriever(top_k=3) + """ + + def __init__( + self, + connector: BaseConnector, + vector_store_connector: VectorStoreConnector, + chunk_parameters: Optional[ChunkParameters] = None, + embedding_model: Optional[str] = None, + embeddings: Optional[Embeddings] = None, + **kwargs: Any, + ) -> None: + """Initialize with Embedding Assembler arguments. + + Args: + connector: (BaseConnector) BaseConnector connection. + vector_store_connector: (VectorStoreConnector) VectorStoreConnector to use. + chunk_manager: (Optional[ChunkManager]) ChunkManager to use for chunking. + embedding_model: (Optional[str]) Embedding model to use. + embeddings: (Optional[Embeddings]) Embeddings to use. + """ + knowledge = DatasourceKnowledge(connector) + self._connector = connector + self._vector_store_connector = vector_store_connector + + self._embedding_model = embedding_model + if self._embedding_model and not embeddings: + embeddings = DefaultEmbeddingFactory( + default_model_name=self._embedding_model + ).create(self._embedding_model) + + if ( + embeddings + and self._vector_store_connector.vector_store_config.embedding_fn is None + ): + self._vector_store_connector.vector_store_config.embedding_fn = embeddings + + super().__init__( + knowledge=knowledge, + chunk_parameters=chunk_parameters, + **kwargs, + ) + + @classmethod + def load_from_connection( + cls, + connector: BaseConnector, + vector_store_connector: VectorStoreConnector, + chunk_parameters: Optional[ChunkParameters] = None, + embedding_model: Optional[str] = None, + embeddings: Optional[Embeddings] = None, + ) -> "DBSchemaAssembler": + """Load document embedding into vector store from path. + + Args: + connector: (BaseConnector) BaseConnector connection. + vector_store_connector: (VectorStoreConnector) VectorStoreConnector to use. + chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for + chunking. + embedding_model: (Optional[str]) Embedding model to use. + embeddings: (Optional[Embeddings]) Embeddings to use. + Returns: + DBSchemaAssembler + """ + return cls( + connector=connector, + vector_store_connector=vector_store_connector, + embedding_model=embedding_model, + chunk_parameters=chunk_parameters, + embeddings=embeddings, + ) + + def get_chunks(self) -> List[Chunk]: + """Return chunk ids.""" + return self._chunks + + def persist(self) -> List[str]: + """Persist chunks into vector store. + + Returns: + List[str]: List of chunk ids. + """ + return self._vector_store_connector.load_document(self._chunks) + + def _extract_info(self, chunks) -> List[Chunk]: + """Extract info from chunks.""" + return [] + + def as_retriever(self, top_k: int = 4, **kwargs) -> DBSchemaRetriever: + """Create DBSchemaRetriever. + + Args: + top_k(int): default 4. + + Returns: + DBSchemaRetriever + """ + return DBSchemaRetriever( + top_k=top_k, + connector=self._connector, + is_embeddings=True, + vector_store_connector=self._vector_store_connector, + ) diff --git a/dbgpt/serve/rag/assembler/embedding.py b/dbgpt/rag/assembler/embedding.py similarity index 59% rename from dbgpt/serve/rag/assembler/embedding.py rename to dbgpt/rag/assembler/embedding.py index a21d7bd85..59725ade4 100644 --- a/dbgpt/serve/rag/assembler/embedding.py +++ b/dbgpt/rag/assembler/embedding.py @@ -1,20 +1,20 @@ -import os +"""Embedding Assembler.""" from typing import Any, List, Optional -from dbgpt.core import Chunk -from dbgpt.rag.chunk_manager import ChunkParameters -from dbgpt.rag.embedding.embedding_factory import EmbeddingFactory -from dbgpt.rag.knowledge.base import Knowledge -from dbgpt.rag.retriever.embedding import EmbeddingRetriever -from dbgpt.serve.rag.assembler.base import BaseAssembler +from dbgpt.core import Chunk, Embeddings from dbgpt.storage.vector_store.connector import VectorStoreConnector +from ..assembler.base import BaseAssembler +from ..chunk_manager import ChunkParameters +from ..embedding.embedding_factory import DefaultEmbeddingFactory +from ..knowledge.base import Knowledge +from ..retriever.embedding import EmbeddingRetriever + class EmbeddingAssembler(BaseAssembler): - """Embedding Assembler + """Embedding Assembler. Example: - .. code-block:: python from dbgpt.rag.assembler import EmbeddingAssembler @@ -30,35 +30,37 @@ class EmbeddingAssembler(BaseAssembler): def __init__( self, knowledge: Knowledge, + vector_store_connector: VectorStoreConnector, chunk_parameters: Optional[ChunkParameters] = None, embedding_model: Optional[str] = None, - embedding_factory: Optional[EmbeddingFactory] = None, - vector_store_connector: Optional[VectorStoreConnector] = None, + embeddings: Optional[Embeddings] = None, **kwargs: Any, ) -> None: """Initialize with Embedding Assembler arguments. + Args: knowledge: (Knowledge) Knowledge datasource. - chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for chunking. + vector_store_connector: (VectorStoreConnector) VectorStoreConnector to use. + chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for + chunking. embedding_model: (Optional[str]) Embedding model to use. - embedding_factory: (Optional[EmbeddingFactory]) EmbeddingFactory to use. - vector_store_connector: (Optional[VectorStoreConnector]) VectorStoreConnector to use. + embeddings: (Optional[Embeddings]) Embeddings to use. """ if knowledge is None: raise ValueError("knowledge datasource must be provided.") self._vector_store_connector = vector_store_connector - from dbgpt.rag.embedding.embedding_factory import DefaultEmbeddingFactory self._embedding_model = embedding_model - if self._embedding_model: - embedding_factory = embedding_factory or DefaultEmbeddingFactory( + if self._embedding_model and not embeddings: + embeddings = DefaultEmbeddingFactory( default_model_name=self._embedding_model - ) - self.embedding_fn = embedding_factory.create(self._embedding_model) - if self._vector_store_connector.vector_store_config.embedding_fn is None: - self._vector_store_connector.vector_store_config.embedding_fn = ( - self.embedding_fn - ) + ).create(self._embedding_model) + + if ( + embeddings + and self._vector_store_connector.vector_store_config.embedding_fn is None + ): + self._vector_store_connector.vector_store_config.embedding_fn = embeddings super().__init__( knowledge=knowledge, @@ -70,32 +72,30 @@ class EmbeddingAssembler(BaseAssembler): def load_from_knowledge( cls, knowledge: Knowledge, + vector_store_connector: VectorStoreConnector, chunk_parameters: Optional[ChunkParameters] = None, embedding_model: Optional[str] = None, - embedding_factory: Optional[EmbeddingFactory] = None, - vector_store_connector: Optional[VectorStoreConnector] = None, + embeddings: Optional[Embeddings] = None, ) -> "EmbeddingAssembler": """Load document embedding into vector store from path. + Args: knowledge: (Knowledge) Knowledge datasource. - chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for chunking. + vector_store_connector: (VectorStoreConnector) VectorStoreConnector to use. + chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for + chunking. embedding_model: (Optional[str]) Embedding model to use. - embedding_factory: (Optional[EmbeddingFactory]) EmbeddingFactory to use. - vector_store_connector: (Optional[VectorStoreConnector]) VectorStoreConnector to use. + embeddings: (Optional[Embeddings]) Embeddings to use. + Returns: EmbeddingAssembler """ - from dbgpt.rag.embedding.embedding_factory import DefaultEmbeddingFactory - - embedding_factory = embedding_factory or DefaultEmbeddingFactory( - default_model_name=embedding_model or os.getenv("EMBEDDING_MODEL_PATH") - ) return cls( knowledge=knowledge, + vector_store_connector=vector_store_connector, chunk_parameters=chunk_parameters, embedding_model=embedding_model, - embedding_factory=embedding_factory, - vector_store_connector=vector_store_connector, + embeddings=embeddings, ) def persist(self) -> List[str]: @@ -108,12 +108,14 @@ class EmbeddingAssembler(BaseAssembler): def _extract_info(self, chunks) -> List[Chunk]: """Extract info from chunks.""" - pass + return [] + + def as_retriever(self, top_k: int = 4, **kwargs) -> EmbeddingRetriever: + """Create a retriever. - def as_retriever(self, top_k: Optional[int] = 4) -> EmbeddingRetriever: - """ Args: - top_k:(Optional[int]), default 4 + top_k(int): default 4. + Returns: EmbeddingRetriever """ diff --git a/dbgpt/serve/rag/assembler/summary.py b/dbgpt/rag/assembler/summary.py similarity index 78% rename from dbgpt/serve/rag/assembler/summary.py rename to dbgpt/rag/assembler/summary.py index 188a1e6de..295c00113 100644 --- a/dbgpt/serve/rag/assembler/summary.py +++ b/dbgpt/rag/assembler/summary.py @@ -1,16 +1,19 @@ +"""Summary Assembler.""" import os from typing import Any, List, Optional from dbgpt.core import Chunk, LLMClient -from dbgpt.rag.chunk_manager import ChunkParameters -from dbgpt.rag.extractor.base import Extractor -from dbgpt.rag.knowledge.base import Knowledge -from dbgpt.rag.retriever.base import BaseRetriever -from dbgpt.serve.rag.assembler.base import BaseAssembler + +from ..assembler.base import BaseAssembler +from ..chunk_manager import ChunkParameters +from ..extractor.base import Extractor +from ..knowledge.base import Knowledge +from ..retriever.base import BaseRetriever class SummaryAssembler(BaseAssembler): - """Summary Assembler + """Summary Assembler. + Example: .. code-block:: python @@ -40,6 +43,7 @@ class SummaryAssembler(BaseAssembler): **kwargs: Any, ) -> None: """Initialize with Embedding Assembler arguments. + Args: knowledge: (Knowledge) Knowledge datasource. chunk_manager: (Optional[ChunkManager]) ChunkManager to use for chunking. @@ -51,13 +55,24 @@ class SummaryAssembler(BaseAssembler): if knowledge is None: raise ValueError("knowledge datasource must be provided.") - self._model_name = model_name or os.getenv("LLM_MODEL") - self._llm_client = llm_client - from dbgpt.rag.extractor.summary import SummaryExtractor + model_name = model_name or os.getenv("LLM_MODEL") - self._extractor = extractor or SummaryExtractor( - llm_client=self._llm_client, model_name=self._model_name, language=language - ) + if not extractor: + from ..extractor.summary import SummaryExtractor + + if not llm_client: + raise ValueError("llm_client must be provided.") + if not model_name: + raise ValueError("model_name must be provided.") + extractor = SummaryExtractor( + llm_client=llm_client, + model_name=model_name, + language=language, + ) + if not extractor: + raise ValueError("extractor must be provided.") + + self._extractor: Extractor = extractor super().__init__( knowledge=knowledge, chunk_parameters=chunk_parameters, @@ -77,9 +92,11 @@ class SummaryAssembler(BaseAssembler): **kwargs: Any, ) -> "SummaryAssembler": """Load document embedding into vector store from path. + Args: knowledge: (Knowledge) Knowledge datasource. - chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for chunking. + chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for + chunking. model_name: (Optional[str]) llm model to use. llm_client: (Optional[LLMClient]) LLMClient to use. extractor: (Optional[Extractor]) Extractor to use for summarization. @@ -107,6 +124,8 @@ class SummaryAssembler(BaseAssembler): def _extract_info(self, chunks) -> List[Chunk]: """Extract info from chunks.""" + return [] def as_retriever(self, **kwargs: Any) -> BaseRetriever: """Return a retriever.""" + raise NotImplementedError diff --git a/dbgpt/serve/rag/assembler/__init__.py b/dbgpt/rag/assembler/tests/__init__.py similarity index 100% rename from dbgpt/serve/rag/assembler/__init__.py rename to dbgpt/rag/assembler/tests/__init__.py diff --git a/dbgpt/serve/rag/assembler/tests/test_db_struct_assembler.py b/dbgpt/rag/assembler/tests/test_db_struct_assembler.py similarity index 94% rename from dbgpt/serve/rag/assembler/tests/test_db_struct_assembler.py rename to dbgpt/rag/assembler/tests/test_db_struct_assembler.py index c6fbe0539..6bb2d4986 100644 --- a/dbgpt/serve/rag/assembler/tests/test_db_struct_assembler.py +++ b/dbgpt/rag/assembler/tests/test_db_struct_assembler.py @@ -3,11 +3,11 @@ from unittest.mock import MagicMock import pytest from dbgpt.datasource.rdbms.conn_sqlite import SQLiteTempConnector +from dbgpt.rag.assembler.embedding import EmbeddingAssembler from dbgpt.rag.chunk_manager import ChunkParameters, SplitterType from dbgpt.rag.embedding.embedding_factory import EmbeddingFactory from dbgpt.rag.knowledge.base import Knowledge from dbgpt.rag.text_splitter.text_splitter import CharacterTextSplitter -from dbgpt.serve.rag.assembler.embedding import EmbeddingAssembler from dbgpt.storage.vector_store.connector import VectorStoreConnector @@ -69,7 +69,7 @@ def test_load_knowledge( assembler = EmbeddingAssembler( knowledge=mock_knowledge, chunk_parameters=mock_chunk_parameters, - embedding_factory=mock_embedding_factory, + embeddings=mock_embedding_factory.create(), vector_store_connector=mock_vector_store_connector, ) assembler.load_knowledge(knowledge=mock_knowledge) diff --git a/dbgpt/serve/rag/assembler/tests/test_embedding_assembler.py b/dbgpt/rag/assembler/tests/test_embedding_assembler.py similarity index 82% rename from dbgpt/serve/rag/assembler/tests/test_embedding_assembler.py rename to dbgpt/rag/assembler/tests/test_embedding_assembler.py index 1570774fd..4921b8359 100644 --- a/dbgpt/serve/rag/assembler/tests/test_embedding_assembler.py +++ b/dbgpt/rag/assembler/tests/test_embedding_assembler.py @@ -1,13 +1,12 @@ -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock import pytest from dbgpt.datasource.rdbms.conn_sqlite import SQLiteTempConnector +from dbgpt.rag.assembler.db_schema import DBSchemaAssembler from dbgpt.rag.chunk_manager import ChunkParameters, SplitterType from dbgpt.rag.embedding.embedding_factory import EmbeddingFactory -from dbgpt.rag.knowledge.base import Knowledge from dbgpt.rag.text_splitter.text_splitter import CharacterTextSplitter -from dbgpt.serve.rag.assembler.db_schema import DBSchemaAssembler from dbgpt.storage.vector_store.connector import VectorStoreConnector @@ -51,14 +50,8 @@ def mock_vector_store_connector(): return MagicMock(spec=VectorStoreConnector) -@pytest.fixture -def mock_knowledge(): - return MagicMock(spec=Knowledge) - - def test_load_knowledge( mock_db_connection, - mock_knowledge, mock_chunk_parameters, mock_embedding_factory, mock_vector_store_connector, @@ -67,10 +60,9 @@ def test_load_knowledge( mock_chunk_parameters.text_splitter = CharacterTextSplitter() mock_chunk_parameters.splitter_type = SplitterType.USER_DEFINE assembler = DBSchemaAssembler( - connection=mock_db_connection, + connector=mock_db_connection, chunk_parameters=mock_chunk_parameters, - embedding_factory=mock_embedding_factory, + embeddings=mock_embedding_factory.create(), vector_store_connector=mock_vector_store_connector, ) - assembler.load_knowledge(knowledge=mock_knowledge) assert len(assembler._chunks) == 1 diff --git a/dbgpt/rag/embedding/__init__.py b/dbgpt/rag/embedding/__init__.py index dcf799f3a..165160b01 100644 --- a/dbgpt/rag/embedding/__init__.py +++ b/dbgpt/rag/embedding/__init__.py @@ -1,6 +1,10 @@ """Module for embedding related classes and functions.""" -from .embedding_factory import DefaultEmbeddingFactory, EmbeddingFactory # noqa: F401 +from .embedding_factory import ( # noqa: F401 + DefaultEmbeddingFactory, + EmbeddingFactory, + WrappedEmbeddingFactory, +) from .embeddings import ( # noqa: F401 Embeddings, HuggingFaceBgeEmbeddings, @@ -21,4 +25,5 @@ __ALL__ = [ "OpenAPIEmbeddings", "DefaultEmbeddingFactory", "EmbeddingFactory", + "WrappedEmbeddingFactory", ] diff --git a/dbgpt/rag/embedding/_wrapped.py b/dbgpt/rag/embedding/_wrapped.py new file mode 100644 index 000000000..4887d5838 --- /dev/null +++ b/dbgpt/rag/embedding/_wrapped.py @@ -0,0 +1,32 @@ +"""Wraps the third-party language model embeddings to the common interface.""" + +from typing import TYPE_CHECKING, List + +from dbgpt.core import Embeddings + +if TYPE_CHECKING: + from langchain.embeddings.base import Embeddings as LangChainEmbeddings + + +class WrappedEmbeddings(Embeddings): + """Wraps the third-party language model embeddings to the common interface.""" + + def __init__(self, embeddings: "LangChainEmbeddings") -> None: + """Create a new WrappedEmbeddings.""" + self._embeddings = embeddings + + def embed_documents(self, texts: List[str]) -> List[List[float]]: + """Embed search docs.""" + return self._embeddings.embed_documents(texts) + + def embed_query(self, text: str) -> List[float]: + """Embed query text.""" + return self._embeddings.embed_query(text) + + async def aembed_documents(self, texts: List[str]) -> List[List[float]]: + """Asynchronous Embed search docs.""" + return await self._embeddings.aembed_documents(texts) + + async def aembed_query(self, text: str) -> List[float]: + """Asynchronous Embed query text.""" + return await self._embeddings.aembed_query(text) diff --git a/dbgpt/rag/embedding/embedding_factory.py b/dbgpt/rag/embedding/embedding_factory.py index 83237bb76..bf3afa2a2 100644 --- a/dbgpt/rag/embedding/embedding_factory.py +++ b/dbgpt/rag/embedding/embedding_factory.py @@ -1,15 +1,14 @@ """EmbeddingFactory class and DefaultEmbeddingFactory class.""" -from __future__ import annotations - +import logging +import os from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Any, Optional, Type +from typing import Any, Optional, Type from dbgpt.component import BaseComponent, SystemApp -from dbgpt.rag.embedding.embeddings import HuggingFaceEmbeddings +from dbgpt.core import Embeddings -if TYPE_CHECKING: - from dbgpt.rag.embedding.embeddings import Embeddings +logger = logging.getLogger(__name__) class EmbeddingFactory(BaseComponent, ABC): @@ -20,7 +19,7 @@ class EmbeddingFactory(BaseComponent, ABC): @abstractmethod def create( self, model_name: Optional[str] = None, embedding_cls: Optional[Type] = None - ) -> "Embeddings": + ) -> Embeddings: """Create an embedding instance. Args: @@ -39,12 +38,19 @@ class DefaultEmbeddingFactory(EmbeddingFactory): self, system_app: Optional[SystemApp] = None, default_model_name: Optional[str] = None, + default_model_path: Optional[str] = None, **kwargs: Any, ) -> None: """Create a new DefaultEmbeddingFactory.""" super().__init__(system_app=system_app) + if not default_model_path: + default_model_path = default_model_name + if not default_model_name: + default_model_name = default_model_path self._default_model_name = default_model_name - self.kwargs = kwargs + self._default_model_path = default_model_path + self._kwargs = kwargs + self._model = self._load_model() def init_app(self, system_app): """Init the app.""" @@ -52,20 +58,166 @@ class DefaultEmbeddingFactory(EmbeddingFactory): def create( self, model_name: Optional[str] = None, embedding_cls: Optional[Type] = None - ) -> "Embeddings": + ) -> Embeddings: """Create an embedding instance. Args: model_name (str): The model name. embedding_cls (Type): The embedding class. """ - if not model_name: - model_name = self._default_model_name - - new_kwargs = {k: v for k, v in self.kwargs.items()} - new_kwargs["model_name"] = model_name - if embedding_cls: - return embedding_cls(**new_kwargs) - else: - return HuggingFaceEmbeddings(**new_kwargs) + raise NotImplementedError + return self._model + + def _load_model(self) -> Embeddings: + from dbgpt.model.adapter.embeddings_loader import ( + EmbeddingLoader, + _parse_embedding_params, + ) + from dbgpt.model.parameter import ( + EMBEDDING_NAME_TO_PARAMETER_CLASS_CONFIG, + BaseEmbeddingModelParameters, + EmbeddingModelParameters, + ) + + param_cls = EMBEDDING_NAME_TO_PARAMETER_CLASS_CONFIG.get( + self._default_model_name, EmbeddingModelParameters + ) + model_params: BaseEmbeddingModelParameters = _parse_embedding_params( + model_name=self._default_model_name, + model_path=self._default_model_path, + param_cls=param_cls, + **self._kwargs, + ) + logger.info(model_params) + loader = EmbeddingLoader() + # Ignore model_name args + model_name = self._default_model_name or model_params.model_name + if not model_name: + raise ValueError("model_name must be provided.") + return loader.load(model_name, model_params) + + @classmethod + def openai( + cls, + api_url: Optional[str] = None, + api_key: Optional[str] = None, + model_name: str = "text-embedding-3-small", + timeout: int = 60, + **kwargs: Any, + ) -> Embeddings: + """Create an OpenAI embeddings. + + If api_url and api_key are not provided, we will try to get them from + environment variables. + + Args: + api_url (Optional[str], optional): The api url. Defaults to None. + api_key (Optional[str], optional): The api key. Defaults to None. + model_name (str, optional): The model name. + Defaults to "text-embedding-3-small". + timeout (int, optional): The timeout. Defaults to 60. + + Returns: + Embeddings: The embeddings instance. + """ + api_url = ( + api_url + or os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") + "/embeddings" + ) + api_key = api_key or os.getenv("OPENAI_API_KEY") + if not api_key: + raise ValueError("api_key must be provided.") + return cls.remote( + api_url=api_url, + api_key=api_key, + model_name=model_name, + timeout=timeout, + **kwargs, + ) + + @classmethod + def default( + cls, model_name: str, model_path: Optional[str] = None, **kwargs: Any + ) -> Embeddings: + """Create a default embeddings. + + It will try to load the model from the model name or model path. + + Args: + model_name (str): The model name. + model_path (Optional[str], optional): The model path. Defaults to None. + if not provided, it will use the model name as the model path to load + the model. + + Returns: + Embeddings: The embeddings instance. + """ + return cls( + default_model_name=model_name, default_model_path=model_path, **kwargs + ).create() + + @classmethod + def remote( + cls, + api_url: str = "http://localhost:8100/api/v1/embeddings", + api_key: Optional[str] = None, + model_name: str = "text2vec", + timeout: int = 60, + **kwargs: Any, + ) -> Embeddings: + """Create a remote embeddings. + + Create a remote embeddings which API compatible with the OpenAI's API. So if + your model is compatible with OpenAI's API, you can use this method to create + a remote embeddings. + + Args: + api_url (str, optional): The api url. Defaults to + "http://localhost:8100/api/v1/embeddings". + api_key (Optional[str], optional): The api key. Defaults to None. + model_name (str, optional): The model name. Defaults to "text2vec". + timeout (int, optional): The timeout. Defaults to 60. + """ + from .embeddings import OpenAPIEmbeddings + + return OpenAPIEmbeddings( + api_url=api_url, + api_key=api_key, + model_name=model_name, + timeout=timeout, + **kwargs, + ) + + +class WrappedEmbeddingFactory(EmbeddingFactory): + """The default embedding factory.""" + + def __init__( + self, + system_app: Optional[SystemApp] = None, + embeddings: Optional[Embeddings] = None, + **kwargs: Any, + ) -> None: + """Create a new DefaultEmbeddingFactory.""" + super().__init__(system_app=system_app) + if not embeddings: + raise ValueError("embeddings must be provided.") + self._model = embeddings + + def init_app(self, system_app): + """Init the app.""" + pass + + def create( + self, model_name: Optional[str] = None, embedding_cls: Optional[Type] = None + ) -> Embeddings: + """Create an embedding instance. + + Args: + model_name (str): The model name. + embedding_cls (Type): The embedding class. + """ + if embedding_cls: + raise NotImplementedError + return self._model diff --git a/dbgpt/rag/knowledge/__init__.py b/dbgpt/rag/knowledge/__init__.py index 0fa28c518..0208cdf6b 100644 --- a/dbgpt/rag/knowledge/__init__.py +++ b/dbgpt/rag/knowledge/__init__.py @@ -1,23 +1,50 @@ """Module Of Knowledge.""" -from .base import ChunkStrategy, Knowledge, KnowledgeType # noqa: F401 -from .csv import CSVKnowledge # noqa: F401 -from .docx import DocxKnowledge # noqa: F401 -from .factory import KnowledgeFactory # noqa: F401 -from .html import HTMLKnowledge # noqa: F401 -from .markdown import MarkdownKnowledge # noqa: F401 -from .pdf import PDFKnowledge # noqa: F401 -from .pptx import PPTXKnowledge # noqa: F401 -from .string import StringKnowledge # noqa: F401 -from .txt import TXTKnowledge # noqa: F401 -from .url import URLKnowledge # noqa: F401 +from typing import Any, Dict -__ALL__ = [ +_MODULE_CACHE: Dict[str, Any] = {} + + +def __getattr__(name: str): + # Lazy load + import importlib + + if name in _MODULE_CACHE: + return _MODULE_CACHE[name] + + _LIBS = { + "KnowledgeFactory": "factory", + "Knowledge": "base", + "KnowledgeType": "base", + "ChunkStrategy": "base", + "CSVKnowledge": "csv", + "DatasourceKnowledge": "datasource", + "DocxKnowledge": "docx", + "HTMLKnowledge": "html", + "MarkdownKnowledge": "markdown", + "PDFKnowledge": "pdf", + "PPTXKnowledge": "pptx", + "StringKnowledge": "string", + "TXTKnowledge": "txt", + "URLKnowledge": "url", + } + + if name in _LIBS: + module_path = "." + _LIBS[name] + module = importlib.import_module(module_path, __name__) + attr = getattr(module, name) + _MODULE_CACHE[name] = attr + return attr + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +__all__ = [ "KnowledgeFactory", "Knowledge", "KnowledgeType", "ChunkStrategy", "CSVKnowledge", + "DatasourceKnowledge", "DocxKnowledge", "HTMLKnowledge", "MarkdownKnowledge", diff --git a/dbgpt/rag/knowledge/base.py b/dbgpt/rag/knowledge/base.py index 46b4977ce..9bd2c7790 100644 --- a/dbgpt/rag/knowledge/base.py +++ b/dbgpt/rag/knowledge/base.py @@ -25,6 +25,7 @@ class DocumentType(Enum): DOCX = "docx" TXT = "txt" HTML = "html" + DATASOURCE = "datasource" class KnowledgeType(Enum): diff --git a/dbgpt/rag/knowledge/datasource.py b/dbgpt/rag/knowledge/datasource.py new file mode 100644 index 000000000..b2cfd9826 --- /dev/null +++ b/dbgpt/rag/knowledge/datasource.py @@ -0,0 +1,57 @@ +"""Datasource Knowledge.""" +from typing import Any, List, Optional + +from dbgpt.core import Document +from dbgpt.datasource import BaseConnector + +from ..summary.rdbms_db_summary import _parse_db_summary +from .base import ChunkStrategy, DocumentType, Knowledge, KnowledgeType + + +class DatasourceKnowledge(Knowledge): + """Datasource Knowledge.""" + + def __init__( + self, + connector: BaseConnector, + summary_template: str = "{table_name}({columns})", + knowledge_type: Optional[KnowledgeType] = KnowledgeType.DOCUMENT, + **kwargs: Any, + ) -> None: + """Create Datasource Knowledge with Knowledge arguments. + + Args: + path(str, optional): file path + knowledge_type(KnowledgeType, optional): knowledge type + data_loader(Any, optional): loader + """ + self._connector = connector + self._summary_template = summary_template + super().__init__(knowledge_type=knowledge_type, **kwargs) + + def _load(self) -> List[Document]: + """Load datasource document from data_loader.""" + docs = [] + for table_summary in _parse_db_summary(self._connector, self._summary_template): + docs.append( + Document(content=table_summary, metadata={"source": "database"}) + ) + return docs + + @classmethod + def support_chunk_strategy(cls) -> List[ChunkStrategy]: + """Return support chunk strategy.""" + return [ + ChunkStrategy.CHUNK_BY_SIZE, + ChunkStrategy.CHUNK_BY_SEPARATOR, + ] + + @classmethod + def type(cls) -> KnowledgeType: + """Knowledge type of Datasource.""" + return KnowledgeType.DOCUMENT + + @classmethod + def document_type(cls) -> DocumentType: + """Return document type.""" + return DocumentType.DATASOURCE diff --git a/dbgpt/rag/knowledge/factory.py b/dbgpt/rag/knowledge/factory.py index b60ef0b8f..0f848434a 100644 --- a/dbgpt/rag/knowledge/factory.py +++ b/dbgpt/rag/knowledge/factory.py @@ -156,6 +156,7 @@ class KnowledgeFactory: """Get all knowledge subclasses.""" from dbgpt.rag.knowledge.base import Knowledge # noqa: F401 from dbgpt.rag.knowledge.csv import CSVKnowledge # noqa: F401 + from dbgpt.rag.knowledge.datasource import DatasourceKnowledge # noqa: F401 from dbgpt.rag.knowledge.docx import DocxKnowledge # noqa: F401 from dbgpt.rag.knowledge.html import HTMLKnowledge # noqa: F401 from dbgpt.rag.knowledge.markdown import MarkdownKnowledge # noqa: F401 diff --git a/dbgpt/rag/operators/__init__.py b/dbgpt/rag/operators/__init__.py index 72a3f1a9a..c5a01eb41 100644 --- a/dbgpt/rag/operators/__init__.py +++ b/dbgpt/rag/operators/__init__.py @@ -1,8 +1,14 @@ """Module for RAG operators.""" from .datasource import DatasourceRetrieverOperator # noqa: F401 -from .db_schema import DBSchemaRetrieverOperator # noqa: F401 -from .embedding import EmbeddingRetrieverOperator # noqa: F401 +from .db_schema import ( # noqa: F401 + DBSchemaAssemblerOperator, + DBSchemaRetrieverOperator, +) +from .embedding import ( # noqa: F401 + EmbeddingAssemblerOperator, + EmbeddingRetrieverOperator, +) from .evaluation import RetrieverEvaluatorOperator # noqa: F401 from .knowledge import KnowledgeOperator # noqa: F401 from .rerank import RerankOperator # noqa: F401 @@ -12,7 +18,9 @@ from .summary import SummaryAssemblerOperator # noqa: F401 __all__ = [ "DatasourceRetrieverOperator", "DBSchemaRetrieverOperator", + "DBSchemaAssemblerOperator", "EmbeddingRetrieverOperator", + "EmbeddingAssemblerOperator", "KnowledgeOperator", "RerankOperator", "QueryRewriteOperator", diff --git a/dbgpt/serve/rag/operators/base.py b/dbgpt/rag/operators/assembler.py similarity index 87% rename from dbgpt/serve/rag/operators/base.py rename to dbgpt/rag/operators/assembler.py index 8f2cca315..70a4acd3c 100644 --- a/dbgpt/serve/rag/operators/base.py +++ b/dbgpt/rag/operators/assembler.py @@ -1,3 +1,4 @@ +"""Base Assembler Operator.""" from abc import abstractmethod from dbgpt.core.awel import MapOperator @@ -20,4 +21,4 @@ class AssemblerOperator(MapOperator[IN, OUT]): @abstractmethod def assemble(self, input_value: IN) -> OUT: - """assemble knowledge for input value.""" + """Assemble knowledge for input value.""" diff --git a/dbgpt/rag/operators/datasource.py b/dbgpt/rag/operators/datasource.py index ac2ccc9b6..7b784c781 100644 --- a/dbgpt/rag/operators/datasource.py +++ b/dbgpt/rag/operators/datasource.py @@ -1,21 +1,21 @@ """Datasource operator for RDBMS database.""" -from typing import Any +from typing import Any, List from dbgpt.core.interface.operators.retriever import RetrieverOperator -from dbgpt.datasource.rdbms.base import RDBMSConnector +from dbgpt.datasource.base import BaseConnector from dbgpt.rag.summary.rdbms_db_summary import _parse_db_summary -class DatasourceRetrieverOperator(RetrieverOperator[Any, Any]): +class DatasourceRetrieverOperator(RetrieverOperator[Any, List[str]]): """The Datasource Retriever Operator.""" - def __init__(self, connection: RDBMSConnector, **kwargs): + def __init__(self, connector: BaseConnector, **kwargs): """Create a new DatasourceRetrieverOperator.""" super().__init__(**kwargs) - self._connection = connection + self._connector = connector - def retrieve(self, input_value: Any) -> Any: + def retrieve(self, input_value: Any) -> List[str]: """Retrieve the database summary.""" - summary = _parse_db_summary(self._connection) + summary = _parse_db_summary(self._connector) return summary diff --git a/dbgpt/rag/operators/db_schema.py b/dbgpt/rag/operators/db_schema.py index b7ffe1abe..bb08ada7b 100644 --- a/dbgpt/rag/operators/db_schema.py +++ b/dbgpt/rag/operators/db_schema.py @@ -1,18 +1,22 @@ """The DBSchema Retriever Operator.""" -from typing import Any, Optional +from typing import List, Optional +from dbgpt.core import Chunk from dbgpt.core.interface.operators.retriever import RetrieverOperator -from dbgpt.datasource.rdbms.base import RDBMSConnector -from dbgpt.rag.retriever.db_schema import DBSchemaRetriever +from dbgpt.datasource.base import BaseConnector from dbgpt.storage.vector_store.connector import VectorStoreConnector +from ..assembler.db_schema import DBSchemaAssembler +from ..retriever.db_schema import DBSchemaRetriever +from .assembler import AssemblerOperator -class DBSchemaRetrieverOperator(RetrieverOperator[Any, Any]): + +class DBSchemaRetrieverOperator(RetrieverOperator[str, List[Chunk]]): """The DBSchema Retriever Operator. Args: - connection (RDBMSConnector): The connection. + connector (BaseConnector): The connection. top_k (int, optional): The top k. Defaults to 4. vector_store_connector (VectorStoreConnector, optional): The vector store connector. Defaults to None. @@ -22,21 +26,57 @@ class DBSchemaRetrieverOperator(RetrieverOperator[Any, Any]): self, vector_store_connector: VectorStoreConnector, top_k: int = 4, - connection: Optional[RDBMSConnector] = None, + connector: Optional[BaseConnector] = None, **kwargs ): """Create a new DBSchemaRetrieverOperator.""" super().__init__(**kwargs) self._retriever = DBSchemaRetriever( top_k=top_k, - connection=connection, + connector=connector, vector_store_connector=vector_store_connector, ) - def retrieve(self, query: Any) -> Any: + def retrieve(self, query: str) -> List[Chunk]: """Retrieve the table schemas. Args: - query (IN): query. + query (str): The query. """ return self._retriever.retrieve(query) + + +class DBSchemaAssemblerOperator(AssemblerOperator[BaseConnector, List[Chunk]]): + """The DBSchema Assembler Operator.""" + + def __init__( + self, + connector: BaseConnector, + vector_store_connector: VectorStoreConnector, + **kwargs + ): + """Create a new DBSchemaAssemblerOperator. + + Args: + connector (BaseConnector): The connection. + vector_store_connector (VectorStoreConnector): The vector store connector. + """ + self._vector_store_connector = vector_store_connector + self._connector = connector + super().__init__(**kwargs) + + def assemble(self, dummy_value) -> List[Chunk]: + """Persist the database schema. + + Args: + dummy_value: Dummy value, not used. + + Returns: + List[Chunk]: The chunks. + """ + assembler = DBSchemaAssembler.load_from_connection( + connector=self._connector, + vector_store_connector=self._vector_store_connector, + ) + assembler.persist() + return assembler.get_chunks() diff --git a/dbgpt/rag/operators/embedding.py b/dbgpt/rag/operators/embedding.py index 7e926768a..d128a9aa4 100644 --- a/dbgpt/rag/operators/embedding.py +++ b/dbgpt/rag/operators/embedding.py @@ -5,11 +5,16 @@ from typing import List, Optional, Union from dbgpt.core import Chunk from dbgpt.core.interface.operators.retriever import RetrieverOperator -from dbgpt.rag.retriever.embedding import EmbeddingRetriever -from dbgpt.rag.retriever.rerank import Ranker -from dbgpt.rag.retriever.rewrite import QueryRewrite from dbgpt.storage.vector_store.connector import VectorStoreConnector +from ..assembler.embedding import EmbeddingAssembler +from ..chunk_manager import ChunkParameters +from ..knowledge import Knowledge +from ..retriever.embedding import EmbeddingRetriever +from ..retriever.rerank import Ranker +from ..retriever.rewrite import QueryRewrite +from .assembler import AssemblerOperator + class EmbeddingRetrieverOperator(RetrieverOperator[Union[str, List[str]], List[Chunk]]): """The Embedding Retriever Operator.""" @@ -43,3 +48,36 @@ class EmbeddingRetrieverOperator(RetrieverOperator[Union[str, List[str]], List[C for q in query ] return reduce(lambda x, y: x + y, candidates) + + +class EmbeddingAssemblerOperator(AssemblerOperator[Knowledge, List[Chunk]]): + """The Embedding Assembler Operator.""" + + def __init__( + self, + vector_store_connector: VectorStoreConnector, + chunk_parameters: Optional[ChunkParameters] = ChunkParameters( + chunk_strategy="CHUNK_BY_SIZE" + ), + **kwargs + ): + """Create a new EmbeddingAssemblerOperator. + + Args: + vector_store_connector (VectorStoreConnector): The vector store connector. + chunk_parameters (Optional[ChunkParameters], optional): The chunk + parameters. Defaults to ChunkParameters(chunk_strategy="CHUNK_BY_SIZE"). + """ + self._chunk_parameters = chunk_parameters + self._vector_store_connector = vector_store_connector + super().__init__(**kwargs) + + def assemble(self, knowledge: Knowledge) -> List[Chunk]: + """Assemble knowledge for input value.""" + assembler = EmbeddingAssembler.load_from_knowledge( + knowledge=knowledge, + chunk_parameters=self._chunk_parameters, + vector_store_connector=self._vector_store_connector, + ) + assembler.persist() + return assembler.get_chunks() diff --git a/dbgpt/rag/operators/knowledge.py b/dbgpt/rag/operators/knowledge.py index cfa572260..d8bceac8e 100644 --- a/dbgpt/rag/operators/knowledge.py +++ b/dbgpt/rag/operators/knowledge.py @@ -1,6 +1,6 @@ """Knowledge Operator.""" -from typing import Any, Optional +from typing import Optional from dbgpt.core.awel import MapOperator from dbgpt.core.awel.flow import ( @@ -14,7 +14,7 @@ from dbgpt.rag.knowledge.base import Knowledge, KnowledgeType from dbgpt.rag.knowledge.factory import KnowledgeFactory -class KnowledgeOperator(MapOperator[Any, Any]): +class KnowledgeOperator(MapOperator[str, Knowledge]): """Knowledge Factory Operator.""" metadata = ViewMetadata( @@ -26,7 +26,7 @@ class KnowledgeOperator(MapOperator[Any, Any]): IOField.build_from( "knowledge datasource", "knowledge datasource", - dict, + str, "knowledge datasource", ) ], @@ -85,7 +85,7 @@ class KnowledgeOperator(MapOperator[Any, Any]): self._datasource = datasource self._knowledge_type = KnowledgeType.get_by_value(knowledge_type) - async def map(self, datasource: Any) -> Knowledge: + async def map(self, datasource: str) -> Knowledge: """Create knowledge from datasource.""" if self._datasource: datasource = self._datasource diff --git a/dbgpt/rag/operators/rerank.py b/dbgpt/rag/operators/rerank.py index b9d5eb859..738c9dd1f 100644 --- a/dbgpt/rag/operators/rerank.py +++ b/dbgpt/rag/operators/rerank.py @@ -1,12 +1,12 @@ """The Rerank Operator.""" -from typing import Any, List, Optional +from typing import List, Optional from dbgpt.core import Chunk from dbgpt.core.awel import MapOperator from dbgpt.rag.retriever.rerank import RANK_FUNC, DefaultRanker -class RerankOperator(MapOperator[Any, Any]): +class RerankOperator(MapOperator[List[Chunk], List[Chunk]]): """The Rewrite Operator.""" def __init__( diff --git a/dbgpt/rag/operators/schema_linking.py b/dbgpt/rag/operators/schema_linking.py index c4355ec5c..0bf432edb 100644 --- a/dbgpt/rag/operators/schema_linking.py +++ b/dbgpt/rag/operators/schema_linking.py @@ -7,7 +7,7 @@ from typing import Any, Optional from dbgpt.core import LLMClient from dbgpt.core.awel import MapOperator -from dbgpt.datasource.rdbms.base import RDBMSConnector +from dbgpt.datasource.base import BaseConnector from dbgpt.rag.schemalinker.schema_linking import SchemaLinking from dbgpt.storage.vector_store.connector import VectorStoreConnector @@ -17,7 +17,7 @@ class SchemaLinkingOperator(MapOperator[Any, Any]): def __init__( self, - connection: RDBMSConnector, + connector: BaseConnector, model_name: str, llm: LLMClient, top_k: int = 5, @@ -27,14 +27,14 @@ class SchemaLinkingOperator(MapOperator[Any, Any]): """Create the schema linking operator. Args: - connection (RDBMSConnector): The connection. + connector (BaseConnector): The connection. llm (Optional[LLMClient]): base llm """ super().__init__(**kwargs) self._schema_linking = SchemaLinking( top_k=top_k, - connection=connection, + connector=connector, llm=llm, model_name=model_name, vector_store_connector=vector_store_connector, diff --git a/dbgpt/rag/operators/summary.py b/dbgpt/rag/operators/summary.py index 2eb83bb6b..f1c47bc28 100644 --- a/dbgpt/rag/operators/summary.py +++ b/dbgpt/rag/operators/summary.py @@ -4,9 +4,9 @@ from typing import Any, Optional from dbgpt.core import LLMClient from dbgpt.core.awel.flow import IOField, OperatorCategory, Parameter, ViewMetadata +from dbgpt.rag.assembler.summary import SummaryAssembler from dbgpt.rag.knowledge.base import Knowledge -from dbgpt.serve.rag.assembler.summary import SummaryAssembler -from dbgpt.serve.rag.operators.base import AssemblerOperator +from dbgpt.rag.operators.assembler import AssemblerOperator class SummaryAssemblerOperator(AssemblerOperator[Any, Any]): diff --git a/dbgpt/rag/retriever/db_schema.py b/dbgpt/rag/retriever/db_schema.py index 3d9e9bd88..ee0c2d6cb 100644 --- a/dbgpt/rag/retriever/db_schema.py +++ b/dbgpt/rag/retriever/db_schema.py @@ -3,7 +3,7 @@ from functools import reduce from typing import List, Optional, cast from dbgpt.core import Chunk -from dbgpt.datasource.rdbms.base import RDBMSConnector +from dbgpt.datasource.base import BaseConnector from dbgpt.rag.retriever.base import BaseRetriever from dbgpt.rag.retriever.rerank import DefaultRanker, Ranker from dbgpt.rag.summary.rdbms_db_summary import _parse_db_summary @@ -18,7 +18,7 @@ class DBSchemaRetriever(BaseRetriever): self, vector_store_connector: VectorStoreConnector, top_k: int = 4, - connection: Optional[RDBMSConnector] = None, + connector: Optional[BaseConnector] = None, query_rewrite: bool = False, rerank: Optional[Ranker] = None, **kwargs @@ -28,7 +28,7 @@ class DBSchemaRetriever(BaseRetriever): Args: vector_store_connector (VectorStoreConnector): vector store connector top_k (int): top k - connection (Optional[RDBMSConnector]): RDBMSConnector connection. + connector (Optional[BaseConnector]): RDBMSConnector. query_rewrite (bool): query rewrite rerank (Ranker): rerank @@ -65,7 +65,7 @@ class DBSchemaRetriever(BaseRetriever): return connect - connection = _create_temporary_connection() + connector = _create_temporary_connection() vector_store_config = ChromaVectorConfig(name="vector_store_name") embedding_model_path = "{your_embedding_model_path}" embedding_fn = embedding_factory.create(model_name=embedding_model_path) @@ -76,14 +76,16 @@ class DBSchemaRetriever(BaseRetriever): ) # get db struct retriever retriever = DBSchemaRetriever( - top_k=3, vector_store_connector=vector_connector + top_k=3, + vector_store_connector=vector_connector, + connector=connector, ) chunks = retriever.retrieve("show columns from table") result = [chunk.content for chunk in chunks] print(f"db struct rag example results:{result}") """ self._top_k = top_k - self._connection = connection + self._connector = connector self._query_rewrite = query_rewrite self._vector_store_connector = vector_store_connector self._need_embeddings = False @@ -108,9 +110,9 @@ class DBSchemaRetriever(BaseRetriever): ] return cast(List[Chunk], reduce(lambda x, y: x + y, candidates)) else: - if not self._connection: + if not self._connector: raise RuntimeError("RDBMSConnector connection is required.") - table_summaries = _parse_db_summary(self._connection) + table_summaries = _parse_db_summary(self._connector) return [Chunk(content=table_summary) for table_summary in table_summaries] def _retrieve_with_score(self, query: str, score_threshold: float) -> List[Chunk]: @@ -173,6 +175,6 @@ class DBSchemaRetriever(BaseRetriever): """Similar search.""" from dbgpt.rag.summary.rdbms_db_summary import _parse_db_summary - if not self._connection: + if not self._connector: raise RuntimeError("RDBMSConnector connection is required.") - return _parse_db_summary(self._connection) + return _parse_db_summary(self._connector) diff --git a/dbgpt/rag/retriever/tests/test_db_struct.py b/dbgpt/rag/retriever/tests/test_db_struct.py index 109229a41..5138d8510 100644 --- a/dbgpt/rag/retriever/tests/test_db_struct.py +++ b/dbgpt/rag/retriever/tests/test_db_struct.py @@ -24,7 +24,7 @@ def mock_vector_store_connector(): @pytest.fixture def dbstruct_retriever(mock_db_connection, mock_vector_store_connector): return DBSchemaRetriever( - connection=mock_db_connection, + connector=mock_db_connection, vector_store_connector=mock_vector_store_connector, ) diff --git a/dbgpt/rag/schemalinker/schema_linking.py b/dbgpt/rag/schemalinker/schema_linking.py index 4897aed49..a83c5ca17 100644 --- a/dbgpt/rag/schemalinker/schema_linking.py +++ b/dbgpt/rag/schemalinker/schema_linking.py @@ -10,7 +10,7 @@ from dbgpt.core import ( ModelMessageRoleType, ModelRequest, ) -from dbgpt.datasource.rdbms.base import RDBMSConnector +from dbgpt.datasource.base import BaseConnector from dbgpt.rag.schemalinker.base_linker import BaseSchemaLinker from dbgpt.rag.summary.rdbms_db_summary import _parse_db_summary from dbgpt.storage.vector_store.connector import VectorStoreConnector @@ -42,7 +42,7 @@ class SchemaLinking(BaseSchemaLinker): def __init__( self, - connection: RDBMSConnector, + connector: BaseConnector, model_name: str, llm: LLMClient, top_k: int = 5, @@ -52,19 +52,19 @@ class SchemaLinking(BaseSchemaLinker): """Create the schema linking instance. Args: - connection (Optional[RDBMSConnector]): RDBMSConnector connection. + connection (Optional[BaseConnector]): BaseConnector connection. llm (Optional[LLMClient]): base llm """ super().__init__(**kwargs) self._top_k = top_k - self._connection = connection + self._connector = connector self._llm = llm self._model_name = model_name self._vector_store_connector = vector_store_connector def _schema_linking(self, query: str) -> List: """Get all db schema info.""" - table_summaries = _parse_db_summary(self._connection) + table_summaries = _parse_db_summary(self._connector) chunks = [Chunk(content=table_summary) for table_summary in table_summaries] chunks_content = [chunk.content for chunk in chunks] return chunks_content diff --git a/dbgpt/rag/summary/db_summary_client.py b/dbgpt/rag/summary/db_summary_client.py index ab88a3940..1fb48c7b9 100644 --- a/dbgpt/rag/summary/db_summary_client.py +++ b/dbgpt/rag/summary/db_summary_client.py @@ -97,10 +97,10 @@ class DBSummaryClient: vector_store_config=vector_store_config, ) if not vector_connector.vector_name_exists(): - from dbgpt.serve.rag.assembler.db_schema import DBSchemaAssembler + from dbgpt.rag.assembler.db_schema import DBSchemaAssembler db_assembler = DBSchemaAssembler.load_from_connection( - connection=db_summary_client.db, vector_store_connector=vector_connector + connector=db_summary_client.db, vector_store_connector=vector_connector ) if len(db_assembler.get_chunks()) > 0: db_assembler.persist() diff --git a/dbgpt/rag/summary/rdbms_db_summary.py b/dbgpt/rag/summary/rdbms_db_summary.py index 54e30d20b..6397b53d3 100644 --- a/dbgpt/rag/summary/rdbms_db_summary.py +++ b/dbgpt/rag/summary/rdbms_db_summary.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, List, Optional from dbgpt._private.config import Config -from dbgpt.datasource.rdbms.base import RDBMSConnector +from dbgpt.datasource import BaseConnector from dbgpt.rag.summary.db_summary import DBSummary if TYPE_CHECKING: @@ -64,12 +64,12 @@ class RdbmsSummary(DBSummary): def _parse_db_summary( - conn: RDBMSConnector, summary_template: str = "{table_name}({columns})" + conn: BaseConnector, summary_template: str = "{table_name}({columns})" ) -> List[str]: """Get db summary for database. Args: - conn (RDBMSConnector): database connection + conn (BaseConnector): database connection summary_template (str): summary template """ tables = conn.get_table_names() @@ -81,12 +81,12 @@ def _parse_db_summary( def _parse_table_summary( - conn: RDBMSConnector, summary_template: str, table_name: str + conn: BaseConnector, summary_template: str, table_name: str ) -> str: """Get table summary for table. Args: - conn (RDBMSConnector): database connection + conn (BaseConnector): database connection summary_template (str): summary template table_name (str): table name diff --git a/dbgpt/serve/rag/assembler/db_schema.py b/dbgpt/serve/rag/assembler/db_schema.py deleted file mode 100644 index b5fe877bf..000000000 --- a/dbgpt/serve/rag/assembler/db_schema.py +++ /dev/null @@ -1,153 +0,0 @@ -from typing import Any, List, Optional - -from dbgpt.core import Chunk -from dbgpt.datasource.rdbms.base import RDBMSConnector -from dbgpt.rag.chunk_manager import ChunkManager, ChunkParameters -from dbgpt.rag.embedding.embedding_factory import EmbeddingFactory -from dbgpt.rag.knowledge.base import ChunkStrategy, Knowledge -from dbgpt.rag.knowledge.factory import KnowledgeFactory -from dbgpt.rag.retriever.db_schema import DBSchemaRetriever -from dbgpt.rag.summary.rdbms_db_summary import _parse_db_summary -from dbgpt.serve.rag.assembler.base import BaseAssembler -from dbgpt.storage.vector_store.connector import VectorStoreConnector - - -class DBSchemaAssembler(BaseAssembler): - """DBSchemaAssembler - Example: - .. code-block:: python - - from dbgpt.datasource.rdbms.conn_sqlite import SQLiteTempConnector - from dbgpt.serve.rag.assembler.db_struct import DBSchemaAssembler - from dbgpt.storage.vector_store.connector import VectorStoreConnector - from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig - - connection = SQLiteTempConnector.create_temporary_db() - assembler = DBSchemaAssembler.load_from_connection( - connection=connection, - embedding_model=embedding_model_path, - ) - assembler.persist() - # get db struct retriever - retriever = assembler.as_retriever(top_k=3) - """ - - def __init__( - self, - connection: RDBMSConnector = None, - chunk_parameters: Optional[ChunkParameters] = None, - embedding_model: Optional[str] = None, - embedding_factory: Optional[EmbeddingFactory] = None, - vector_store_connector: Optional[VectorStoreConnector] = None, - **kwargs: Any, - ) -> None: - """Initialize with Embedding Assembler arguments. - Args: - connection: (RDBMSConnector) RDBMSConnector connection. - knowledge: (Knowledge) Knowledge datasource. - chunk_manager: (Optional[ChunkManager]) ChunkManager to use for chunking. - embedding_model: (Optional[str]) Embedding model to use. - embedding_factory: (Optional[EmbeddingFactory]) EmbeddingFactory to use. - vector_store_connector: (Optional[VectorStoreConnector]) VectorStoreConnector to use. - """ - if connection is None: - raise ValueError("datasource connection must be provided.") - self._connection = connection - self._vector_store_connector = vector_store_connector - from dbgpt.rag.embedding.embedding_factory import DefaultEmbeddingFactory - - self._embedding_model = embedding_model - if self._embedding_model: - embedding_factory = embedding_factory or DefaultEmbeddingFactory( - default_model_name=self._embedding_model - ) - self.embedding_fn = embedding_factory.create(self._embedding_model) - if self._vector_store_connector.vector_store_config.embedding_fn is None: - self._vector_store_connector.vector_store_config.embedding_fn = ( - self.embedding_fn - ) - - super().__init__( - chunk_parameters=chunk_parameters, - **kwargs, - ) - - @classmethod - def load_from_connection( - cls, - connection: RDBMSConnector = None, - knowledge: Optional[Knowledge] = None, - chunk_parameters: Optional[ChunkParameters] = None, - embedding_model: Optional[str] = None, - embedding_factory: Optional[EmbeddingFactory] = None, - vector_store_connector: Optional[VectorStoreConnector] = None, - ) -> "DBSchemaAssembler": - """Load document embedding into vector store from path. - Args: - connection: (RDBMSConnector) RDBMSDatabase connection. - knowledge: (Knowledge) Knowledge datasource. - chunk_parameters: (Optional[ChunkParameters]) ChunkManager to use for chunking. - embedding_model: (Optional[str]) Embedding model to use. - embedding_factory: (Optional[EmbeddingFactory]) EmbeddingFactory to use. - vector_store_connector: (Optional[VectorStoreConnector]) VectorStoreConnector to use. - Returns: - DBSchemaAssembler - """ - embedding_factory = embedding_factory - chunk_parameters = chunk_parameters or ChunkParameters( - chunk_strategy=ChunkStrategy.CHUNK_BY_SIZE.name, chunk_overlap=0 - ) - - return cls( - connection=connection, - knowledge=knowledge, - embedding_model=embedding_model, - chunk_parameters=chunk_parameters, - embedding_factory=embedding_factory, - vector_store_connector=vector_store_connector, - ) - - def load_knowledge(self, knowledge: Optional[Knowledge] = None) -> None: - table_summaries = _parse_db_summary(self._connection) - self._chunks = [] - self._knowledge = knowledge - for table_summary in table_summaries: - from dbgpt.rag.knowledge.base import KnowledgeType - - self._knowledge = KnowledgeFactory.from_text( - text=table_summary, knowledge_type=KnowledgeType.DOCUMENT - ) - self._chunk_parameters.chunk_size = len(table_summary) - self._chunk_manager = ChunkManager( - knowledge=self._knowledge, chunk_parameter=self._chunk_parameters - ) - self._chunks.extend(self._chunk_manager.split(self._knowledge.load())) - - def get_chunks(self) -> List[Chunk]: - """Return chunk ids.""" - return self._chunks - - def persist(self) -> List[str]: - """Persist chunks into vector store. - - Returns: - List[str]: List of chunk ids. - """ - return self._vector_store_connector.load_document(self._chunks) - - def _extract_info(self, chunks) -> List[Chunk]: - """Extract info from chunks.""" - - def as_retriever(self, top_k: Optional[int] = 4) -> DBSchemaRetriever: - """ - Args: - top_k:(Optional[int]), default 4 - Returns: - DBSchemaRetriever - """ - return DBSchemaRetriever( - top_k=top_k, - connection=self._connection, - is_embeddings=True, - vector_store_connector=self._vector_store_connector, - ) diff --git a/dbgpt/serve/rag/operators/db_schema.py b/dbgpt/serve/rag/operators/db_schema.py deleted file mode 100644 index b0affd0a3..000000000 --- a/dbgpt/serve/rag/operators/db_schema.py +++ /dev/null @@ -1,36 +0,0 @@ -from typing import Any, Optional - -from dbgpt.core.awel.task.base import IN -from dbgpt.datasource.rdbms.base import RDBMSConnector -from dbgpt.serve.rag.assembler.db_schema import DBSchemaAssembler -from dbgpt.serve.rag.operators.base import AssemblerOperator -from dbgpt.storage.vector_store.connector import VectorStoreConnector - - -class DBSchemaAssemblerOperator(AssemblerOperator[Any, Any]): - """The DBSchema Assembler Operator. - Args: - connection (RDBMSConnector): The connection. - chunk_parameters (Optional[ChunkParameters], optional): The chunk parameters. Defaults to None. - vector_store_connector (VectorStoreConnector, optional): The vector store connector. Defaults to None. - """ - - def __init__( - self, - connection: RDBMSConnector = None, - vector_store_connector: Optional[VectorStoreConnector] = None, - **kwargs - ): - self._connection = connection - self._vector_store_connector = vector_store_connector - self._assembler = DBSchemaAssembler.load_from_connection( - connection=self._connection, - vector_store_connector=self._vector_store_connector, - ) - super().__init__(**kwargs) - - def assemble(self, input_value: IN) -> Any: - """assemble knowledge for input value.""" - if self._vector_store_connector: - self._assembler.persist() - return self._assembler.get_chunks() diff --git a/dbgpt/serve/rag/operators/embedding.py b/dbgpt/serve/rag/operators/embedding.py deleted file mode 100644 index 3dd32e29b..000000000 --- a/dbgpt/serve/rag/operators/embedding.py +++ /dev/null @@ -1,44 +0,0 @@ -from typing import Any, Optional - -from dbgpt.core.awel.task.base import IN -from dbgpt.rag.chunk_manager import ChunkParameters -from dbgpt.rag.knowledge.base import Knowledge -from dbgpt.serve.rag.assembler.embedding import EmbeddingAssembler -from dbgpt.serve.rag.operators.base import AssemblerOperator -from dbgpt.storage.vector_store.connector import VectorStoreConnector - - -class EmbeddingAssemblerOperator(AssemblerOperator[Any, Any]): - """The Embedding Assembler Operator. - Args: - knowledge (Knowledge): The knowledge. - chunk_parameters (Optional[ChunkParameters], optional): The chunk parameters. Defaults to None. - vector_store_connector (VectorStoreConnector, optional): The vector store connector. Defaults to None. - """ - - def __init__( - self, - chunk_parameters: Optional[ChunkParameters] = ChunkParameters( - chunk_strategy="CHUNK_BY_SIZE" - ), - vector_store_connector: VectorStoreConnector = None, - **kwargs - ): - """ - Args: - chunk_parameters (Optional[ChunkParameters], optional): The chunk parameters. Defaults to ChunkParameters(chunk_strategy="CHUNK_BY_SIZE"). - vector_store_connector (VectorStoreConnector, optional): The vector store connector. Defaults to None. - """ - self._chunk_parameters = chunk_parameters - self._vector_store_connector = vector_store_connector - super().__init__(**kwargs) - - def assemble(self, knowledge: IN) -> Any: - """assemble knowledge for input value.""" - assembler = EmbeddingAssembler.load_from_knowledge( - knowledge=knowledge, - chunk_parameters=self._chunk_parameters, - vector_store_connector=self._vector_store_connector, - ) - assembler.persist() - return assembler.get_chunks() diff --git a/dbgpt/serve/rag/assembler/tests/__init__.py b/dbgpt/serve/rag/retriever/__init__.py similarity index 100% rename from dbgpt/serve/rag/assembler/tests/__init__.py rename to dbgpt/serve/rag/retriever/__init__.py diff --git a/dbgpt/serve/rag/service/service.py b/dbgpt/serve/rag/service/service.py index 4cb100c50..6a167c87d 100644 --- a/dbgpt/serve/rag/service/service.py +++ b/dbgpt/serve/rag/service/service.py @@ -23,6 +23,7 @@ from dbgpt.configs.model_config import ( ) from dbgpt.core import Chunk from dbgpt.core.awel.dag.dag_manager import DAGManager +from dbgpt.rag.assembler import EmbeddingAssembler from dbgpt.rag.chunk_manager import ChunkParameters from dbgpt.rag.embedding import EmbeddingFactory from dbgpt.rag.knowledge import ChunkStrategy, KnowledgeFactory, KnowledgeType @@ -43,7 +44,6 @@ from ..api.schemas import ( SpaceServeRequest, SpaceServeResponse, ) -from ..assembler.embedding import EmbeddingAssembler from ..config import SERVE_CONFIG_KEY_PREFIX, SERVE_SERVICE_COMPONENT_NAME, ServeConfig from ..models.models import KnowledgeSpaceDao, KnowledgeSpaceEntity diff --git a/dbgpt/storage/vector_store/chroma_store.py b/dbgpt/storage/vector_store/chroma_store.py index 453e45691..fca8f184e 100644 --- a/dbgpt/storage/vector_store/chroma_store.py +++ b/dbgpt/storage/vector_store/chroma_store.py @@ -27,8 +27,7 @@ class ChromaVectorConfig(VectorStoreConfig): persist_path: str = Field( default=os.getenv("CHROMA_PERSIST_PATH", None), - description="The password of vector store, if not set, will use the default " - "password.", + description="the persist path of vector store.", ) collection_metadata: dict = Field( default=None, diff --git a/dbgpt/util/chat_util.py b/dbgpt/util/chat_util.py index 0755ef706..490f21a5f 100644 --- a/dbgpt/util/chat_util.py +++ b/dbgpt/util/chat_util.py @@ -1,19 +1,21 @@ import asyncio from typing import Any, Coroutine, List -from dbgpt.app.scene import BaseChat, ChatFactory - -chat_factory = ChatFactory() - async def llm_chat_response_nostream(chat_scene: str, **chat_param): """llm_chat_response_nostream""" + from dbgpt.app.scene import BaseChat, ChatFactory + + chat_factory = ChatFactory() chat: BaseChat = chat_factory.get_implementation(chat_scene, **chat_param) res = await chat.get_llm_response() return res async def llm_chat_response(chat_scene: str, **chat_param): + from dbgpt.app.scene import BaseChat, ChatFactory + + chat_factory = ChatFactory() chat: BaseChat = chat_factory.get_implementation(chat_scene, **chat_param) return chat.stream_call() diff --git a/dbgpt/util/parameter_utils.py b/dbgpt/util/parameter_utils.py index e4ea48ec6..2c1af025d 100644 --- a/dbgpt/util/parameter_utils.py +++ b/dbgpt/util/parameter_utils.py @@ -226,7 +226,7 @@ class EnvArgumentParser: **kwargs, ) -> Any: """Parse parameters from environment variables and command lines and populate them into data class""" - parser = argparse.ArgumentParser() + parser = argparse.ArgumentParser(allow_abbrev=False) for field in fields(dataclass_type): env_var_value: Any = _genenv_ignoring_key_case_with_prefixes( field.name, env_prefixes diff --git a/docs/docs/api/introduction.md b/docs/docs/api/introduction.md index 6354982ae..7d132c591 100644 --- a/docs/docs/api/introduction.md +++ b/docs/docs/api/introduction.md @@ -34,4 +34,10 @@ API_KEYS - The list of API keys that are allowed to access the API. Each of the API_KEYS=dbgpt ``` +## Installation +If you use Python, you should install the official DB-GPT Client package from PyPI: + +```bash +pip install "dbgpt[client]>=0.5.2" +``` diff --git a/docs/docs/awel/awel_tutorial/getting_started/1.1_hello_world.md b/docs/docs/awel/awel_tutorial/getting_started/1.1_hello_world.md index 0b6b81e8e..ac8a4e05b 100644 --- a/docs/docs/awel/awel_tutorial/getting_started/1.1_hello_world.md +++ b/docs/docs/awel/awel_tutorial/getting_started/1.1_hello_world.md @@ -40,7 +40,7 @@ awel-tutorial ## Adding DB-GPT Dependency ```bash -poetry add "dbgpt>=0.5.1rc0" +poetry add "dbgpt>=0.5.1" ``` ## First Hello World diff --git a/docs/docs/awel/cookbook/first_rag_with_awel.md b/docs/docs/awel/cookbook/first_rag_with_awel.md new file mode 100644 index 000000000..a2f0757ae --- /dev/null +++ b/docs/docs/awel/cookbook/first_rag_with_awel.md @@ -0,0 +1,358 @@ +# RAG With AWEL + +In this example, we will show how to use the AWEL library to create a RAG program. + +Now, let us create a python file `first_rag_with_awel.py`. + +In this example, we will load your knowledge from a URL and store it in a vector store. + +### Install Dependencies + +First, you need to install the `dbgpt` library. + +```bash +pip install "dbgpt[rag]>=0.5.2" +```` + +### Prepare Embedding Model + +To store the knowledge in a vector store, we need an embedding model, DB-GPT supports +a lot of embedding models, here are some of them: + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + + +```python +from dbgpt.rag.embedding import DefaultEmbeddingFactory + +embeddings = DefaultEmbeddingFactory.openai() +``` + + + + +```python +from dbgpt.rag.embedding import DefaultEmbeddingFactory + +embeddings = DefaultEmbeddingFactory.default("/data/models/text2vec-large-chinese") +``` + + + + +If you have deployed [DB-GPT cluster](/docs/installation/model_service/cluster) and +[API server](/docs/installation/advanced_usage/OpenAI_SDK_call) +, you can connect to the API server to get the embeddings. + +```python +from dbgpt.rag.embedding import DefaultEmbeddingFactory + +embeddings = DefaultEmbeddingFactory.remote( + api_url="http://localhost:8100/api/v1/embeddings", + api_key="{your_api_key}", + model_name="text2vec" +) +``` + + + +### Load Knowledge And Store In Vector Store + +Then we can create a DAG which loads the knowledge from a URL and stores it in a vector +store. + +```python +import asyncio +import shutil +from dbgpt.core.awel import DAG +from dbgpt.rag import ChunkParameters +from dbgpt.rag.knowledge import KnowledgeType +from dbgpt.rag.operators import EmbeddingAssemblerOperator, KnowledgeOperator +from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig +from dbgpt.storage.vector_store.connector import VectorStoreConnector + +# Delete old vector store directory(/tmp/awel_rag_test_vector_store) +shutil.rmtree("/tmp/awel_rag_test_vector_store", ignore_errors=True) + +vector_connector = VectorStoreConnector.from_default( + "Chroma", + vector_store_config=ChromaVectorConfig( + name="test_vstore", + persist_path="/tmp/awel_rag_test_vector_store", + ), + embedding_fn=embeddings +) + +with DAG("load_knowledge_dag") as knowledge_dag: + # Load knowledge from URL + knowledge_task = KnowledgeOperator(knowledge_type=KnowledgeType.URL.name) + assembler_task = EmbeddingAssemblerOperator( + vector_store_connector=vector_connector, + chunk_parameters=ChunkParameters(chunk_strategy="CHUNK_BY_SIZE") + ) + knowledge_task >> assembler_task + +chunks = asyncio.run(assembler_task.call("https://docs.dbgpt.site/docs/latest/awel/")) +print(f"Chunk length: {len(chunks)}") +``` + +### Retrieve Knowledge From Vector Store + +Then you can retrieve the knowledge from the vector store. + +```python + +from dbgpt.core.awel import MapOperator +from dbgpt.rag.operators import EmbeddingRetrieverOperator + +with DAG("retriever_dag") as retriever_dag: + retriever_task = EmbeddingRetrieverOperator( + top_k=3, + vector_store_connector=vector_connector, + ) + content_task = MapOperator(lambda cks: "\n".join(c.content for c in cks)) + retriever_task >> content_task + +chunks = asyncio.run(content_task.call("What is the AWEL?")) +print(chunks) +``` + +### Prepare LLM + +To build a RAG program, we need a LLM, here are some of the LLMs that DB-GPT supports: + + + + +First, you should install the `openai` library. + +```bash +pip install openai +``` +Then set your API key in the environment `OPENAI_API_KEY`. + +```python +from dbgpt.model.proxy import OpenAILLMClient + +llm_client = OpenAILLMClient() +``` + + + + +You should have a YI account and get the API key from the YI official website. + +First, you should install the `openai` library. + +```bash +pip install openai +``` + +Then set your API key in the environment variable `YI_API_KEY`. + +```python +from dbgpt.model.proxy import YiLLMClient + +llm_client = YiLLMClient() +``` + + + + +If you have deployed [DB-GPT cluster](/docs/installation/model_service/cluster) and +[API server](/docs/installation/advanced_usage/OpenAI_SDK_call) +, you can connect to the API server to get the LLM model. + +The API is compatible with the OpenAI API, so you can use the OpenAILLMClient to +connect to the API server. + +First you should install the `openai` library. +```bash +pip install openai +``` + +```python +from dbgpt.model.proxy import OpenAILLMClient + +llm_client = OpenAILLMClient(api_base="http://localhost:8100/api/v1/", api_key="{your_api_key}") +``` + + + + +### Create RAG Program + +Lastly, we can create a RAG with the retrieved knowledge. + +```python + +from dbgpt.core.awel import InputOperator, JoinOperator, InputSource +from dbgpt.core.operators import PromptBuilderOperator, RequestBuilderOperator +from dbgpt.model.operators import LLMOperator + +prompt = """Based on the known information below, provide users with professional and concise answers to their questions. +If the answer cannot be obtained from the provided content, please say: +"The information provided in the knowledge base is not sufficient to answer this question.". +It is forbidden to make up information randomly. When answering, it is best to summarize according to points 1.2.3. + known information: + {context} + question: + {question} +""" + +with DAG("llm_rag_dag") as rag_dag: + input_task = InputOperator(input_source=InputSource.from_callable()) + retriever_task = EmbeddingRetrieverOperator( + top_k=3, + vector_store_connector=vector_connector, + ) + content_task = MapOperator(lambda cks: "\n".join(c.content for c in cks)) + + merge_task = JoinOperator(lambda context, question: {"context": context, "question": question}) + + prompt_task = PromptBuilderOperator(prompt) + # The model is gpt-3.5-turbo, you can replace it with other models. + req_build_task = RequestBuilderOperator(model="gpt-3.5-turbo") + llm_task = LLMOperator(llm_client=llm_client) + result_task = MapOperator(lambda r: r.text) + + input_task >> retriever_task >> content_task >> merge_task + input_task >> merge_task + + merge_task >> prompt_task >> req_build_task >> llm_task >> result_task + +print(asyncio.run(result_task.call("What is the AWEL?"))) +``` +The output will be: + +```bash +AWEL stands for Agentic Workflow Expression Language, which is a set of intelligent agent workflow expression language designed for large model application development. It simplifies the process by providing functionality and flexibility through its layered API design architecture, including the operator layer, AgentFrame layer, and DSL layer. Its goal is to allow developers to focus on business logic for LLMs applications without having to deal with intricate model and environment details. +``` + +Congratulations! You have created a RAG program with AWEL. + +### Full Code + +And let's look the full code of `first_rag_with_awel.py`: + +```python +import asyncio +import shutil +from dbgpt.core.awel import DAG, MapOperator, InputOperator, JoinOperator, InputSource +from dbgpt.core.operators import PromptBuilderOperator, RequestBuilderOperator +from dbgpt.rag import ChunkParameters +from dbgpt.rag.knowledge import KnowledgeType +from dbgpt.rag.operators import EmbeddingAssemblerOperator, KnowledgeOperator, EmbeddingRetrieverOperator +from dbgpt.rag.embedding import DefaultEmbeddingFactory +from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig +from dbgpt.storage.vector_store.connector import VectorStoreConnector +from dbgpt.model.operators import LLMOperator +from dbgpt.model.proxy import OpenAILLMClient + +# Here we use the openai embedding model, if you want to use other models, you can +# replace it according to the previous example. +embeddings = DefaultEmbeddingFactory.openai() +# Here we use the openai LLM model, if you want to use other models, you can replace +# it according to the previous example. +llm_client = OpenAILLMClient() + +# Delete old vector store directory(/tmp/awel_rag_test_vector_store) +shutil.rmtree("/tmp/awel_rag_test_vector_store", ignore_errors=True) + +vector_connector = VectorStoreConnector.from_default( + "Chroma", + vector_store_config=ChromaVectorConfig( + name="test_vstore", + persist_path="/tmp/awel_rag_test_vector_store", + ), + embedding_fn=embeddings +) + +with DAG("load_knowledge_dag") as knowledge_dag: + # Load knowledge from URL + knowledge_task = KnowledgeOperator(knowledge_type=KnowledgeType.URL.name) + assembler_task = EmbeddingAssemblerOperator( + vector_store_connector=vector_connector, + chunk_parameters=ChunkParameters(chunk_strategy="CHUNK_BY_SIZE") + ) + knowledge_task >> assembler_task + +chunks = asyncio.run(assembler_task.call("https://docs.dbgpt.site/docs/latest/awel/")) +print(f"Chunk length: {len(chunks)}\n") + + +prompt = """Based on the known information below, provide users with professional and concise answers to their questions. +If the answer cannot be obtained from the provided content, please say: +"The information provided in the knowledge base is not sufficient to answer this question.". +It is forbidden to make up information randomly. When answering, it is best to summarize according to points 1.2.3. + known information: + {context} + question: + {question} +""" + + +with DAG("llm_rag_dag") as rag_dag: + input_task = InputOperator(input_source=InputSource.from_callable()) + retriever_task = EmbeddingRetrieverOperator( + top_k=3, + vector_store_connector=vector_connector, + ) + content_task = MapOperator(lambda cks: "\n".join(c.content for c in cks)) + + merge_task = JoinOperator(lambda context, question: {"context": context, "question": question}) + + prompt_task = PromptBuilderOperator(prompt) + # The model is gpt-3.5-turbo, you can replace it with other models. + req_build_task = RequestBuilderOperator(model="gpt-3.5-turbo") + llm_task = LLMOperator(llm_client=llm_client) + result_task = MapOperator(lambda r: r.text) + + input_task >> retriever_task >> content_task >> merge_task + input_task >> merge_task + + merge_task >> prompt_task >> req_build_task >> llm_task >> result_task + +print(asyncio.run(result_task.call("What is the AWEL?"))) +``` + +### Visualize DAGs + +And we can visualize the DAGs with the following code: + +```python +knowledge_dag.visualize_dag() +rag_dag.visualize_dag() +``` +If you execute the code in Jupyter Notebook, you can see the DAGs in the notebook. + +```python +display(knowledge_dag.show()) +display(rag_dag.show()) +``` + +The graph of the `knowledge_dag` is: + +

+ +

+ +And the graph of the `rag_dag` is: +

+ +

+ diff --git a/docs/sidebars.js b/docs/sidebars.js index 4f76fdcc8..00b094e2e 100755 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -68,6 +68,10 @@ const sidebars = { type: "doc", id: "awel/cookbook/multi_round_chat_withllm" }, + { + type:"doc", + id: "awel/cookbook/first_rag_with_awel" + } ], link: { type: 'generated-index', diff --git a/docs/static/img/awel/cookbook/first_rag_knowledge_dag.png b/docs/static/img/awel/cookbook/first_rag_knowledge_dag.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd699eca06b8704818d8778a21ad501c6f5393d GIT binary patch literal 88387 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/awel/cookbook/first_rag_rag_dag.png b/docs/static/img/awel/cookbook/first_rag_rag_dag.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbe6f07f277cc00c435f28dbfa9c1c8f4415906 GIT binary patch literal 189669 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

4#>_Fc%0F`?h!Xa+M=52p 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 O00f?{elF{r5}E+O>TQ|; literal 0 HcmV?d00001 diff --git a/examples/awel/simple_nl_schema_sql_chart_example.py b/examples/awel/simple_nl_schema_sql_chart_example.py index b430c1307..8466cda2d 100644 --- a/examples/awel/simple_nl_schema_sql_chart_example.py +++ b/examples/awel/simple_nl_schema_sql_chart_example.py @@ -10,7 +10,7 @@ from dbgpt.core.awel import DAG, HttpTrigger, JoinOperator, MapOperator from dbgpt.datasource.rdbms.base import RDBMSConnector from dbgpt.datasource.rdbms.conn_sqlite import SQLiteTempConnector from dbgpt.model.proxy import OpenAILLMClient -from dbgpt.rag.embedding.embedding_factory import DefaultEmbeddingFactory +from dbgpt.rag.embedding import DefaultEmbeddingFactory from dbgpt.rag.operators.schema_linking import SchemaLinkingOperator from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig from dbgpt.storage.vector_store.connector import VectorStoreConnector @@ -181,13 +181,13 @@ class SqlGenOperator(MapOperator[Any, Any]): class SqlExecOperator(MapOperator[Any, Any]): """The Sql Execution Operator.""" - def __init__(self, connection: Optional[RDBMSConnector] = None, **kwargs): + def __init__(self, connector: Optional[RDBMSConnector] = None, **kwargs): """ Args: connection (Optional[RDBMSConnector]): RDBMSConnector connection """ super().__init__(**kwargs) - self._connection = connection + self._connector = connector def map(self, sql: str) -> DataFrame: """retrieve table schemas. @@ -196,7 +196,7 @@ class SqlExecOperator(MapOperator[Any, Any]): Return: str: sql execution """ - dataframe = self._connection.run_to_df(command=sql, fetch="all") + dataframe = self._connector.run_to_df(command=sql, fetch="all") print(f"sql data is \n{dataframe}") return dataframe @@ -237,12 +237,12 @@ with DAG("simple_nl_schema_sql_chart_example") as dag: llm = OpenAILLMClient() model_name = "gpt-3.5-turbo" retriever_task = SchemaLinkingOperator( - connection=_create_temporary_connection(), llm=llm, model_name=model_name + connector=_create_temporary_connection(), llm=llm, model_name=model_name ) prompt_join_operator = JoinOperator(combine_function=_prompt_join_fn) sql_gen_operator = SqlGenOperator(llm=llm, model_name=model_name) - sql_exec_operator = SqlExecOperator(connection=_create_temporary_connection()) - draw_chart_operator = ChartDrawOperator(connection=_create_temporary_connection()) + sql_exec_operator = SqlExecOperator(connector=_create_temporary_connection()) + draw_chart_operator = ChartDrawOperator(connector=_create_temporary_connection()) trigger >> request_handle_task >> query_operator >> prompt_join_operator ( trigger diff --git a/examples/awel/simple_rag_rewrite_example.py b/examples/awel/simple_rag_rewrite_example.py index 9a13bcbd7..2698f5ae5 100644 --- a/examples/awel/simple_rag_rewrite_example.py +++ b/examples/awel/simple_rag_rewrite_example.py @@ -33,7 +33,7 @@ from typing import Dict from dbgpt._private.pydantic import BaseModel, Field from dbgpt.core.awel import DAG, HttpTrigger, MapOperator from dbgpt.model.proxy import OpenAILLMClient -from dbgpt.rag.operators.rewrite import QueryRewriteOperator +from dbgpt.rag.operators import QueryRewriteOperator class TriggerReqBody(BaseModel): diff --git a/examples/awel/simple_rag_summary_example.py b/examples/awel/simple_rag_summary_example.py index eb958934e..724c71ec7 100644 --- a/examples/awel/simple_rag_summary_example.py +++ b/examples/awel/simple_rag_summary_example.py @@ -31,9 +31,8 @@ from typing import Dict from dbgpt._private.pydantic import BaseModel, Field from dbgpt.core.awel import DAG, HttpTrigger, MapOperator from dbgpt.model.proxy import OpenAILLMClient -from dbgpt.rag.knowledge.base import KnowledgeType -from dbgpt.rag.operators.knowledge import KnowledgeOperator -from dbgpt.rag.operators.summary import SummaryAssemblerOperator +from dbgpt.rag.knowledge import KnowledgeType +from dbgpt.rag.operators import KnowledgeOperator, SummaryAssemblerOperator class TriggerReqBody(BaseModel): diff --git a/examples/rag/db_schema_rag_example.py b/examples/rag/db_schema_rag_example.py index 3e7835fcf..0ce8dc060 100644 --- a/examples/rag/db_schema_rag_example.py +++ b/examples/rag/db_schema_rag_example.py @@ -2,8 +2,8 @@ import os from dbgpt.configs.model_config import MODEL_PATH, PILOT_PATH from dbgpt.datasource.rdbms.conn_sqlite import SQLiteTempConnector +from dbgpt.rag.assembler import DBSchemaAssembler from dbgpt.rag.embedding import DefaultEmbeddingFactory -from dbgpt.serve.rag.assembler.db_schema import DBSchemaAssembler from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig from dbgpt.storage.vector_store.connector import VectorStoreConnector @@ -62,7 +62,7 @@ if __name__ == "__main__": connection = _create_temporary_connection() vector_connector = _create_vector_connector() assembler = DBSchemaAssembler.load_from_connection( - connection=connection, + connector=connection, vector_store_connector=vector_connector, ) assembler.persist() diff --git a/examples/rag/embedding_rag_example.py b/examples/rag/embedding_rag_example.py index d21d662f6..6104e7be9 100644 --- a/examples/rag/embedding_rag_example.py +++ b/examples/rag/embedding_rag_example.py @@ -2,10 +2,10 @@ import asyncio import os from dbgpt.configs.model_config import MODEL_PATH, PILOT_PATH, ROOT_PATH -from dbgpt.rag.chunk_manager import ChunkParameters +from dbgpt.rag import ChunkParameters +from dbgpt.rag.assembler import EmbeddingAssembler from dbgpt.rag.embedding import DefaultEmbeddingFactory from dbgpt.rag.knowledge import KnowledgeFactory -from dbgpt.serve.rag.assembler.embedding import EmbeddingAssembler from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig from dbgpt.storage.vector_store.connector import VectorStoreConnector diff --git a/examples/rag/rag_embedding_api_example.py b/examples/rag/rag_embedding_api_example.py index b7014cdf6..0b95549c7 100644 --- a/examples/rag/rag_embedding_api_example.py +++ b/examples/rag/rag_embedding_api_example.py @@ -27,10 +27,10 @@ import os from typing import Optional from dbgpt.configs.model_config import PILOT_PATH, ROOT_PATH -from dbgpt.rag.chunk_manager import ChunkParameters +from dbgpt.rag import ChunkParameters +from dbgpt.rag.assembler import EmbeddingAssembler from dbgpt.rag.embedding import OpenAPIEmbeddings from dbgpt.rag.knowledge import KnowledgeFactory -from dbgpt.serve.rag.assembler.embedding import EmbeddingAssembler from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig from dbgpt.storage.vector_store.connector import VectorStoreConnector diff --git a/examples/rag/retriever_evaluation_example.py b/examples/rag/retriever_evaluation_example.py index 92c2386ad..02fca5e61 100644 --- a/examples/rag/retriever_evaluation_example.py +++ b/examples/rag/retriever_evaluation_example.py @@ -4,12 +4,12 @@ from typing import Optional from dbgpt.configs.model_config import MODEL_PATH, PILOT_PATH, ROOT_PATH from dbgpt.core import Embeddings -from dbgpt.rag.chunk_manager import ChunkParameters +from dbgpt.rag import ChunkParameters +from dbgpt.rag.assembler import EmbeddingAssembler from dbgpt.rag.embedding import DefaultEmbeddingFactory from dbgpt.rag.evaluation import RetrieverEvaluator from dbgpt.rag.knowledge import KnowledgeFactory from dbgpt.rag.operators import EmbeddingRetrieverOperator -from dbgpt.serve.rag.assembler.embedding import EmbeddingAssembler from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig from dbgpt.storage.vector_store.connector import VectorStoreConnector diff --git a/examples/rag/simple_dbschema_retriever_example.py b/examples/rag/simple_dbschema_retriever_example.py index 90cea6a4c..476e44863 100644 --- a/examples/rag/simple_dbschema_retriever_example.py +++ b/examples/rag/simple_dbschema_retriever_example.py @@ -3,13 +3,13 @@ if you not set vector_store_connector, it will return all tables schema in database. ``` retriever_task = DBSchemaRetrieverOperator( - connection=_create_temporary_connection() + connector=_create_temporary_connection() ) ``` if you set vector_store_connector, it will recall topk similarity tables schema in database. ``` retriever_task = DBSchemaRetrieverOperator( - connection=_create_temporary_connection() + connector=_create_temporary_connection() top_k=1, vector_store_connector=vector_store_connector ) @@ -30,11 +30,10 @@ from pydantic import BaseModel, Field from dbgpt._private.config import Config from dbgpt.configs.model_config import EMBEDDING_MODEL_CONFIG, PILOT_PATH from dbgpt.core import Chunk -from dbgpt.core.awel import DAG, HttpTrigger, JoinOperator, MapOperator +from dbgpt.core.awel import DAG, HttpTrigger, InputOperator, JoinOperator, MapOperator from dbgpt.datasource.rdbms.conn_sqlite import SQLiteTempConnector from dbgpt.rag.embedding import DefaultEmbeddingFactory -from dbgpt.rag.operators import DBSchemaRetrieverOperator -from dbgpt.serve.rag.operators.db_schema import DBSchemaAssemblerOperator +from dbgpt.rag.operators import DBSchemaAssemblerOperator, DBSchemaRetrieverOperator from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig from dbgpt.storage.vector_store.connector import VectorStoreConnector @@ -107,18 +106,19 @@ with DAG("simple_rag_db_schema_example") as dag: request_handle_task = RequestHandleOperator() query_operator = MapOperator(lambda request: request["query"]) vector_store_connector = _create_vector_connector() + connector = _create_temporary_connection() assembler_task = DBSchemaAssemblerOperator( - connection=_create_temporary_connection(), + connector=connector, vector_store_connector=vector_store_connector, ) join_operator = JoinOperator(combine_function=_join_fn) retriever_task = DBSchemaRetrieverOperator( - connection=_create_temporary_connection(), + connector=_create_temporary_connection(), top_k=1, vector_store_connector=vector_store_connector, ) result_parse_task = MapOperator(lambda chunks: [chunk.content for chunk in chunks]) - trigger >> request_handle_task >> assembler_task >> join_operator + trigger >> assembler_task >> join_operator trigger >> request_handle_task >> query_operator >> join_operator join_operator >> retriever_task >> result_parse_task diff --git a/examples/rag/simple_rag_embedding_example.py b/examples/rag/simple_rag_embedding_example.py index 358263c60..103894d45 100644 --- a/examples/rag/simple_rag_embedding_example.py +++ b/examples/rag/simple_rag_embedding_example.py @@ -17,12 +17,11 @@ from typing import Dict, List from pydantic import BaseModel, Field from dbgpt._private.config import Config -from dbgpt.configs.model_config import EMBEDDING_MODEL_CONFIG, MODEL_PATH, PILOT_PATH +from dbgpt.configs.model_config import EMBEDDING_MODEL_CONFIG, PILOT_PATH from dbgpt.core.awel import DAG, HttpTrigger, MapOperator from dbgpt.rag.embedding import DefaultEmbeddingFactory from dbgpt.rag.knowledge import KnowledgeType -from dbgpt.rag.operators import KnowledgeOperator -from dbgpt.serve.rag.operators.embedding import EmbeddingAssemblerOperator +from dbgpt.rag.operators import EmbeddingAssemblerOperator, KnowledgeOperator from dbgpt.storage.vector_store.chroma_store import ChromaVectorConfig from dbgpt.storage.vector_store.connector import VectorStoreConnector diff --git a/examples/rag/summary_extractor_example.py b/examples/rag/summary_extractor_example.py index 385885ef4..0f7f6ec36 100644 --- a/examples/rag/summary_extractor_example.py +++ b/examples/rag/summary_extractor_example.py @@ -22,15 +22,17 @@ import asyncio +import os +from dbgpt.configs.model_config import ROOT_PATH from dbgpt.model.proxy import OpenAILLMClient -from dbgpt.rag.chunk_manager import ChunkParameters +from dbgpt.rag import ChunkParameters +from dbgpt.rag.assembler import SummaryAssembler from dbgpt.rag.knowledge import KnowledgeFactory -from dbgpt.serve.rag.assembler.summary import SummaryAssembler async def main(): - file_path = "./docs/docs/awel.md" + file_path = os.path.join(ROOT_PATH, "docs/docs/awel/awel.md") llm_client = OpenAILLMClient() knowledge = KnowledgeFactory.from_file_path(file_path) chunk_parameters = ChunkParameters(chunk_strategy="CHUNK_BY_SIZE") diff --git a/examples/sdk/simple_sdk_llm_sql_example.py b/examples/sdk/simple_sdk_llm_sql_example.py index 43bc24e97..9bde1e9d2 100644 --- a/examples/sdk/simple_sdk_llm_sql_example.py +++ b/examples/sdk/simple_sdk_llm_sql_example.py @@ -117,7 +117,7 @@ class SQLResultOperator(JoinOperator[Dict]): with DAG("simple_sdk_llm_sql_example") as dag: db_connection = _create_temporary_connection() input_task = InputOperator(input_source=SimpleCallDataInputSource()) - retriever_task = DatasourceRetrieverOperator(connection=db_connection) + retriever_task = DatasourceRetrieverOperator(connector=db_connection) # Merge the input data and the table structure information. prompt_input_task = JoinOperator(combine_function=_join_func) prompt_task = PromptBuilderOperator(_sql_prompt()) @@ -125,7 +125,7 @@ with DAG("simple_sdk_llm_sql_example") as dag: llm_task = BaseLLMOperator(OpenAILLMClient()) out_parse_task = SQLOutputParser() sql_parse_task = MapOperator(map_function=lambda x: x["sql"]) - db_query_task = DatasourceOperator(connection=db_connection) + db_query_task = DatasourceOperator(connector=db_connection) sql_result_task = SQLResultOperator() input_task >> prompt_input_task input_task >> retriever_task >> prompt_input_task diff --git a/setup.py b/setup.py index 1d7af0bcb..df5a70c63 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ with open("README.md", mode="r", encoding="utf-8") as fh: IS_DEV_MODE = os.getenv("IS_DEV_MODE", "true").lower() == "true" # If you modify the version, please modify the version in the following files: # dbgpt/_version.py -DB_GPT_VERSION = os.getenv("DB_GPT_VERSION", "0.5.1") +DB_GPT_VERSION = os.getenv("DB_GPT_VERSION", "0.5.2") BUILD_NO_CACHE = os.getenv("BUILD_NO_CACHE", "true").lower() == "true" LLAMA_CPP_GPU_ACCELERATION = ( @@ -370,8 +370,13 @@ def core_requires(): # For AWEL type checking "typeguard", ] + # For DB-GPT python client SDK + setup_spec.extras["client"] = setup_spec.extras["core"] + [ + "httpx", + "fastapi==0.98.0", + ] # Simple command line dependencies - setup_spec.extras["cli"] = setup_spec.extras["core"] + [ + setup_spec.extras["cli"] = setup_spec.extras["client"] + [ "prettytable", "click", "psutil==5.9.4", @@ -382,10 +387,7 @@ def core_requires(): # we core unit test. # The dependency "framework" is too large for now. setup_spec.extras["simple_framework"] = setup_spec.extras["cli"] + [ - "pydantic<2,>=1", - "httpx", "jinja2", - "fastapi==0.98.0", "uvicorn", "shortuuid", # change from fixed version 2.0.22 to variable version, because other @@ -397,11 +399,12 @@ def core_requires(): # TODO: pympler has not been updated for a long time and needs to # find a new toolkit. "pympler", - "sqlparse==0.4.4", "duckdb==0.8.1", "duckdb-engine", # lightweight python library for scheduling jobs "schedule", + # For datasource subpackage + "sqlparse==0.4.4", ] # TODO: remove fschat from simple_framework if BUILD_FROM_SOURCE: @@ -418,7 +421,6 @@ def core_requires(): "pandas==2.0.3", "auto-gpt-plugin-template", "gTTS==2.3.1", - "langchain>=0.0.286", "pymysql", "jsonschema", # TODO move transformers to default @@ -439,9 +441,10 @@ def core_requires(): def knowledge_requires(): """ - pip install "dbgpt[knowledge]" + pip install "dbgpt[rag]" """ - setup_spec.extras["knowledge"] = [ + setup_spec.extras["rag"] = setup_spec.extras["vstore"] + [ + "langchain>=0.0.286", "spacy==3.5.3", "chromadb==0.4.10", "markdown", @@ -547,8 +550,7 @@ def all_vector_store_requires(): pip install "dbgpt[vstore]" """ setup_spec.extras["vstore"] = [ - "grpcio==1.47.5", # maybe delete it - "pymilvus==2.2.1", + "pymilvus", "weaviate-client", ] @@ -559,6 +561,7 @@ def all_datasource_requires(): """ setup_spec.extras["datasource"] = [ + # "sqlparse==0.4.4", "pymssql", "pymysql", "pyspark", @@ -586,7 +589,7 @@ def openai_requires(): setup_spec.extras["openai"].append("openai") setup_spec.extras["openai"] += setup_spec.extras["framework"] - setup_spec.extras["openai"] += setup_spec.extras["knowledge"] + setup_spec.extras["openai"] += setup_spec.extras["rag"] def gpt4all_requires(): @@ -624,7 +627,8 @@ def default_requires(): "chardet", ] setup_spec.extras["default"] += setup_spec.extras["framework"] - setup_spec.extras["default"] += setup_spec.extras["knowledge"] + setup_spec.extras["default"] += setup_spec.extras["rag"] + setup_spec.extras["default"] += setup_spec.extras["datasource"] setup_spec.extras["default"] += setup_spec.extras["torch"] setup_spec.extras["default"] += setup_spec.extras["quantization"] setup_spec.extras["default"] += setup_spec.extras["cache"] @@ -645,12 +649,12 @@ def init_install_requires(): core_requires() torch_requires() -knowledge_requires() llama_cpp_requires() quantization_requires() all_vector_store_requires() all_datasource_requires() +knowledge_requires() openai_requires() gpt4all_requires() vllm_requires() @@ -675,12 +679,14 @@ else: "dbgpt._private.*", "dbgpt.cli", "dbgpt.cli.*", + "dbgpt.client", + "dbgpt.client.*", "dbgpt.configs", "dbgpt.configs.*", "dbgpt.core", "dbgpt.core.*", - "dbgpt.util", - "dbgpt.util.*", + "dbgpt.datasource", + "dbgpt.datasource.*", "dbgpt.model", "dbgpt.model.proxy", "dbgpt.model.proxy.*", @@ -688,6 +694,13 @@ else: "dbgpt.model.operators.*", "dbgpt.model.utils", "dbgpt.model.utils.*", + "dbgpt.model.adapter", + "dbgpt.rag", + "dbgpt.rag.*", + "dbgpt.storage", + "dbgpt.storage.*", + "dbgpt.util", + "dbgpt.util.*", ], )