梳理Langchain-Chatchat知识库API接口

一.Langchain-Chatchat 知识库管理

1.Langchain-Chatchat 对话和知识库管理界面

  Langchain-Chatchat v0.28 完整的界面截图,如下所示:

2.知识库中源文件和向量库

  知识库 test 中源文件和向量库的位置,如下所示:

3.知识库表结构

  knowledge_base 数据表内容,如下所示:

二.知识库操作 1

序号操作名字功能解释链接备注
1获取知识库列表就是上面的 samples(faiss @ bge-large-zh)和 test (faiss @ bge-large-zh)。http://127.0.0.1/knowledge_base/list_knowledge_bases-
2选择知识库选中一个知识库没有对应 API 接口-
3新建知识库新建一个知识库http://127.0.0.1/knowledge_base/create_knowledge_base,如下所示:{ "knowledge_base_name": "LLM", "vector_store_type": "faiss", "embed_model": "bge-large-zh"}创建知识库
4上传知识文件向知识库上传文件,比如限制每个文件 200MB,类型可为 HTML, MD, JSON, JSONL, CSV, PDF, PNG, JPG, JPEG, BMP, EML, MSG, EPUB, XLSX, XLSD, IPYNB, ODT, PY, RST, RTF, SRT, TOML, TSV, DOCX, DOC, XML, PPT, PPTX, TXT, HTM只是上传并显示了一个文件,并没有真的将文件上传到知识库中。-
5知识库介绍知识库描述http://127.0.0.1/knowledge_base/update_info,如下所示:{ "knowledge_base_name": "samples", "kb_info": "这是一个知识库"}-
6单段文本最大长度就是将长文本分割成多个较短的段落,每个段落的长度都不超过这个限制。可通过更新现有文件到知识库接口 update_docs 实现。-
7相邻文本重合长度将长文本分割成多个较短的段落时,相邻段落之间重复的文本的长度。这通常是为了确保 LLM 能够理解文本的上下文。可通过更新现有文件到知识库接口 update_docs 实现。-
8开启中文标题加强参考 kb_config.py 解释:1.是否开启中文标题加强,以及标题增强的相关配置;2.通过增加标题判断,判断哪些文本为标题,并在 metadata 中进行标记;3.然后将文本与往上一级的标题进行拼合,实现文本信息的增强。可通过更新现有文件到知识库接口 update_docs 实现。-
9添加文件到知识库将上传的文件添加到知识库中http://127.0.0.1/knowledge_base/upload_docs 说明:接口调用格式 POST -> Body -> form-data。-
1.获取知识库列表

  L:\20231106_ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\api.py,如下所示:

app.get("/knowledge_base/list_knowledge_bases",tags=["Knowledge Base Management"],response_model=ListResponse,summary="获取知识库列表")(list_kbs)

  L:\20231106_ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\knowledge_base\kb_api.py,如下所示:

def list_kbs():# Get List of Knowledge Basereturn ListResponse(data=list_kbs_from_db())

  L:\20231106_ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\db\repository\knowledge_base_repository.py,如下所示:

@with_session
def list_kbs_from_db(session, min_file_count: int = -1):# 根据文件数量筛选知识库,-1表示不筛选,返回所有知识库kbs = session.query(KnowledgeBaseModel.kb_name).filter(KnowledgeBaseModel.file_count > min_file_count).all()# 遍历结果,取出知识库名称kbs = [kb[0] for kb in kbs]return kbs

  http://127.0.0.1/knowledge_base/list_knowledge_bases,返回结果:

{"code": 200,"msg": "success","data": ["samples","test"]
}

2.选中知识库

  选中知识库并没有对应的接口,主要是选中知识库后,更新界面的(1)知识库介绍(2)知识库文档信息,包括源文件(遍历文件夹)和向量库(遍历数据库)。

(1)遍历文件夹

  比如 test 知识库对应的 L:\20231106_ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\knowledge_base\test 文件夹。

(2)遍历数据库

  主要是 knowledge_file 数据表,包括 id、file_name、file_ext、kb_name、document_loader_name、text_splitter_name、file_version、file_mtime(文件修改时间)、file_size(单位)、custom_docs(自定义文档)、docs_count、create_time。

3.新建知识库

  L:\20231106_ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\api.py,如下所示:

app.post("/knowledge_base/create_knowledge_base",tags=["Knowledge Base Management"],response_model=BaseResponse,summary="创建知识库")(create_kb)

(1)拿到 FaissKBService 实例

  L:\20231106_ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\knowledge_base\kb_api.py

def create_kb(knowledge_base_name: str = Body(..., examples=["samples"]),vector_store_type: str = Body("faiss"),embed_model: str = Body(EMBEDDING_MODEL),) -> BaseResponse:# Create selected knowledge baseif not validate_kb_name(knowledge_base_name):  # 验证知识库名称return BaseResponse(code=403, msg="Don't attack me")if knowledge_base_name is None or knowledge_base_name.strip() == "":  # 知识库名称不能为空return BaseResponse(code=404, msg="知识库名称不能为空,请重新填写知识库名称")kb = KBServiceFactory.get_service_by_name(knowledge_base_name)  # 验证知识库是否存在if kb is not None:  # 已存在同名知识库return BaseResponse(code=404, msg=f"已存在同名知识库 {knowledge_base_name}")  # 404kb = KBServiceFactory.get_service(knowledge_base_name, vector_store_type, embed_model)  # 返回FaissKBService实例try:kb.create_kb()  # 创建知识库except Exception as e:msg = f"创建知识库出错: {e}"logger.error(f'{e.__class__.__name__}: {msg}',exc_info=e if log_verbose else None)return BaseResponse(code=500, msg=msg)return BaseResponse(code=200, msg=f"已新增知识库 {knowledge_base_name}")

(2)创建知识库

  L:\20231106_ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\knowledge_base\kb_service\base.py,如下所示:

def create_kb(self):<em>"""</em>
<em>    创建知识库</em>
<em>    """</em>
<em>    </em>if not os.path.exists(self.doc_path):  # 如果文档路径不存在os.makedirs(self.doc_path)  # 创建文档路径self.do_create_kb()  # 创建知识库status = add_kb_to_db(self.kb_name, self.kb_info, self.vs_type(), self.embed_model)  # 添加知识库到数据库return status  # 返回状态

(3)添加知识库到数据库

  L:\20231106_ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\db\repository\knowledge_base_repository.py,如下所示:

@with_session
def add_kb_to_db(session, kb_name, kb_info, vs_type, embed_model):# 创建知识库实例kb = session.query(KnowledgeBaseModel).filter_by(kb_name=kb_name).first()  # 查询知识库是否存在if not kb:  # 如果不存在,创建新的知识库kb = KnowledgeBaseModel(kb_name=kb_name, kb_info=kb_info, vs_type=vs_type, embed_model=embed_model)  # 创建知识库实例session.add(kb)  # 添加到数据库knowledge_base表中else:  # update kb with new vs_type and embed_modelkb.kb_info = kb_info  # 更新知识库介绍kb.vs_type = vs_type  # 更新向量存储类型kb.embed_model = embed_model  # 更新嵌入模型return True

(4)接口调用

  http://127.0.0.1/knowledge_base/create_knowledge_base,如下所示:

{"knowledge_base_name": "LLM","vector_store_type": "faiss","embed_model": "bge-large-zh"
}

  特别说明:没有找到知识库简介字段(确定没有)。参考更新知识库介绍/knowledge_base/update_info。

  数据表 knowledge_base 信息,如下所示:

  LangChain-Chatchat 知识库管理界面信息,如下所示:

4.上传知识文件

  st.file_uploader 创建一个文件上传组件,显示一个选择文件的按钮。如下所示:

files = st.file_uploader("上传知识文件:",[i for ls in LOADER_DICT.values() for i in ls],accept_multiple_files=True,)

  只是显示了一个文件,并没有真的将文件上传到知识库中。

5.知识库介绍

(1)知识库更新实现

  F:\ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\api.py,如下所示:

app.post("/knowledge_base/update_info",tags=["Knowledge Base Management"],response_model=BaseResponse,summary="更新知识库介绍")(update_info)

  对应的接口实现,如下所示:

def update_info(knowledge_base_name: str = Body(..., description="知识库名称", examples=["samples"]),kb_info: str = Body(..., description="知识库介绍", examples=["这是一个知识库"]),
):if not validate_kb_name(knowledge_base_name):return BaseResponse(code=403, msg="Don't attack me")kb = KBServiceFactory.get_service_by_name(knowledge_base_name)if kb is None:return BaseResponse(code=404, msg=f"未找到知识库 {knowledge_base_name}")kb.update_info(kb_info)return BaseResponse(code=200, msg=f"知识库介绍修改完成", data={"kb_info": kb_info})

  本质上还是更新数据库 knowledge_base,对知识库介绍字段进行更新。

(2)接口调用

http://127.0.0.1/knowledge_base/update_info,如下所示:

6.单段文本最大长度

  可通过更新现有文件到知识库接口 update_docs 实现。

7.相邻文本重合长度

  可通过更新现有文件到知识库接口 update_docs 实现。

8.开启中文标题加强

  可通过更新现有文件到知识库接口 update_docs 实现。

9.添加文件到知识库,并/或向量化

  F:\ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\api.py,如下所示:

app.post("/knowledge_base/upload_docs",tags=["Knowledge Base Management"],response_model=BaseResponse,summary="上传文件到知识库,并/或进行向量化")(upload_docs)

(1)upload_docs 函数

def upload_docs(file: List[UploadFile] = File(..., description="上传文件,支持多文件"),knowledge_base_name: str = Form(..., description="知识库名称", examples=["samples"]),override: bool = Form(False, description="覆盖已有文件"),to_vector_store: bool = Form(True, description="上传文件后是否进行向量化"),chunk_size: int = Form(CHUNK_SIZE, description="知识库中单段文本最大长度"),chunk_overlap: int = Form(OVERLAP_SIZE, description="知识库中相邻文本重合长度"),zh_title_enhance: bool = Form(ZH_TITLE_ENHANCE, description="是否开启中文标题加强"),docs: Json = Form({}, description="自定义的docs,需要转为json字符串",examples=[{"test.txt": [Document(page_content="custom doc")]}]),not_refresh_vs_cache: bool = Form(False, description="暂不保存向量库(用于FAISS)"),
) -> BaseResponse:
序号字段名类型解释备注
1fileList[UploadFile]上传文件,支持多文件-
2knowledge_base_namestr知识库名称-
3overridebool覆盖已有文件-
4to_vector_storebool上传文件后是否进行向量化-
5chunk_sizeint知识库中单段文本最大长度就是将长文本分割成多个较短的段落,每个段落的长度都不超过这个限制。
6chunk_overlapint知识库中相邻文本重合长度将长文本分割成多个较短的段落时,相邻段落之间重复的文本的长度。这通常是为了确保 LLM 能够理解文本的上下文。
7zh_title_enhancebool是否开启中文标题加强参考 kb_config.py 解释:1.是否开启中文标题加强,以及标题增强的相关配置;2.通过增加标题判断,判断哪些文本为标题,并在 metadata 中进行标记;3.然后将文本与往上一级的标题进行拼合,实现文本信息的增强。
8docsJson自定义的 docs,需要转为 json 字符串推测自定义文档主要是为了测试用途(不清楚还有没有其它的用途)。
9not_refresh_vs_cachebool暂不保存向量库(用于 FAISS)目前支持 FAISS,是否保存向量库。

(2)先将上传的文件保存到磁盘

  不再解释,就是将上传的文件保存到知识库本地相应的文件夹中。

(3)对保存的文件进行向量化

  当 to_vector_store=True 时,调用更新知识库文档接口 update_docs。具体实现如下所示:

# 对保存的文件进行向量化
if to_vector_store:  # 如果需要向量化result = update_docs(  # 调用update_docs接口knowledge_base_name=knowledge_base_name,  # 知识库名称file_names=file_names,  # 文件名称override_custom_docs=True,  # 覆盖之前自定义的docschunk_size=chunk_size,  # 知识库中单段文本最大长度chunk_overlap=chunk_overlap,  # 知识库中相邻文本重合长度zh_title_enhance=zh_title_enhance,  # 是否开启中文标题加强docs=docs,  # 自定义的docsnot_refresh_vs_cache=True,  # 暂不保存向量库(只有FAISS实现了))failed_files.update(result.data["failed_files"])  # 更新上传失败的文件if not not_refresh_vs_cache:  # 如果需要保存向量库kb.save_vector_store()  # 保存向量库

  默认 not_refresh_vs_cache=True,即暂不保存向量库。如果 not_refresh_vs_cache=False,那么执行 kb.save_vector_store()。FAISS 保存到磁盘(已实现),milvus 保存到数据库(未实现),PGVector 暂未支持(未实现)。具体实现,如下所示:

def save_vector_store(self):self.load_vector_store().save(self.vs_path)

(4)接口调用

  http://127.0.0.1/knowledge_base/upload_docs,如下所示:

  控制台输出,可以看到使用的加载器为 UnstructuredFileLoader,然后将向量库保存到磁盘(FAISS),如下所示:

2024-01-21 19:17:56,650 - utils.py[line:286] - INFO: UnstructuredFileLoader used for F:\ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\knowledge_base\LLM\content\data.txt
文档切分示例:page_content='{"Q": "宪法规定的公民法律义务有"}\n{"Q": "属于专门人民法院的是"}\n{"Q": "无效婚姻的种类包括"}\n{"Q": "刑事案件定义"}' metadata={'source': 'F:\\ConversationSystem\\ChatCopilot\\Langchain\\Langchain-Chatchat-0.2.8\\knowledge_base\\LLM\\content\\data.txt'}
Batches: 100%|██████████| 1/1 [00:00<00:00,  4.44it/s]
2024-01-21 19:18:04,893 - faiss_cache.py[line:24] - INFO: 已将向量库 ('LLM', 'bge-large-zh') 保存到磁盘
INFO:     127.0.0.1:61524 - "POST /knowledge_base/upload_docs HTTP/1.1" 200 OK

(5)可能遇到的问题

  通过界面操作时,Browser files 上传一个文件之后,点击按钮"添加文件到知识库",出现如下所示:

INFO:     127.0.0.1:60656 - "POST /knowledge_base/upload_docs HTTP/1.1" 422 Unprocessable Entity
2024-01-21 19:10:25,208 - _client.py[line:1027] - INFO: HTTP Request: POST http://127.0.0.1:7861/knowledge_base/upload_docs "HTTP/1.1 422 Unprocessable Entity"

说明:暂未找到原因。

三.知识库操作 2

序号操作名字功能解释链接备注
1下载选中文档选中一个文档,然后下载,可以是源文件,也可以是向量库。http://127.0.0.1/knowledge_base/download_doc-
2重新添加至向量库1.如果是源文件,执行"添加至向量库"操作 2.如果是向量库,执行"重新添加至向量库"操作http://127.0.0.1/knowledge_base/upload_docs-
3从向量库删除1.如果选中的是源文件,那么该按钮为灰色。2.如果选中的是向量库,那么该按钮可操作。http://127.0.0.1/knowledge_base/delete_docs-
4从知识库中删除1.如果是源文件,那么该按钮可操作。2.如果是向量库,那么该按钮可操作。http://127.0.0.1/knowledge_base/delete_docs-
5依据源文件重建向量库该操作针对的是整个知识库,根据源文件重建向量库,并不针对某个具体的源文件或者向量库文件。http://127.0.0.1/knowledge_base/recreate_vector_store-
6删除知识库就是把整个知识库删除掉
1.下载选中文档

(1)download_doc 接口

  F:\ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\api.py,如下所示:

app.get("/knowledge_base/download_doc",tags=["Knowledge Base Management"],summary="下载对应的知识文件")(download_doc)

download_doc 接口主要是根据知识库名字和文件名字拿到文件路径,然后返回 FileResponse 对象。

(2)接口调用

  http://127.0.0.1/knowledge_base/download_doc,如下所示:

(3)界面操作

  无论是下载源文件,还是向量库文件,都是先选中,然后下载。下载的向量库文件,和下载的源文件内容都是一样的,都是源文件的内容,而不是编码后的内容。

2.添加至向量库/重新添加至向量库

(1)界面操作

  当选择源文件时,显示添加至向量库,如下所示:

  当选择向量库文件时,显示重新添加至向量库,如下所示:

(2)接口调用

  无论是"添加至向量库",还是"重新添加至向量库"都是调用的 upload_docs 接口,"添加至向量库"控制台日志如下所示:

2024-01-21 23:59:11,127 - utils.py[line:286] - INFO: UnstructuredFileLoader used for F:\ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\knowledge_base\LLM\content\data.txt
文档切分示例:page_content='{"Q": "宪法规定的公民法律义务有"}\n{"Q": "属于专门人民法院的是"}\n{"Q": "无效婚姻的种类包括"}\n{"Q": "刑事案件定义"}' metadata={'source': 'F:\\ConversationSystem\\ChatCopilot\\Langchain\\Langchain-Chatchat-0.2.8\\knowledge_base\\LLM\\content\\data.txt'}
2024-01-21 23:59:21,557 - faiss_cache.py[line:80] - INFO: loading vector store in 'LLM/vector_store/bge-large-zh' from disk.
2024-01-21 23:59:21,611 - SentenceTransformer.py[line:66] - INFO: Load pretrained SentenceTransformer: F:\HuggingFaceModel\bge-large-zh
2024-01-21 23:59:22,878 - loader.py[line:54] - INFO: Loading faiss with AVX2 support.
2024-01-21 23:59:22,878 - loader.py[line:58] - INFO: Could not load library with AVX2 support due to: ModuleNotFoundError("No module named 'faiss.swigfaiss_avx2'")
2024-01-21 23:59:22,878 - loader.py[line:64] - INFO: Loading faiss.
2024-01-21 23:59:23,050 - loader.py[line:66] - INFO: Successfully loaded faiss.
Batches: 100%|██████████| 1/1 [00:00<00:00,  5.64it/s]
2024-01-21 23:59:23,294 - faiss_cache.py[line:24] - INFO: 已将向量库 ('LLM', 'bge-large-zh') 保存到磁盘
2024-01-21 23:59:23,297 - _client.py[line:1027] - INFO: HTTP Request: POST http://127.0.0.1:7861/knowledge_base/update_docs "HTTP/1.1 200 OK"
INFO:     127.0.0.1:50606 - "POST /knowledge_base/update_docs HTTP/1.1" 200 OK

  "重新添加至向量库"控制台日志如下所示:

2024-01-22 00:14:56,917 - utils.py[line:286] - INFO: UnstructuredFileLoader used for F:\ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\knowledge_base\LLM\content\data.txt
文档切分示例:page_content='{"Q": "宪法规定的公民法律义务有"}\n{"Q": "属于专门人民法院的是"}\n{"Q": "无效婚姻的种类包括"}\n{"Q": "刑事案件定义"}' metadata={'source': 'F:\\ConversationSystem\\ChatCopilot\\Langchain\\Langchain-Chatchat-0.2.8\\knowledge_base\\LLM\\content\\data.txt'}
Batches: 100%|██████████| 1/1 [00:00<00:00,  4.71it/s]
2024-01-22 00:14:57,713 - faiss_cache.py[line:24] - INFO: 已将向量库 ('LLM', 'bge-large-zh') 保存到磁盘
2024-01-22 00:14:57,716 - _client.py[line:1027] - INFO: HTTP Request: POST http://127.0.0.1:7861/knowledge_base/update_docs "HTTP/1.1 200 OK"
INFO:     127.0.0.1:51617 - "POST /knowledge_base/update_docs HTTP/1.1" 200 OK
3.从向量库删除

(1)基本删除思路

  只能删除向量库文件,不能删除源文件。因为当选中源文件时,这个按钮是禁用状态。基本删除思路为:删除向量库中的内容(比如 faiss),删除数据库中的内容(knowledge_file 数据表)。F:\ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\api.py,如下所示:

app.post("/knowledge_base/delete_docs",tags=["Knowledge Base Management"],response_model=BaseResponse,summary="删除知识库内指定文件")(delete_docs)

(2)接口调用

http://127.0.0.1/knowledge_base/delete_docs,如下所示:

4.从知识库中删除

(1)基本思路

  无论是向量库文件,还是源文件都是可以删除的。基本删除思路为:删除向量库中的内容(比如 faiss),删除数据库中的内容(knowledge_file 数据表),删除上传文件夹中的文件。

(2)接口调用

  查看源码,从向量库删除和从知识库删除区别,前者"delete_content": false,而后者为"delete_content": true。这个字段主要是控制着是否删除文件夹。http://127.0.0.1/knowledge_base/delete_docs,如下所示:

5.依据源文件重建向量库

  F:\ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\api.py,如下所示:

app.post("/knowledge_base/recreate_vector_store",tags=["Knowledge Base Management"],summary="根据content中文档重建向量库,流式输出处理进度。")(recreate_vector_store)

  本质上就是将原来的向量库清空,然后重建操作。http://127.0.0.1/knowledge_base/recreate_vector_store 接口调用如下所示:

  上述英文内容翻译:从内容重新创建矢量存储。当用户可以直接将文件复制到内容文件夹而不是通过网络上传时,这很有用。默认情况下,get_service_by_name 只返回 info.db 中的知识库并在其中包含文档文件。将 allow_empty_kb 设置为 True 使其应用于不在 info.db 中或没有文档的空知识库。

6.删除知识库

  本质上是删除向量库、数据库信息和文件夹。F:\ConversationSystem\ChatCopilot\Langchain\Langchain-Chatchat-0.2.8\server\api.py,如下所示:

app.post("/knowledge_base/delete_knowledge_base",tags=["Knowledge Base Management"],response_model=BaseResponse,summary="删除知识库")(delete_kb)

http://127.0.0.1/knowledge_base/接口调用如下所示:

  除此之外,还有一些接口没有介绍实现逻辑,可参考文献[1]。如果不查看源代码,可能很难较为深入的理解每个操作步骤的具体实现逻辑。

参考文献

[1] Langchain-Chatchat API Server:http://127.0.0.1/docs

[2] https://github.com/chatchat-space/Langchain-Chatchat/releases/tag/v0.2.8

[3] 梳理Langchain-Chatchat知识库API接口(原文链接):https://z0yrmerhgi8.feishu.cn/wiki/XN7AwrH6DiCpMIkaNnAcPd7znZc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一夜暴增200城,智驾开城秘诀在哪?小鹏、理想、大疆等各有不同

作者 |Marshall 编辑 |祥威 一夜过后&#xff0c;城市NOA可用范围突然增至两百多城市&#xff0c;这是最近小鹏的智驾给大家的印象。 我们曾在「特斯拉、小鹏开路&#xff0c;城市NOA距好用还有几年&#xff1f;」一文中&#xff0c;探讨了城市NOA落地过程中所面临的地图问题…

vue3-组件基础

什么是组件 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行处理。在实际应用中&#xff0c;组件常常被组织成层层嵌套的树状结构。 定义一个组件 我们一般会将 Vue 组件定义在一个单独的 .vue 文件中&#xff0c;这被叫做单文件组件 (简称…

TypeScript 实用技巧(中)

十四、向类型添加特殊值 原文&#xff1a;exploringjs.com/tackling-ts/ch_special-values.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 14.1 在带内添加特殊值 14.1.1 向类型添加 null 或 undefined 14.1.2 向类型添加符号 14.2 在带外添加特殊值 14.2…

[亲测有效]CentOS7下安装mysql5.7

前言 近期项目需要搭配mysql一起存储相关数据&#xff0c;但对mysql的版本有要求&#xff0c;于是在服务器搭建了mysql5.7&#xff0c;顺便记录一下搭建步骤和踩坑解决步骤。 目录 前言 一、清除旧安装包 二、安装YUM 三、使用yum命令即可完成安装 四、重新设置密码 五、…

文心一言 v.s. ChatGPT:多角度对比测评“追赶者”能否超越?

ChatGPT自发布以来就引发了关注热潮&#xff0c;如今国内大模型的发展也是如火如荼、百花齐放&#xff1a;比如百度的文心一言、阿里的通义千问、讯飞的星火大模型等等&#xff0c;那么作为后起之秀的国内大模型与ChatGPT相比哪个更好用呢&#xff1f;“追赶者”能否实现超越&a…

使用Unity创建VisionPro应用

1、下载特定Unity版本 Unity账号需要是Pro账号,普通账号不行,目前只支持这1个Unity版本,不要下载任何其它版本:unityhub://2022.3.11f1/d00248457e15) 其它条件:使用Mac电脑M系列芯片,XCode15 Beta2及以上 参考资料: 苹果官网:苹果官网 Unity官网:Unity官网 官方教程…

Network:use `--host` to expose

前言&#xff1a; 最近开始学习使用vite创建项目&#xff0c;但是 vite 启动后提示&#xff1a;Network:use --host to expose&#xff0c;从而导致在同一个局域网内的其他人也无法访问到我本地的项目。 导致原因&#xff1a;通过官方文档了解到不显示地址是因为IP没有做配置&a…

浏览器无网

目录 1.运行网络诊断&#xff0c;确认原因 原因A.远程计算机或设备将不接受连接(该设备或资源(Web 代理)未设置为接受端口“7890”上的连接 原因B.DNS服务器未响应 场景A.其他的浏览器可以打开网页&#xff0c;自带的Edge却不行 方法A&#xff1a;关闭代理 Google自带翻译…

【江科大】STM32:中断系统(理论)

文章目录 中断系统为什么要使用中断中断优先级中断嵌套STM32的中断系统如何管理这些中断NVIC的结构![请添加图片描述](https://img-blog.csdnimg.cn/c77b038fd63a4ddfbcd3b86f6dfe596b.png) 优先级窗口看门狗&#xff08;WWDG&#xff09;&#xff1a;外部中断模块的特性&#…

前后端分离项目中实现图形验证码

图形验证码在我们的日常生活中时经常用到的&#xff0c;一般用于用户的登录、注册等。 图形验证码在互联网应用中的作用是提高安全性、防止滥用和保护用户隐私。它是一种简单而有效的人机验证技术&#xff0c;帮助保护系统和用户免受自动化攻击的影响。 本次我们通过spring b…

损失函数是指什么

损失函数&#xff08;Loss Function&#xff09;是用来衡量模型预测输出与实际目标之间差异的函数。在机器学习和深度学习中&#xff0c;损失函数是模型训练的关键部分。其目标是通过最小化损失函数来使模型的预测尽可能接近实际的标签或目标值。 在监督学习中&#xff0c;模型…

Adobe Media Encoder 2023下载安装教程,ME 2023安装教程,附安装包和工具,无套路,轻松搞的安装

前言 Adobe Media Encoder是一个视频和音频编码应用程序&#xff0c;可让针对不同应用程序和观众&#xff0c;以各种分发格式对音频和视频文件进行编码。包括专门设计的预设设置&#xff0c;以便导出与特定交付媒体兼容的文件&#xff0c;可以按适合多种设备的格式导出视频&am…

漫漫数学之旅010

文章目录 经典格言数学习题古今评注科学家小传&#xff08;一&#xff09;艾伦凯&#xff08;二&#xff09;托马斯C黑尔斯 经典格言 计算机的归宿是融入我们的生活&#xff0c;就像其它一切我们习以为常的东西&#xff1a;手表、纸、铅笔和衣服&#xff0c;我们不再把它们看作…

Hbas简介:数据模型和概念、物理视图

文章目录 说明零 BigTable一 Hbase简介二 HBase 访问接口简介三 行式&列式存储四 HBase 数据模型4.1 HBase 列族数据模型4.2 数据模型的相关概念4.3 数据坐标 五 概念&物理视图 说明 本文参考自林子雨老师的大数据技术原理与应用(第三版)教材内容&#xff0c;仅供学习…

Gen AI大潮来袭!8个Salesforce新岗位,你会选择哪个?

人工智能席卷全球&#xff0c;企业对如何整合GenAI有着浓厚的兴趣。为启动企业的GenAI转型浪潮&#xff0c;Salesforce宣布与埃森哲和德勤建立合作伙伴关系&#xff0c;并计划推出更多支持项目。 目前&#xff0c;Salesforce领域的其他咨询公司正在提高员工技能&#xff0c;以…

Apache Zeppelin结合Apache Airflow使用1

Apache Zeppelin结合Apache Airflow使用1 文章目录 Apache Zeppelin结合Apache Airflow使用1前言一、安装Airflow二、使用步骤1.目标2.编写DAG2.加载、执行DAG 总结 前言 之前学了Zeppelin的使用&#xff0c;今天开始结合Airflow串任务。 Apache Airflow和Apache Zeppelin是两…

C语言数据结构(3)——线性表其二(单链表)

欢迎来到博主的专栏——C语言数据结构 博主id&#xff1a;代码小豪 文章目录 单链表不连续存储的线性表单链表单链表的结构头指针单链表的操作打印单链表 空链表单链表的插入尾插法 头插法 单链表的查找任意位置处的节点插入单链表节点的删除 销毁链表 单链表 顺序表是一个物…

万字长文详解Java线程池面试题

王有志&#xff0c;一个分享硬核 Java 技术的互金摸鱼侠 加入 Java 人的提桶跑路群&#xff1a;共同富裕的Java人 今天是《面霸的自我修养》第 6 篇文章&#xff0c;我们一起来看看面试中会问到哪些关于线程池的问题吧。数据来源&#xff1a; 大部分来自于各机构&#xff08;J…

【K8S】Kubernetes 中滚动发布由浅入深实战

目录 一、Kubernetes中滚动发布的需求背景1.1 滚动发布1.2 滚动发布、蓝绿发布、金丝雀发布的区别 二、Kubernetes中实现滚动发布2.1 定义Kubernetes中的版本2.2 创建 Deployment 资源对象2.2.1 在 Yaml 中定义 Deployment 资源对象2.2.2 执行命令创建 Deployment 资源对象 三、…

Asp.net core 框架入门

概述 appsettings.json&#xff1a;配置文件&#xff0c;数据库连接字符串配置信息 Program.cs&#xff1a;程序入口文件&#xff08;里面有个Main方法&#xff09; Startup.cs&#xff1a;启动配置文件 依赖项&#xff1a;管理项目所依赖的第三方组件的安装&#xff0c;配…