fix: 更新嵌入模型配置,修复相关信息获取逻辑
- 修改数据路由器中的嵌入模型信息获取方式,确保使用正确的配置项。 - 在 LightRagBasedKB 类中,增强 LLM 和嵌入函数的获取逻辑,支持动态配置。 - 更新嵌入模型和重排序模型的 URL 获取方式,统一为 base_url。 - 前端数据库视图中,调整嵌入模型选择的样式和信息展示,提升用户体验。
This commit is contained in:
parent
30163baed4
commit
a91d57f274
@ -29,7 +29,7 @@ async def create_database(
|
|||||||
):
|
):
|
||||||
logger.debug(f"Create database {database_name}")
|
logger.debug(f"Create database {database_name}")
|
||||||
try:
|
try:
|
||||||
embed_info = config.embed_model_info[embed_model_name]
|
embed_info = config.embed_model_names[embed_model_name]
|
||||||
database_info = knowledge_base.create_database(
|
database_info = knowledge_base.create_database(
|
||||||
database_name,
|
database_name,
|
||||||
description,
|
description,
|
||||||
|
|||||||
@ -76,6 +76,11 @@ class LightRagBasedKB:
|
|||||||
if db_id not in self.databases_meta:
|
if db_id not in self.databases_meta:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
llm_info = self.databases_meta[db_id].get("llm_info", {})
|
||||||
|
embed_info = self.databases_meta[db_id].get("embed_info", {})
|
||||||
|
logger.info(f"LLM info: {llm_info}")
|
||||||
|
logger.info(f"Embed info: {embed_info}")
|
||||||
|
|
||||||
# 创建 LightRAG 实例
|
# 创建 LightRAG 实例
|
||||||
working_dir = os.path.join(self.work_dir, db_id)
|
working_dir = os.path.join(self.work_dir, db_id)
|
||||||
os.makedirs(working_dir, exist_ok=True)
|
os.makedirs(working_dir, exist_ok=True)
|
||||||
@ -84,8 +89,8 @@ class LightRagBasedKB:
|
|||||||
# 使用配置的 LLM 和 embedding 函数
|
# 使用配置的 LLM 和 embedding 函数
|
||||||
rag = LightRAG(
|
rag = LightRAG(
|
||||||
working_dir=working_dir,
|
working_dir=working_dir,
|
||||||
llm_model_func=self._get_llm_func(),
|
llm_model_func=self._get_llm_func(llm_info),
|
||||||
embedding_func=self._get_embedding_func(),
|
embedding_func=self._get_embedding_func(embed_info),
|
||||||
vector_storage="MilvusVectorDBStorage",
|
vector_storage="MilvusVectorDBStorage",
|
||||||
kv_storage="JsonKVStorage",
|
kv_storage="JsonKVStorage",
|
||||||
graph_storage="PGGraphStorage",
|
graph_storage="PGGraphStorage",
|
||||||
@ -110,30 +115,40 @@ class LightRagBasedKB:
|
|||||||
await rag.initialize_storages()
|
await rag.initialize_storages()
|
||||||
await initialize_pipeline_status()
|
await initialize_pipeline_status()
|
||||||
|
|
||||||
def _get_llm_func(self):
|
def _get_llm_func(self, llm_info: dict):
|
||||||
"""获取 LLM 函数"""
|
"""获取 LLM 函数"""
|
||||||
|
llm_info = llm_info | {
|
||||||
|
"model_name": "qwen3-1.7b",
|
||||||
|
"provider": "dashscope"
|
||||||
|
}
|
||||||
|
provider_info = config.model_names[llm_info.get("provider")]
|
||||||
|
api_key = os.getenv(provider_info.get("env")[0] or "OPENAI_API_KEY") or "no_api_key"
|
||||||
|
base_url = get_docker_safe_url(provider_info.get("base_url", "http://localhost:8081/v1"))
|
||||||
async def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs):
|
async def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs):
|
||||||
return await openai_complete_if_cache(
|
return await openai_complete_if_cache(
|
||||||
"qwen3:32b",
|
llm_info.get("model_name"),
|
||||||
prompt,
|
prompt,
|
||||||
system_prompt=system_prompt,
|
system_prompt=system_prompt,
|
||||||
history_messages=history_messages,
|
history_messages=history_messages,
|
||||||
api_key="no_api_key",
|
api_key=api_key,
|
||||||
base_url="http://172.19.13.7:8080/v1",
|
base_url=base_url,
|
||||||
|
extra_body={"enable_thinking": False},
|
||||||
**kwargs,
|
**kwargs,
|
||||||
)
|
)
|
||||||
return llm_model_func
|
return llm_model_func
|
||||||
|
|
||||||
def _get_embedding_func(self):
|
def _get_embedding_func(self, embed_info: dict):
|
||||||
"""获取 embedding 函数"""
|
"""获取 embedding 函数"""
|
||||||
|
api_key = os.getenv(embed_info.get("api_key", "OPENAI_API_KEY")) or "no_api_key"
|
||||||
|
base_url = embed_info.get("base_url", "http://localhost:8081/v1").replace("/embeddings", "")
|
||||||
return EmbeddingFunc(
|
return EmbeddingFunc(
|
||||||
embedding_dim=1024,
|
embedding_dim=embed_info.get("dimension") or 1024,
|
||||||
max_token_size=4096,
|
max_token_size=4096,
|
||||||
func=lambda texts: openai_embed(
|
func=lambda texts: openai_embed(
|
||||||
texts=texts,
|
texts=texts,
|
||||||
model="Qwen3-Embedding-0.6B",
|
model=embed_info.get("model_name") or "Qwen3-Embedding-0.6B",
|
||||||
api_key="no_api_key",
|
api_key=api_key,
|
||||||
base_url=get_docker_safe_url("http://localhost:8081/v1")
|
base_url=get_docker_safe_url(base_url)
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -248,6 +263,7 @@ class LightRagBasedKB:
|
|||||||
|
|
||||||
def delete_database(self, db_id):
|
def delete_database(self, db_id):
|
||||||
"""删除数据库 - data_router.py 使用"""
|
"""删除数据库 - data_router.py 使用"""
|
||||||
|
# TODO 删除数据库时,需要删除文件记录,并删除 LightRAG 中的文件
|
||||||
if db_id in self.databases_meta:
|
if db_id in self.databases_meta:
|
||||||
# 删除相关文件记录
|
# 删除相关文件记录
|
||||||
files_to_delete = [fid for fid, finfo in self.files_meta.items()
|
files_to_delete = [fid for fid, finfo in self.files_meta.items()
|
||||||
@ -377,6 +393,7 @@ class LightRagBasedKB:
|
|||||||
|
|
||||||
async def delete_file(self, db_id, file_id):
|
async def delete_file(self, db_id, file_id):
|
||||||
"""删除文件 - data_router.py 使用"""
|
"""删除文件 - data_router.py 使用"""
|
||||||
|
# TODO 删除文件时,需要删除文件记录,并删除 LightRAG 中的文件
|
||||||
rag = await self._get_lightrag_instance(db_id)
|
rag = await self._get_lightrag_instance(db_id)
|
||||||
if rag:
|
if rag:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@ -133,7 +133,7 @@ class OllamaEmbedding(BaseEmbeddingModel):
|
|||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self.info = config.embed_model_names[config.embed_model]
|
self.info = config.embed_model_names[config.embed_model]
|
||||||
self.model = self.info["name"]
|
self.model = self.info["name"]
|
||||||
self.url = self.info.get("url", "http://localhost:11434/api/embed")
|
self.url = self.info.get("base_url", "http://localhost:11434/api/embed")
|
||||||
self.url = get_docker_safe_url(self.url)
|
self.url = get_docker_safe_url(self.url)
|
||||||
self.dimension = self.info.get("dimension", None)
|
self.dimension = self.info.get("dimension", None)
|
||||||
self.embed_model_fullname = config.embed_model
|
self.embed_model_fullname = config.embed_model
|
||||||
@ -160,7 +160,7 @@ class OtherEmbedding(BaseEmbeddingModel):
|
|||||||
self.dimension = self.info.get("dimension", None)
|
self.dimension = self.info.get("dimension", None)
|
||||||
self.model = self.info["name"]
|
self.model = self.info["name"]
|
||||||
self.api_key = os.getenv(self.info["api_key"], self.info["api_key"])
|
self.api_key = os.getenv(self.info["api_key"], self.info["api_key"])
|
||||||
self.url = get_docker_safe_url(self.info["url"])
|
self.url = get_docker_safe_url(self.info["base_url"])
|
||||||
assert self.url and self.model, f"URL and model are required. Cur embed model: {config.embed_model}"
|
assert self.url and self.model, f"URL and model are required. Cur embed model: {config.embed_model}"
|
||||||
self.headers = {
|
self.headers = {
|
||||||
"Authorization": f"Bearer {self.api_key}",
|
"Authorization": f"Bearer {self.api_key}",
|
||||||
|
|||||||
@ -25,7 +25,7 @@ def sigmoid(x):
|
|||||||
class OnlineRerank:
|
class OnlineRerank:
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
model_info = config.reranker_names[config.reranker]
|
model_info = config.reranker_names[config.reranker]
|
||||||
self.url = get_docker_safe_url(model_info["url"])
|
self.url = get_docker_safe_url(model_info["base_url"])
|
||||||
self.model = model_info["name"]
|
self.model = model_info["name"]
|
||||||
|
|
||||||
api_key = os.getenv(model_info["api_key"], model_info["api_key"])
|
api_key = os.getenv(model_info["api_key"], model_info["api_key"])
|
||||||
|
|||||||
@ -111,44 +111,36 @@ MODEL_NAMES:
|
|||||||
|
|
||||||
|
|
||||||
EMBED_MODEL_INFO:
|
EMBED_MODEL_INFO:
|
||||||
zhipu/zhipu-embedding-2:
|
|
||||||
name: embedding-2
|
|
||||||
dimension: 1024
|
|
||||||
|
|
||||||
zhipu/zhipu-embedding-3:
|
|
||||||
name: embedding-3
|
|
||||||
dimension: 2048
|
|
||||||
|
|
||||||
siliconflow/BAAI/bge-m3:
|
siliconflow/BAAI/bge-m3:
|
||||||
name: BAAI/bge-m3
|
name: BAAI/bge-m3
|
||||||
dimension: 1024
|
dimension: 1024
|
||||||
url: https://api.siliconflow.cn/v1/embeddings
|
base_url: https://api.siliconflow.cn/v1/embeddings
|
||||||
api_key: SILICONFLOW_API_KEY
|
api_key: SILICONFLOW_API_KEY
|
||||||
|
|
||||||
vllm/Qwen/Qwen3-Embedding-0.6B:
|
vllm/Qwen/Qwen3-Embedding-0.6B:
|
||||||
name: Qwen3-Embedding-0.6B
|
name: Qwen3-Embedding-0.6B
|
||||||
dimension: 1024
|
dimension: 1024
|
||||||
url: http://localhost:8081/v1/embeddings
|
base_url: http://localhost:8081/v1/embeddings
|
||||||
api_key: no_api_key
|
api_key: no_api_key
|
||||||
|
|
||||||
ollama/nomic-embed-text:
|
ollama/nomic-embed-text:
|
||||||
name: nomic-embed-text
|
name: nomic-embed-text
|
||||||
url: http://localhost:11434/api/embed
|
base_url: http://localhost:11434/api/embed
|
||||||
dimension: 768
|
dimension: 768
|
||||||
|
|
||||||
ollama/bge-m3:
|
ollama/bge-m3:
|
||||||
name: bge-m3
|
name: bge-m3
|
||||||
url: http://localhost:11434/api/embed
|
base_url: http://localhost:11434/api/embed
|
||||||
dimension: 1024
|
dimension: 1024
|
||||||
|
|
||||||
RERANKER_LIST:
|
RERANKER_LIST:
|
||||||
|
|
||||||
siliconflow/BAAI/bge-reranker-v2-m3:
|
siliconflow/BAAI/bge-reranker-v2-m3:
|
||||||
name: BAAI/bge-reranker-v2-m3
|
name: BAAI/bge-reranker-v2-m3
|
||||||
url: https://api.siliconflow.cn/v1/rerank
|
base_url: https://api.siliconflow.cn/v1/rerank
|
||||||
api_key: SILICONFLOW_API_KEY
|
api_key: SILICONFLOW_API_KEY
|
||||||
|
|
||||||
vllm/Qwen/Qwen3-Reranker-0.6B:
|
vllm/Qwen/Qwen3-Reranker-0.6B:
|
||||||
name: Qwen/Qwen3-Reranker-0.6B
|
name: Qwen/Qwen3-Reranker-0.6B
|
||||||
url: http://localhost:8081/v1/rerank
|
base_url: http://localhost:8081/v1/rerank
|
||||||
api_key: no_api_key
|
api_key: no_api_key
|
||||||
|
|||||||
@ -8,11 +8,11 @@
|
|||||||
</template>
|
</template>
|
||||||
</HeaderComponent>
|
</HeaderComponent>
|
||||||
|
|
||||||
<a-modal :open="state.openNewDatabaseModel" title="新建知识库" @ok="createDatabase" @cancel="cancelCreateDatabase">
|
<a-modal :open="state.openNewDatabaseModel" title="新建知识库" @ok="createDatabase" @cancel="cancelCreateDatabase" class="new-database-modal">
|
||||||
<h3>知识库名称<span style="color: var(--error-color)">*</span></h3>
|
<h3>知识库名称<span style="color: var(--error-color)">*</span></h3>
|
||||||
<a-input v-model:value="newDatabase.name" placeholder="新建知识库名称" />
|
<a-input v-model:value="newDatabase.name" placeholder="新建知识库名称" />
|
||||||
<h3>嵌入模型</h3>
|
<h3>嵌入模型</h3>
|
||||||
<a-select v-model:value="newDatabase.embed_model_name" :options="embedModelOptions" />
|
<a-select v-model:value="newDatabase.embed_model_name" :options="embedModelOptions" style="width: 100%;" />
|
||||||
<h3 style="margin-top: 20px;">知识库描述</h3>
|
<h3 style="margin-top: 20px;">知识库描述</h3>
|
||||||
<p style="color: var(--gray-700); font-size: 14px;">在智能体流程中,这里的描述会作为工具的描述。智能体会根据知识库的标题和描述来选择合适的工具。所以这里描述的越详细,智能体越容易选择到合适的工具。</p>
|
<p style="color: var(--gray-700); font-size: 14px;">在智能体流程中,这里的描述会作为工具的描述。智能体会根据知识库的标题和描述来选择合适的工具。所以这里描述的越详细,智能体越容易选择到合适的工具。</p>
|
||||||
<a-textarea
|
<a-textarea
|
||||||
@ -85,8 +85,8 @@ const state = reactive({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const embedModelOptions = computed(() => {
|
const embedModelOptions = computed(() => {
|
||||||
return Object.keys(configStore.config?.embed_model_info || {}).map(key => ({
|
return Object.keys(configStore.config?.embed_model_names || {}).map(key => ({
|
||||||
label: configStore.config?.embed_model_info[key]?.name || key,
|
label: `${key} (${configStore.config?.embed_model_names[key]?.dimension})`,
|
||||||
value: key,
|
value: key,
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
@ -94,7 +94,7 @@ const embedModelOptions = computed(() => {
|
|||||||
const emptyEmbedInfo = {
|
const emptyEmbedInfo = {
|
||||||
name: '',
|
name: '',
|
||||||
description: '',
|
description: '',
|
||||||
embed_model_name: '',
|
embed_model_name: configStore.config?.embed_model,
|
||||||
}
|
}
|
||||||
|
|
||||||
const newDatabase = reactive({
|
const newDatabase = reactive({
|
||||||
@ -270,4 +270,10 @@ onMounted(() => {
|
|||||||
.database-container {
|
.database-container {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.new-database-modal {
|
||||||
|
h3 {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user