diff --git a/README.md b/README.md
index feaddd4..5cf37c8 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,7 @@
## 🔔 更新
+- [2023.12.26] 基于FastChat接入开源私有化大模型和大模型接口的能力开放
- [2023.12.14] 量子位公众号专题报道:[文章链接](https://mp.weixin.qq.com/s/MuPfayYTk9ZW6lcqgMpqKA)
- [2023.12.01] Multi-Agent和代码库检索功能开放
- [2023.11.15] 增加基于本地代码库的问答增强模式
@@ -41,7 +42,7 @@
- **🔧 垂类专属知识:** 为DevOps领域定制的专属知识库,支持垂类知识库的自助一键构建,便捷实用。
- **🤖 垂类模型兼容:** 针对DevOps领域的小型模型,保证了与DevOps相关平台的兼容性,促进了技术生态的整合。
-🌍 依托于开源的 LLM 与 Embedding 模型,本项目可实现基于开源模型的离线私有部署。此外,本项目也支持 OpenAI API 的调用。
+🌍 依托于开源的 LLM 与 Embedding 模型,本项目可实现基于开源模型的离线私有部署。此外,本项目也支持 OpenAI API 的调用。[接入Demo](sources/readme_docs/fastchat.md)
👥 核心研发团队长期专注于 AIOps + NLP 领域的研究。我们发起了 Codefuse-ai 项目,希望大家广泛贡献高质量的开发和运维文档,共同完善这套解决方案,以实现“让天下没有难做的开发”的目标。
diff --git a/configs/model_config.py.example b/configs/model_config.py.example
index e6d3ad8..e854a82 100644
--- a/configs/model_config.py.example
+++ b/configs/model_config.py.example
@@ -114,6 +114,7 @@ VLLM_MODEL_DICT = {
LOCAL_LLM_MODEL_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "llm_models")
+# 若不想修改模型地址,可取消相关地址设置
llm_model_dict_c = {}
for k, v in llm_model_dict.items():
v_c = {}
@@ -125,6 +126,11 @@ for k, v in llm_model_dict.items():
llm_model_dict_c[k] = v_c
llm_model_dict = llm_model_dict_c
+# 若不想修改模型地址,可取消相关地址设置
+VLLM_MODEL_DICT_c = {}
+for k, v in VLLM_MODEL_DICT.items():
+ VLLM_MODEL_DICT_c[k] = f"/home/user/chatbot/llm_models/{v}" if is_running_in_docker() else f"{LOCAL_LLM_MODEL_DIR}/{v}"
+VLLM_MODEL_DICT = VLLM_MODEL_DICT_c
# LLM 名称
diff --git a/examples/agent_examples/codeChatXX_examply.py b/examples/agent_examples/codeChatXX_examply.py
deleted file mode 100644
index 263e36e..0000000
--- a/examples/agent_examples/codeChatXX_examply.py
+++ /dev/null
@@ -1,59 +0,0 @@
-import os, sys, requests
-
-src_dir = os.path.join(
- os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-)
-sys.path.append(src_dir)
-
-from dev_opsgpt.tools import (
- toLangchainTools, get_tool_schema, DDGSTool, DocRetrieval,
- TOOL_DICT, TOOL_SETS
- )
-
-from configs.model_config import *
-from dev_opsgpt.connector.phase import BasePhase
-from dev_opsgpt.connector.agents import BaseAgent
-from dev_opsgpt.connector.chains import BaseChain
-from dev_opsgpt.connector.schema import (
- Message, Memory, load_role_configs, load_phase_configs, load_chain_configs
- )
-from dev_opsgpt.connector.configs import AGETN_CONFIGS, CHAIN_CONFIGS, PHASE_CONFIGS
-import importlib
-
-tools = toLangchainTools([TOOL_DICT[i] for i in TOOL_SETS if i in TOOL_DICT])
-
-
-role_configs = load_role_configs(AGETN_CONFIGS)
-chain_configs = load_chain_configs(CHAIN_CONFIGS)
-phase_configs = load_phase_configs(PHASE_CONFIGS)
-
-agent_module = importlib.import_module("dev_opsgpt.connector.agents")
-
-
-phase_name = "codeChatPhase"
-phase = BasePhase(phase_name,
- task = None,
- phase_config = PHASE_CONFIGS,
- chain_config = CHAIN_CONFIGS,
- role_config = AGETN_CONFIGS,
- do_summary=False,
- do_code_retrieval=True,
- do_doc_retrieval=False,
- do_search=False,
- )
-
-# 代码一共有多少类 => 基于cypher
-# 代码库里有哪些函数,返回5个就行 => 基于cypher
-# remove 这个函数是做什么的 => 基于标签
-# 有没有函数已经实现了从字符串删除指定字符串的功能,使用的话可以怎么使用,写个java代码 => 基于描述
-# 有根据我以下的需求用 java 开发一个方法:输入为字符串,将输入中的 .java 字符串给删除掉,然后返回新的字符串 => 基于描述
-
-# round-1
-query_content = "代码一共有多少类"
-query = Message(
- role_name="user", role_type="human",
- role_content=query_content, input_query=query_content, origin_query=query_content,
- code_engine_name="client", score_threshold=1.0, top_k=3, cb_search_type="cypher"
- )
-
-output_message1, _ = phase.step(query)
diff --git a/sources/readme_docs/fastchat.md b/sources/readme_docs/fastchat.md
new file mode 100644
index 0000000..bf808de
--- /dev/null
+++ b/sources/readme_docs/fastchat.md
@@ -0,0 +1,223 @@
+# 本地私有化/大模型接口接入
+
+依托于开源的 LLM 与 Embedding 模型,本项目可实现基于开源模型的离线私有部署。此外,本项目也支持 OpenAI API 的调用。
+
+## 📜 目录
+- [ 本地私有化模型接入](#本地私有化模型接入)
+- [ 公开大模型接口接入](#公开大模型接口接入)
+- [ 启动大模型服务](#启动大模型服务)
+
+## 本地私有化模型接入
+
+
模型地址配置示例,model_config.py配置修改
+
+```bash
+# 建议:走huggingface接入,尽量使用chat模型,不要使用base,无法获取正确输出
+# 注意:当llm_model_dict和VLLM_MODEL_DICT同时存在时,优先启动VLLM_MODEL_DICT中的模型配置
+
+# llm_model_dict 配置接入示例如下
+llm_model_dict = {
+ "chatglm-6b": {
+ "local_model_path": "THUDM/chatglm-6b",
+ "api_base_url": "http://localhost:8888/v1", # "name"修改为fastchat服务中的"api_base_url"
+ "api_key": "EMPTY"
+ }
+}
+
+# VLLM_MODEL_DICT 配置接入示例如下
+VLLM_MODEL_DICT = {
+ 'chatglm2-6b': "THUDM/chatglm-6b",
+}
+
+```
+
+
模型路径填写示例
+
+```bash
+# 1、若把模型放到 ~/codefuse-chatbot/llm_models 路径下
+# 若模型地址如下
+model_dir: ~/codefuse-chatbot/llm_models/THUDM/chatglm-6b
+
+# 参考配置如下
+llm_model_dict = {
+ "chatglm-6b": {
+ "local_model_path": "THUDM/chatglm-6b",
+ "api_base_url": "http://localhost:8888/v1", # "name"修改为fastchat服务中的"api_base_url"
+ "api_key": "EMPTY"
+ }
+}
+
+VLLM_MODEL_DICT = {
+ 'chatglm2-6b': "THUDM/chatglm-6b",
+}
+
+# or 若模型地址如下
+model_dir: ~/codefuse-chatbot/llm_models/chatglm-6b
+llm_model_dict = {
+ "chatglm-6b": {
+ "local_model_path": "chatglm-6b",
+ "api_base_url": "http://localhost:8888/v1", # "name"修改为fastchat服务中的"api_base_url"
+ "api_key": "EMPTY"
+ }
+}
+
+VLLM_MODEL_DICT = {
+ 'chatglm2-6b': "chatglm-6b",
+}
+
+# 2、若不想移动相关模型到 ~/codefuse-chatbot/llm_models
+# 同时删除 `模型路径重置` 以下的相关代码,具体见model_config.py
+# 若模型地址如下
+model_dir: ~/THUDM/chatglm-6b
+# 参考配置如下
+llm_model_dict = {
+ "chatglm-6b": {
+ "local_model_path": "~/THUDM/chatglm-6b",
+ "api_base_url": "http://localhost:8888/v1", # "name"修改为fastchat服务中的"api_base_url"
+ "api_key": "EMPTY"
+ }
+}
+
+VLLM_MODEL_DICT = {
+ 'chatglm2-6b': "~/THUDM/chatglm-6b",
+}
+```
+
+```bash
+# 3、指定启动的模型服务,两者保持一致
+LLM_MODEL = "gpt-3.5-turbo-16k"
+LLM_MODELs = ["gpt-3.5-turbo-16k"]
+```
+
+```bash
+# server_config.py配置修改, 若LLM_MODELS无多个模型配置不需要额外进行设置
+# 修改server_config.py#FSCHAT_MODEL_WORKERS的配置
+"model_name": {'host': DEFAULT_BIND_HOST, 'port': 20057}
+```
+
+
+
+
量化模型接入
+
+```bash
+# 若需要支撑codellama-34b-int4模型,需要给fastchat打一个补丁
+cp examples/gptq.py ~/site-packages/fastchat/modules/gptq.py
+
+# 若需要支撑qwen-72b-int4模型,需要给fastchat打一个补丁
+cp examples/gptq.py ~/site-packages/fastchat/modules/gptq.py
+# 量化需修改llm_api.py的配置
+# dev_opsgpt/service/llm_api.py#559 取消注释 kwargs["gptq_wbits"] = 4
+```
+
+## 公开大模型接口接入
+
+```bash
+# model_config.py配置修改
+# ONLINE_LLM_MODEL
+# 其它接口开发来自于langchain-chatchat项目,缺少相关账号未经测试
+
+# 指定启动的模型服务,两者保持一致
+LLM_MODEL = "gpt-3.5-turbo-16k"
+LLM_MODELs = ["gpt-3.5-turbo-16k"]
+```
+
+外部大模型接口接入示例
+
+```bash
+# 1、实现新的模型接入类
+# 参考 ~/dev_opsgpt/service/model_workers/openai.py#ExampleWorker
+# 实现do_chat函数即可使用LLM的能力
+
+class XXWorker(ApiModelWorker):
+ def __init__(
+ self,
+ *,
+ controller_addr: str = None,
+ worker_addr: str = None,
+ model_names: List[str] = ["gpt-3.5-turbo"],
+ version: str = "gpt-3.5",
+ **kwargs,
+ ):
+ kwargs.update(model_names=model_names, controller_addr=controller_addr, worker_addr=worker_addr)
+ kwargs.setdefault("context_len", 16384) #TODO 16K模型需要改成16384
+ super().__init__(**kwargs)
+ self.version = version
+
+ def do_chat(self, params: ApiChatParams) -> Dict:
+ '''
+ 执行Chat的方法,默认使用模块里面的chat函数。
+ :params.messages : [
+ {"role": "user", "content": "hello"},
+ {"role": "assistant", "content": "hello"}
+ ]
+ :params.xx: 详情见 ApiChatParams
+ 要求返回形式:{"error_code": int, "text": str}
+ '''
+ return {"error_code": 500, "text": f"{self.model_names[0]}未实现chat功能"}
+
+
+# 最后在 ~/dev_opsgpt/service/model_workers/__init__.py 中完成注册
+# from .xx import XXWorker
+
+# 2、通过已有模型接入类完成接入
+# 或者直接使用已有的相关大模型类进行使用(缺少相关账号测试,欢迎大家测试后提PR)
+```
+
+
+```bash
+# model_config.py#ONLINE_LLM_MODEL 配置修改
+# 填写专属模型的 version、api_base_url、api_key、provider(与上述类名一致)
+ONLINE_LLM_MODEL = {
+ # 线上模型。请在server_config中为每个在线API设置不同的端口
+
+ "openai-api": {
+ "model_name": "gpt-3.5-turbo",
+ "api_base_url": "https://api.openai.com/v1",
+ "api_key": "",
+ "openai_proxy": "",
+ },
+ "example": {
+ "version": "gpt-3.5", # 采用openai接口做示例
+ "api_base_url": "https://api.openai.com/v1",
+ "api_key": "",
+ "provider": "ExampleWorker",
+ },
+}
+```
+
+## 启动大模型服务
+```bash
+# start llm-service(可选) 单独启动大模型服务
+python dev_opsgpt/service/llm_api.py
+```
+
+```bash
+# 启动测试
+import openai
+# openai.api_key = "EMPTY" # Not support yet
+openai.api_base = "http://127.0.0.1:8888/v1"
+
+# 选择你启动的模型
+model = "example"
+
+# create a chat completion
+completion = openai.ChatCompletion.create(
+ model=model,
+ messages=[{"role": "user", "content": "Hello! What is your name? "}],
+ max_tokens=100,
+)
+# print the completion
+print(completion.choices[0].message.content)
+
+# 正确输出后则确认LLM可正常接入
+```
+
+
+
+or
+
+```bash
+# model_config.py#USE_FASTCHAT 判断是否进行fastchat接入本地模型
+USE_FASTCHAT = "gpt" not in LLM_MODEL
+python start.py #224 自动执行 python service/llm_api.py
+```
\ No newline at end of file
diff --git a/sources/readme_docs/roadmap.md b/sources/readme_docs/roadmap.md
index 6dc0839..d952112 100644
--- a/sources/readme_docs/roadmap.md
+++ b/sources/readme_docs/roadmap.md
@@ -8,14 +8,14 @@
完整路线
-- [ ] Sandbox 环境
+- [x] Sandbox 环境
- [x] 环境隔离的sandbox环境与代码执行
- - [ ] 上传、下载文件
+ - [x] 上传、下载文件
- [ ] 支持java执行环境
- [ ] Vector Database & Retrieval
- [ ] llama-index 兼容向量管理
- - [ ] task retrieval
- - [ ] tool retrieval
+ - [x] task retrieval
+ - [x] tool retrieval
- [ ] Prompt Control
- [ ] prompt flow
- [ ] 基于不同prompt管理不同任务
@@ -27,10 +27,10 @@
- [ ] 全流程自动
- [x] 基于fastchat接入LLM
- [x] 基于sentencebert接入Text Embedding
- - [ ] 向量加载速度提升
-- [ ] Connector
- - [ ] 基于langchain的react模式
- - [ ] 基于langchain完成tool检索
+ - [x] 向量加载速度提升
+- [x] Connector
+ - [x] 基于langchain的react模式
+ - [x] 基于langchain完成tool检索
- [ ] Web Crawl 通用能力
- [x] 技术文档: 知乎、csdn、阿里云开发者论坛、腾讯云开发者论坛等
- [ ] issue document
@@ -48,11 +48,11 @@
- v0.1
- [x] Sandbox 环境: 上传、下载文件
-- [ ] Vector Database & Retrieval
- - [ ] task retrieval
- - [ ] tool retrieval
-- [ ] Connector
- - [ ] 基于langchain的react模式
+- [x] Vector Database & Retrieval
+ - [x] task retrieval
+ - [x] tool retrieval
+- [x] Connector
+ - [x] 基于langchain的react模式
- [x] 基于sentencebert接入Text Embedding: 向量加载速度提升