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 @@
+
+
+
+ 简体中文 |
+ 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 グループ
+
+
+
+## 参加しましょう
+
+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) に感謝します。
diff --git a/src/backend/bisheng/chat/manager.py b/src/backend/bisheng/chat/manager.py
index d5d173fd4..975a587ec 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)
@@ -232,8 +233,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/database/service.py b/src/backend/bisheng/database/service.py
index 968015c72..1b80751d3 100644
--- a/src/backend/bisheng/database/service.py
+++ b/src/backend/bisheng/database/service.py
@@ -27,7 +27,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)
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:
diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml
index 1b2c09d64..bf14ff5a9 100644
--- a/src/backend/pyproject.toml
+++ b/src/backend/pyproject.toml
@@ -18,7 +18,7 @@ include = ["./bisheng/*", "bisheng/**/*"]
bisheng = "bisheng.__main__:main"
[tool.poetry.dependencies]
-bisheng_langchain = "0.2.2.1"
+bisheng_langchain = "0.2.2.2"
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