From 3cd570f872049087d1a895b6ef6b82ae0cc13fb3 Mon Sep 17 00:00:00 2001 From: Gary Fan Date: Fri, 12 Jan 2024 18:17:24 +0800 Subject: [PATCH 1/4] Address mysql queuepool limit Uploading multiple documents (>10) at once to the knowledge pool sometime fails due to mysql queuepool limit, (pool_size default at 5). Increasing pool_size addresses this issue. --- src/backend/bisheng/database/service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/bisheng/database/service.py b/src/backend/bisheng/database/service.py index b46a64744..fbf234262 100644 --- a/src/backend/bisheng/database/service.py +++ b/src/backend/bisheng/database/service.py @@ -30,7 +30,7 @@ def _create_engine(self) -> 'Engine': connect_args = {'check_same_thread': False} else: connect_args = {} - return create_engine(self.database_url, connect_args=connect_args, pool_pre_ping=True) + return create_engine(self.database_url, connect_args=connect_args, pool_size=100, max_overflow=20, pool_pre_ping=True) def __enter__(self): self._session = Session(self.engine) From ef03f38fed5f6d9a7506d6f3997a778806cc6d38 Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Wed, 17 Jan 2024 16:20:58 +0900 Subject: [PATCH 2/4] add Japanese README --- README.md | 3 +- README_ENG.md | 1 + README_JPN.md | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 README_JPN.md diff --git a/README.md b/README.md index 2055b35f0..26fe60c19 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@

简体中文 | - English + English | + 日本語

diff --git a/README_ENG.md b/README_ENG.md index f5852749c..e0e4670a3 100644 --- a/README_ENG.md +++ b/README_ENG.md @@ -3,6 +3,7 @@

简体中文 | English | + 日本語

diff --git a/README_JPN.md b/README_JPN.md new file mode 100644 index 000000000..074d25f07 --- /dev/null +++ b/README_JPN.md @@ -0,0 +1,145 @@ +Bisheng banner + +

+ 简体中文 | + English | + 日本語 +

+ + +
+ + + + + +
+ +# Bisheng へようこそ + +## Bisheng とは + +Bisheng は、LLM アプリケーション開発のための主要なオープンソースプラットフォームです。Bisheng は、LLM アプリケーションの開発を強化し、加速し、ユーザーが最高の経験を持つ次世代のアプリケーション開発モードに入るのを支援します。 + +"Bisheng" は可動活字印刷の発明者であり、人類の知識の普及に大きな役割を果たしました。"Bisheng" もまた、インテリジェントアプリケーションの広範な着陸のための強力なサポートを提供することができることを願っています。一緒に参加しましょう。 + +Bishengは2023年8月末にApache 2.0 Licenseの下でリリースされた。 + + +## 主な特徴 + +- 利便性: ビジネスパーソンでも、LLM を中心としたインテリジェントなアプリケーションを、あらかじめ設定されたアプリケーションテンプレートに基づき、シンプルで直感的なフォーム入力によって素早く構築することができます。 +- 柔軟性: LLM テクノロジーに精通した方には、LLM テクノロジーエコシステムの最新トレンドに沿った数百の開発コンポーネントを提供しています。視覚的で柔軟なプロセスオーケストレーション機能により、単純なプロンプトプロジェクトだけでなく、あらゆるタイプの LLM アプリケーションを開発することができます。 +- 信頼性とエンタープライズレベル: 同様のオープンソースプロジェクトの多くは、実験的なテストシナリオにしか適しておらず、高同時実行下での高可用性、アプリケーションの操作と効果の継続的な反復と最適化、実際のビジネスシナリオに適合する実用的な機能など、実際の本番環境で使用するためのエンタープライズレベルの機能が欠けています。これらは ByteDance プラットフォームの差別化された機能である。さらに、企業内のデータ品質にはばらつきがある。すべてのデータを真に活用するためには、包括的な非構造化データガバナンス能力が必要であり、これこそが、私たちのチームが過去数年にわたって蓄積してきた中核的機能なのです。Bisheng のデモ環境では、関連コンポーネントを通じてこれらの機能に直接アクセスすることができ、これらの機能は無料で無制限です。 + + +## 製品アプリケーション + +Bishengプラットフォームでは、様々なLLMアプリケーションを構築することができます: + +分析レポート生成: + +- 📃 契約審査レポート生成 +- 🏦 信用調査レポート生成 +- 📈 IPO 分析レポート生成 +- 💼 インテリジェント投資アドバイザリーレポート生成 +- 👀 文書要約生成 + + +ナレッジベース Q&A: + +- 👩‍💻 ユーザーマニュアル Q&A +- 👩‍🔬 調査報告書ナレッジベース Q&A +- 🗄 法規と規則 Q&A +- 💊 「中国薬局方」知識 Q&A +- 📊 株価データベース Q&A + + +対話: + +- 🎭 面接官のロールプレイ +- 📍 小本集(赤本)コピーライティングアシスタント +- 👩‍🎤 外国語教師のロールプレイ +- 👨‍🏫 履歴書最適化アシスタント + + +要素の抽出: + +- 📄 契約書からの主要要素の抽出 +- 🏗️ エンジニアリングレポート要素抽出 +- 🗂️ 一般的なメタデータの抽出 +- 🎫 カードと請求書からのキーエレメントの抽出 + + +様々なアプリケーションを構築する方法については、[アプリケーションケース](https://m7a7tqsztt.feishu.cn/wiki/ZfkmwLPfeiAhQSkK2WvcX87unxc)を参照してください。 + +私たちは、実際の企業シナリオにおいて、「対話」は数ある対話形式のひとつに過ぎないと考えています。 +将来的には、プロセスの自動化や検索など、より多くのアプリケーションのサポートも追加していく予定です。 + + +## クイックスタート + +### Bisheng を始める + +- [Bisheng のインストール](https://m7a7tqsztt.feishu.cn/wiki/BSCcwKd4Yiot3IkOEC8cxGW7nPc) + + +### ソースからの Bisheng のコンパイル + +- [Bisheng のコンパイル](https://dataelem.feishu.cn/wiki/EKdDw0IkyiNSAEkzc29cqKnmn7c) + +より多くのコンテンツを入手するには、[開発ドキュメント](https://m7a7tqsztt.feishu.cn/wiki/ITmJwMXVliBnzpkW3nkcqPVrnse)をお読みください。 + + +## コントリビュート + +Bisheng へのコントリビュートは、どなたでも歓迎いたします。 +パッチの送信とコントリビュートのワークフローの詳細については、[Guidelines for Contributing]((https://github.com/dataelement/bisheng/blob/main/CONTRIBUTING.md)) を参照してください。 +[コミュニティリポジトリ](https://github.com/dataelement/community)を参照し、私たちのガバナンスについて学び、より多くのコミュニティリソースにアクセスしてください。 + + + + +
+ +## Bisheng ドキュメント + +インストール、開発、デプロイ、管理に関する詳しいガイドは、[Bisheng Documentation](https://m7a7tqsztt.feishu.cn/wiki/ZxW6wZyAJicX4WkG0NqcWsbynde) を参照。 + + +## コミュニティ + +- 私たちの [Slack](https://www.dataelem.com/) チャンネルに参加して、提案や問題を共有してください。 +- また、[FAQ](https://m7a7tqsztt.feishu.cn/wiki/XdGCwkDJviC0Z8klbdbcF790n9b) のページでは、よくある質問とその回答をご覧いただけます。 +- また、[ディスカッショングループ](https://github.com/dataelement/bisheng/discussions)に参加して質問やディスカッションをすることもできます。 + + + + +Bisheng をソーシャルメディアでフォローする: + + +- Bisheng 技術交流 WeChat グループ + +Wechat QR Code + +## 参加しましょう + +DataElem Inc. は、Bisheng プロジェクトの運営会社です。アルゴリズム開発者、開発者、フルスタックエンジニアを募集しています。 +次世代インテリジェントアプリケーション開発プラットフォームの構築に向け、共に取り組みましょう。 + + +## 謝辞 + +Bisheng は以下のライブラリを使用しています: + +- オープンソースのモデル推論フレームワーク [Triton](https://github.com/triton-inference-server) に感謝します。 +- オープンソースの LLM アプリケーション開発ライブラリ [LangChain](https://github.com/langchain-ai/langchain) に感謝します。 +- オープンソースの非構造化データ解析エンジン [unstructured](https://github.com/Unstructured-IO/unstructured) に感謝します。 +- オープンソースの LangChain 可視化ツール [langflow](https://github.com/logspace-ai/langflow) に感謝します。 From aab2947d52c1be36b9783be92180562ede5ac4a6 Mon Sep 17 00:00:00 2001 From: yaojin Date: Wed, 17 Jan 2024 18:59:26 +0800 Subject: [PATCH 3/4] up --- src/backend/bisheng/chat/manager.py | 4 ++-- src/backend/bisheng/utils/threadpool.py | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/backend/bisheng/chat/manager.py b/src/backend/bisheng/chat/manager.py index d5d173fd4..9fdb3cafa 100644 --- a/src/backend/bisheng/chat/manager.py +++ b/src/backend/bisheng/chat/manager.py @@ -232,8 +232,8 @@ async def handle_websocket( **process_param) # 处理任务状态 - complete_normal = await thread_pool.as_completed() - autoComplete = await autogen_pool.as_completed() + complete_normal = await thread_pool.as_completed(key_list) + autoComplete = await autogen_pool.as_completed(key_list) complete = complete_normal + autoComplete # if async_task and async_task.done(): # logger.debug(f'async_task_complete result={async_task.result}') diff --git a/src/backend/bisheng/utils/threadpool.py b/src/backend/bisheng/utils/threadpool.py index 91e10bac2..0d4440da5 100644 --- a/src/backend/bisheng/utils/threadpool.py +++ b/src/backend/bisheng/utils/threadpool.py @@ -2,7 +2,7 @@ import concurrent.futures import threading import time -from typing import Dict, List, Tuple +from typing import Dict, List, Set, Tuple from loguru import logger @@ -68,14 +68,16 @@ def start_loop(self, loop): asyncio.set_event_loop(loop) loop.run_forever() - async def as_completed(self) -> List[Tuple[str, concurrent.futures.Future]]: + async def as_completed(self, + key_list: Set[str]) -> List[Tuple[str, concurrent.futures.Future]]: with self.lock: completed_futures = [] for k, lf in list(self.future_dict.items()): for f in lf: if f.done(): - completed_futures.append((k, f)) - self.future_dict[k].remove(f) + if k in key_list: + completed_futures.append((k, f)) + self.future_dict[k].remove(f) if len(lf) == 0: self.future_dict.pop(k) @@ -86,8 +88,9 @@ async def as_completed(self) -> List[Tuple[str, concurrent.futures.Future]]: # 获取task task = f.result() if task.done(): - completed_futures.append((k, task)) - self.async_task[k].remove(f) + if k in key_list: + completed_futures.append((k, task)) + self.async_task[k].remove(f) else: pending_count += 1 if len(lf) == 0: From bc7b3877b58fb214cab5456b15238b0233aa863f Mon Sep 17 00:00:00 2001 From: yaojin Date: Thu, 18 Jan 2024 11:35:37 +0800 Subject: [PATCH 4/4] up --- src/backend/bisheng/chat/manager.py | 15 ++++++++------- src/backend/pyproject.toml | 4 ++++ .../chains/router/rule_router.py | 8 +++++++- .../experimental/fin_glm/rule_router.py | 14 +++++++------- src/bisheng-langchain/version.txt | 2 +- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/backend/bisheng/chat/manager.py b/src/backend/bisheng/chat/manager.py index d5d173fd4..44a378373 100644 --- a/src/backend/bisheng/chat/manager.py +++ b/src/backend/bisheng/chat/manager.py @@ -35,18 +35,19 @@ def add_message( message: ChatMessage, ): """Add a message to the chat history.""" + t1 = time.time() + from bisheng.database.models.message import ChatMessage message.flow_id = client_id message.chat_id = chat_id if chat_id and (message.message or message.intermediate_steps or message.files) and message.type != 'stream': + msg = message.copy() + msg.message = str(msg.message) if isinstance(msg.message, dict) else msg.message + files = json.dumps(msg.files) if msg.files else '' + msg.__dict__.pop('files') + db_message = ChatMessage(files=files, **msg.__dict__) + logger.info(f'chat={db_message} time={time.time()-t1}') with session_getter() as seesion: - from bisheng.database.models.message import ChatMessage - msg = message.copy() - msg.message = str(msg.message) if isinstance(msg.message, dict) else msg.message - files = json.dumps(msg.files) if msg.files else '' - msg.__dict__.pop('files') - db_message = ChatMessage(files=files, **msg.__dict__) - logger.info(f'chat={db_message}') seesion.add(db_message) seesion.commit() seesion.refresh(db_message) diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index 20ee505ca..7b7dbb935 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -18,7 +18,11 @@ include = ["./bisheng/*", "bisheng/**/*"] bisheng = "bisheng.__main__:main" [tool.poetry.dependencies] +<<<<<<< Updated upstream bisheng_langchain = "0.2.2" +======= +bisheng_langchain = "0.2.2.2" +>>>>>>> Stashed changes bisheng_pyautogen = "0.1.19" minio = "7.2.0" loguru = "^0.7.1" diff --git a/src/bisheng-langchain/bisheng_langchain/chains/router/rule_router.py b/src/bisheng-langchain/bisheng_langchain/chains/router/rule_router.py index 79b537cde..2afacc13a 100644 --- a/src/bisheng-langchain/bisheng_langchain/chains/router/rule_router.py +++ b/src/bisheng-langchain/bisheng_langchain/chains/router/rule_router.py @@ -1,3 +1,4 @@ +import asyncio from typing import Any, Callable, Dict, List, Union from langchain.callbacks.manager import Callbacks @@ -41,7 +42,12 @@ async def aroute( inputs: Union[Dict[str, Any], Any], callbacks: Callbacks = None, ) -> Route: - result = await self.rule_function(inputs) + """Route the inputs to the next chain based on the rule function.""" + # 如果是异步function,那么就用await + if asyncio.iscoroutinefunction(self.rule_function): + result = await self.rule_function(inputs) + else: + result = self.rule_function(inputs) if not result.get('destination') or not result: return Route(None, result['next_inputs']) return Route(result['destination'], result['next_inputs']) diff --git a/src/bisheng-langchain/experimental/fin_glm/rule_router.py b/src/bisheng-langchain/experimental/fin_glm/rule_router.py index 23e8a3b66..84b872829 100644 --- a/src/bisheng-langchain/experimental/fin_glm/rule_router.py +++ b/src/bisheng-langchain/experimental/fin_glm/rule_router.py @@ -14,7 +14,7 @@ def input_keys(self): def _validate_outputs(self, outputs: Dict[str, Any]) -> None: super()._validate_outputs(outputs) - if not isinstance(outputs["next_inputs"], dict): + if not isinstance(outputs['next_inputs'], dict): raise ValueError def _call( @@ -23,8 +23,8 @@ def _call( ) -> Route: result = self.rule_function(inputs) if not result.get('destination'): - return Route(None, result["next_inputs"]) - return Route(result["destination"], result["next_inputs"]) + return Route(None, result['next_inputs']) + return Route(result['destination'], result['next_inputs']) def route( self, @@ -33,8 +33,8 @@ def route( ) -> Route: result = self.rule_function(inputs) if not result.get('destination'): - return Route(None, result["next_inputs"]) - return Route(result["destination"], result["next_inputs"]) + return Route(None, result['next_inputs']) + return Route(result['destination'], result['next_inputs']) async def aroute( self, @@ -43,5 +43,5 @@ async def aroute( ) -> Route: result = await self.rule_function(inputs) if not result.get('destination'): - return Route(None, result["next_inputs"]) - return Route(result["destination"], result["next_inputs"]) \ No newline at end of file + return Route(None, result['next_inputs']) + return Route(result['destination'], result['next_inputs']) diff --git a/src/bisheng-langchain/version.txt b/src/bisheng-langchain/version.txt index 21a1154c3..a027cd8ac 100644 --- a/src/bisheng-langchain/version.txt +++ b/src/bisheng-langchain/version.txt @@ -1,2 +1,2 @@ -v0.2.2 +v0.2.2.2