Add File
This commit is contained in:
227
main/init.py
Normal file
227
main/init.py
Normal file
@@ -0,0 +1,227 @@
|
||||
import json5
|
||||
import os
|
||||
import shutil
|
||||
#大模型配置
|
||||
from qwen_agent.llm import get_chat_model
|
||||
from openai import OpenAI
|
||||
#兼容科大讯飞的openai_model
|
||||
class openai_model():
|
||||
def __init__(self,model={}):
|
||||
self.config = model
|
||||
self.client = OpenAI(
|
||||
# 控制台获取key和secret拼接,假使控制台获取的APIPassword是123456
|
||||
api_key= model["api_key"],
|
||||
# 指向讯飞星火的请求地址
|
||||
base_url = model["model_server"],
|
||||
)
|
||||
|
||||
def chat(self,messages=[],stream=True,delta_stream=False):
|
||||
self.messages = messages
|
||||
if stream:
|
||||
return self._chat_stream()
|
||||
else:
|
||||
return self._chat_no_stream()
|
||||
|
||||
def _chat_stream(self):
|
||||
responses = self.client.chat.completions.create(
|
||||
model=self.config["model"], # 指定请求的版本
|
||||
messages=self.messages,
|
||||
stream=True
|
||||
)
|
||||
|
||||
content=""
|
||||
for chunk in responses:
|
||||
if chunk.choices and chunk.choices[0].delta.content:
|
||||
#print(content)
|
||||
content +=chunk.choices[0].delta.content
|
||||
yield [{"content":content}]
|
||||
|
||||
|
||||
def _chat_no_stream(self):
|
||||
completion = self.client.chat.completions.create(
|
||||
model=self.config["model"], # 指定请求的版本
|
||||
messages=self.messages
|
||||
)
|
||||
return [{"content":completion.choices[0].message.content}]
|
||||
|
||||
|
||||
##深度合并更新
|
||||
def deep_update(source, overrides):
|
||||
"""
|
||||
将 overrides 字典递归合并到 source 字典中。
|
||||
"""
|
||||
for key, value in overrides.items():
|
||||
if isinstance(value, dict) and key in source:
|
||||
deep_update(source.get(key, {}), value)
|
||||
else:
|
||||
source[key] = value
|
||||
return source
|
||||
|
||||
|
||||
#1. 初始化默认配置参数
|
||||
with open("conf/gcfg.default") as conf:
|
||||
gcfg = json5.load(conf)
|
||||
|
||||
|
||||
#2. 加载参数
|
||||
try:
|
||||
with open("conf/gcfg.conf") as conf:
|
||||
gcfg0 = json5.load(conf)
|
||||
gcfg = deep_update(gcfg,gcfg0) #深度合并更新
|
||||
except:
|
||||
pass
|
||||
|
||||
#3. 和并外部的配置参数
|
||||
try:
|
||||
#以外部配置的这个文件为准
|
||||
with open(f'{gcfg["fs"]["path"]}/conf/gcfg.conf') as conf:
|
||||
gcfg0 = json5.load(conf)
|
||||
gcfg = deep_update(gcfg,gcfg0) #深度合并更新
|
||||
except Exception as e:
|
||||
print("配置文件有异常",e)
|
||||
|
||||
|
||||
#.4 gcfg mem的部分
|
||||
try:
|
||||
with open(f'{gcfg["fs"]["path"]}/conf/gcfg_mem.conf') as conf:
|
||||
gcfg_mem0 = json5.load(conf)
|
||||
gcfg = deep_update(gcfg,gcfg_mem0) #深度合并更新
|
||||
except:
|
||||
try:
|
||||
with open(f'{gcfg["fs"]["path"]}/conf/gcfg_mem.conf',"w+") as conf:
|
||||
json5.dump(gcfg["mem"],conf,ensure_ascii=False)
|
||||
except:
|
||||
pass
|
||||
|
||||
#. 最后初始化
|
||||
try:
|
||||
#初始化路径
|
||||
#配置文件路径
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/conf'):
|
||||
os.makedirs(f'{gcfg["fs"]["path"]}/conf')
|
||||
|
||||
#数据库路径
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/db'):
|
||||
os.makedirs(f'{gcfg["fs"]["path"]}/db')
|
||||
|
||||
#图片上传路径
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/img'):
|
||||
os.makedirs(f'{gcfg["fs"]["path"]}/img')
|
||||
|
||||
#视频上传路径
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/video'):
|
||||
os.makedirs(f'{gcfg["fs"]["path"]}/video')
|
||||
|
||||
#文档生成发布路径
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/pub'):
|
||||
os.makedirs(f'{gcfg["fs"]["path"]}/pub')
|
||||
|
||||
#上传文档的路径,文件中心默认的上传目录
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/文档'):
|
||||
os.makedirs(f'{gcfg["fs"]["path"]}/文档')
|
||||
|
||||
#复制智能体文件
|
||||
try:
|
||||
shutil.copy2("../mnt/Agents.json", f'{gcfg["fs"]["path"]}/文档/')
|
||||
except:
|
||||
pass
|
||||
|
||||
#个人文件夹,智能体对话个人上传的目录
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/个人文件夹'):
|
||||
os.makedirs(f'{gcfg["fs"]["path"]}/个人文件夹')
|
||||
#个人文件夹-管理员
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/个人文件夹/管理员'):
|
||||
os.makedirs(f'{gcfg["fs"]["path"]}/个人文件夹/管理员')
|
||||
|
||||
#初始化数据库文件
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/db/k_database.db'):
|
||||
try:
|
||||
shutil.copy2("../mnt/db/k_database.db", f'{gcfg["fs"]["path"]}/db/k_database.db') # 使用 copy2 保留元数据(如修改时间)
|
||||
except:
|
||||
try:
|
||||
shutil.copy2("mnt/db/k_database.db", f'{gcfg["fs"]["path"]}/db/k_database.db') # 使用 copy2 保留元数据(如修改时间)
|
||||
except:
|
||||
pass
|
||||
|
||||
#初始化日志数据库文件
|
||||
if not os.path.exists(f'{gcfg["fs"]["path"]}/db/logs.db'):
|
||||
try:
|
||||
shutil.copy2("../mnt/db/logs.db", f'{gcfg["fs"]["path"]}/db/logs.db') # 使用 copy2 保留元数据(如修改时间)
|
||||
except:
|
||||
try:
|
||||
shutil.copy2("mnt/db/logs.db", f'{gcfg["fs"]["path"]}/db/logs.db') # 使用 copy2 保留元数据(如修改时间)
|
||||
except:
|
||||
pass
|
||||
|
||||
#初始化大模型
|
||||
try:
|
||||
with open(f'{gcfg["fs"]["path"]}/conf/llm.conf') as conf:
|
||||
llm_conf = json5.load(conf)
|
||||
except:
|
||||
with open(f'conf/llm.default') as conf:
|
||||
llm_conf = json5.load(conf)
|
||||
with open(f'{gcfg["fs"]["path"]}/conf/llm.conf',"w+") as conf:
|
||||
json5.dump(llm_conf,conf,ensure_ascii=False)
|
||||
|
||||
#大模型相关参数
|
||||
gcfg["llm"]["ctx_size"] = int(gcfg["llm"]["ctx_size"])
|
||||
gcfg["full_index"]["chunk_size"] = int(gcfg["full_index"]["chunk_size"])
|
||||
gcfg["full_index"]["chunk_overlap"] = int(gcfg["full_index"]["chunk_overlap"])
|
||||
|
||||
|
||||
#llm的通用参数设置
|
||||
#ctx_size是字节,这里是token
|
||||
#根据模型能力可以设置一个更大的值,负载超过此值,就不会给大模型发送数据了
|
||||
generate_cfg = {
|
||||
"max_input_tokens": int(gcfg["llm"]["ctx_size"]*1.5)+4090,
|
||||
"temperature": float(gcfg["llm"]["temperature"]),
|
||||
"top_p": float(gcfg["llm"]["top_p"]),
|
||||
"top_k": int(gcfg["llm"]["top_k"]),
|
||||
}
|
||||
|
||||
for cfg in llm_conf["llm_cfg"]:
|
||||
if llm_conf["selected"]==cfg["id"]:
|
||||
|
||||
if cfg["id"]=="xunfei": #讯飞的单独处理
|
||||
llm = openai_model({
|
||||
# Use your own model service compatible with OpenAI API:
|
||||
'model': cfg["name"],
|
||||
'model_server': cfg["url"],
|
||||
'api_key': cfg["api_key"],
|
||||
'generate_cfg': generate_cfg
|
||||
})
|
||||
else:
|
||||
llm = get_chat_model({
|
||||
# Use your own model service compatible with OpenAI API:
|
||||
'model': cfg["name"],
|
||||
'model_server': cfg["url"],
|
||||
'api_key': cfg["api_key"],
|
||||
'generate_cfg': generate_cfg
|
||||
})
|
||||
break
|
||||
except:
|
||||
llm = get_chat_model({
|
||||
# Use your own model service compatible with OpenAI API:
|
||||
'model': 'Qwen/Qwen1.5-72B-Chat',
|
||||
'model_server': 'http://127.0.0.1:8080/v1', # api_base
|
||||
'api_key': 'EMPTY',
|
||||
'generate_cfg': generate_cfg
|
||||
})
|
||||
|
||||
#获取mem的实时的值
|
||||
def get_gcfg_mem():
|
||||
try:
|
||||
with open(f'{gcfg["fs"]["path"]}/conf/gcfg_mem.conf') as conf:
|
||||
gcfg_mem0 = json5.load(conf)
|
||||
except:
|
||||
gcfg_mem0 = gcfg["mem"]
|
||||
return gcfg_mem0
|
||||
|
||||
#更新mem
|
||||
def update_gcfg_mem(k1,k2,value):
|
||||
gcfg_mem0 = get_gcfg_mem()
|
||||
gcfg_mem0[k1][k2]=value
|
||||
with open(f'{gcfg["fs"]["path"]}/conf/gcfg_mem.conf',"w+") as conf:
|
||||
json5.dump(gcfg_mem0,conf,ensure_ascii=False)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user