# C++ API ## Tokenizer 类 ### 描述 `Tokenizer` 类负责文本的编码和解码,支持不同类型的分词器。 ### 常量 #### `static constexpr int MAGIC_NUMBER` - **描述:** 魔法数字,用于识别分词器类型。 ### 枚举类型 #### `enum TokenizerType` - `SENTENCEPIECE`:SentencePiece 分词器。 - `TIKTOIKEN`:TikToken 分词器。 - `BERT`:BERT 分词器。 - `HUGGINGFACE`:Hugging Face 分词器。 ### 构造函数 #### `Tokenizer()` - **描述:** 默认构造函数。 ### 析构函数 #### `virtual ~Tokenizer()` - **描述:** 默认析构函数。 ### 公共方法 #### `static Tokenizer* createTokenizer(const std::string& filename)` - **描述:** 根据给定文件名创建相应类型的分词器实例。 - **参数:** - `filename`:分词器配置文件路径。 - **返回:** 创建的 `Tokenizer` 实例指针。 #### `bool is_stop(int token)` - **描述:** 判断给定的 token 是否为停止 token。 - **参数:** - `token`:待检查的 token。 - **返回:** 如果是停止 token,则返回 `true`;否则返回 `false`。 #### `bool is_special(int token)` - **描述:** 判断给定的 token 是否为特殊 token。 - **参数:** - `token`:待检查的 token。 - **返回:** 如果是特殊 token,则返回 `true`;否则返回 `false`。 #### `std::vector encode(const std::string& str)` - **描述:** 将输入字符串编码为 token 数组。 --- ## LlmStreamBuffer 类 ### 描述 `LlmStreamBuffer` 是一个自定义流缓冲区,允许通过回调机制进行数据流传输。 ### 构造函数 #### `LlmStreamBuffer(CallBack callback)` - **参数:** - `callback`:用于处理流数据的函数。 ### 保护方法 #### `std::streamsize xsputn(const char* s, std::streamsize n) override` - **描述:** 将 `n` 个字符从 `s` 指向的数组写入。 - **返回:** 写入的字符数量。 ### 私有成员 - `CallBack callback_`:存储回调函数。 --- ## PROMPT_TYPE 枚举 ### 描述 定义了可以在 `Llm` 类中使用的提示类型。 - `SYSTEM`:系统提示。 - `ATTACHMENT`:附件提示。 - `USER`:用户提示。 - `ASSISTANT`:助手提示。 - `OTHER`:其他提示类型。 --- ## Prompt 结构体 ### 描述 表示一个提示,包含其类型、字符串内容及相关标记。 ### 成员 - `PROMPT_TYPE type`:提示类型。 - `std::string str`:提示内容。 - `std::vector tokens`:与提示相关的标记。 --- ## Llm 类 ### 描述 `Llm` 类封装了一个大型语言模型,用于交互和处理提示。 ### 构造函数 #### `Llm(std::shared_ptr config)` - **参数:** - `config`:指向配置的共享指针。 ### 析构函数 #### `~Llm()` - **描述:** 清理资源。 ### 公共方法 #### `void chat()` - **描述:** 启动聊天会话。 #### `void reset()` - **描述:** 重置模型状态。 #### `static Llm* createLLM(const std::string& config_path)` - **描述:** 工厂方法,创建 `Llm` 实例。 - **返回:** 创建的 `Llm` 实例的指针。 #### `void load()` - **描述:** 加载模型配置。 #### `VARP forward(const std::vector& input_ids)` - **描述:** 处理输入标记并返回输出变量。 #### `int sample(VARP logits, const std::vector& pre_ids)` - **描述:** 根据提供的 ID 从 logits 中抽样。 - **返回:** 抽样的整数。 #### `std::string apply_prompt_template(const std::string& user_content) const` - **描述:** 将提示模板应用于用户内容。 #### `std::string apply_chat_template(const std::vector& chat_prompts) const` - **描述:** 将聊天模板应用于提示列表。 #### `std::string response(const std::string& user_content, std::ostream* os = &std::cout, const char* end_with = nullptr)` - **描述:** 根据用户内容生成响应。 - **参数:** - `os`:输出流(默认为 `std::cout`)。 - `end_with`:可选的附加字符串。 - **返回:** 生成的响应。 #### `void print_speed()` - **描述:** 打印处理速度指标。 ### 配置方法 #### `std::string dump_config()` - **描述:** 以字符串形式转储当前配置。 #### `bool set_config(const std::string& content)` - **描述:** 从字符串设置配置。 - **返回:** 如果成功,返回 `true`;否则返回 `false`。 ### LoRA 方法 #### `size_t apply_lora(const std::string& lora_path)` - **描述:** 从指定路径应用 LoRA 模型。 #### `Llm* create_lora(const std::string& lora_path)` - **描述:** 创建 LoRA 实例。 #### `bool release_module(size_t index)` - **描述:** 释放指定模块。 - **返回:** 如果成功,返回 `true`。 #### `bool select_module(size_t index)` - **描述:** 选择指定模块。 - **返回:** 如果成功,返回 `true`。 --- ## 公共成员 - `int prompt_len_`:提示长度。 - `int gen_seq_len_`:生成序列的长度。 - `int all_seq_len_`:总序列长度。 - `std::vector history_ids_`:历史 ID 列表。 - `int64_t visual_us_`:视觉处理所用时间。 - `int64_t prefill_us_`:预填充所用时间。 - `int64_t decode_us_`:解码所用时间。 - `float load_progress_`:加载进度。 - `bool is_single_`:指示是否为单一模型。 - `bool attention_fused_`:指示是否融合了注意力机制。 ## 保护成员 - `std::shared_ptr config_`:模型配置。 - `std::shared_ptr tokenizer_`:文本处理的分词器。 - `std::vector key_value_shape_`:键值对的形状。 - `std::vector past_key_values_`:历史键值对。 - `MNN::Express::VARP inputs_embeds_, attention_mask_, position_ids_`:模型输入。 - `std::shared_ptr runtime_manager_`:管理运行时执行。 - `std::vector> modules_`:加载的模块。 - `const MNN::Express::Module* base_module_`:基础模块指针。 --- ## 保护方法 #### `void init_runtime()` - **描述:** 初始化运行时参数。 #### `std::string decode(int id)` - **描述:** 将给定 ID 解码为字符串。 #### `bool is_stop(int token_id)` - **描述:** 检查令牌是否为停止令牌。 #### `virtual std::vector tokenizer(const std::string& query)` - **描述:** 对输入查询进行分词。 #### `virtual MNN::Express::VARP embedding(const std::vector& input_ids)` - **描述:** 为输入 ID 生成嵌入。 #### `virtual MNN::Express::VARP gen_attention_mask(int seq_len)` - **描述:** 为序列生成注意力掩码。 #### `virtual MNN::Express::VARP gen_position_ids(int seq_len)` - **描述:** 为序列生成位置 ID。 --- ## Embedding 类 ### 描述 `Embedding` 类负责生成文本和 ID 的嵌入表示,并提供相应的操作。 ### 构造函数 #### `Embedding(std::shared_ptr config)` - **参数:** - `config`:指向配置的共享指针。 ### 公共方法 #### `static Embedding* createEmbedding(const std::string& config_path, bool load = true)` - **描述:** 工厂方法,创建 `Embedding` 实例。 - **参数:** - `config_path`:配置文件路径。 - `load`:是否加载模型(默认为 `true`)。 - **返回:** 创建的 `Embedding` 实例的指针。 #### `static float dist(MNN::Express::VARP var0, MNN::Express::VARP var1)` - **描述:** 计算两个嵌入的距离。 - **返回:** 嵌入的距离值。 #### `virtual void load() override` - **描述:** 加载嵌入模型。 #### `MNN::Express::VARP ids_embedding(const std::vector& ids)` - **描述:** 根据 ID 生成嵌入表示。 - **返回:** 生成的嵌入变量。 #### `MNN::Express::VARP txt_embedding(const std::string& txt)` - **描述:** 根据文本生成嵌入表示。 - **返回:** 生成的嵌入变量。 #### `int dim() const` - **描述:** 获取嵌入的维度。 - **返回:** 嵌入维度。 ### 私有方法 #### `virtual std::vector tokenizer(const std::string& query) override` - **描述:** 对输入查询进行分词。 #### `virtual MNN::Express::VARP gen_attention_mask(int seq_len) override` - **描述:** 为序列生成注意力掩码。 #### `virtual MNN::Express::VARP gen_position_ids(int seq_len) override` - **描述:** 为序列生成位置 ID。 --- ## TextVectorStore 类 ### 描述 `TextVectorStore` 类用于管理文本的向量存储,支持文本的添加和搜索。 ### 构造函数 #### `TextVectorStore()` - **描述:** 默认构造函数。 #### `TextVectorStore(std::shared_ptr embedding)` - **参数:** - `embedding`:指向 `Embedding` 实例的共享指针。 ### 析构函数 #### `~TextVectorStore()` - **描述:** 清理资源。 ### 公共方法 #### `static TextVectorStore* load(const std::string& path, const std::string& embedding_path = "")` - **描述:** 从路径加载 `TextVectorStore` 实例。 - **返回:** 加载的实例指针。 #### `void set_embedding(std::shared_ptr embedding)` - **描述:** 设置嵌入实例。 #### `void save(const std::string& path)` - **描述:** 保存文本向量存储到指定路径。 #### `void add_text(const std::string& text)` - **描述:** 添加单个文本到存储。 #### `void add_texts(const std::vector& texts)` - **描述:** 添加多个文本到存储。 #### `std::vector search_similar_texts(const std::string& txt, int topk = 1)` - **描述:** 搜索与给定文本相似的文本。 - **参数:** - `topk`:返回的相似文本数量(默认为 1)。 - **返回:** 相似文本的列表。 #### `void bench()` - **描述:** 进行基准测试。 ### 保护方法 #### `inline VARP text2vector(const std::string& text)` - **描述:** 将文本转换为向量。 --- ## Document 类 ### 描述 `Document` 类表示一个文档,支持根据类型加载和分割文档内容。 ### 枚举类型 #### `enum DOCTYPE` - `AUTO`:自动识别类型。 - `TXT`:文本文件。 - `MD`:Markdown 文件。 - `HTML`:HTML 文件。 - `PDF`:PDF 文件。 ### 构造函数 #### `Document(const std::string& path, DOCTYPE type = AUTO)` - **参数:** - `path`:文档路径。 - `type`:文档类型(默认为 `AUTO`)。 ### 析构函数 #### `~Document()` - **描述:** 清理资源。 ### 公共方法 #### `std::vector split(int chunk_size = -1)` - **描述:** 将文档分割为多个部分。 - **参数:** - `chunk_size`:每部分的大小(默认为 -1,表示不限制)。 - **返回:** 分割后的字符串列表。 ### 私有方法 #### `std::vector load_txt()` - **描述:** 加载文本文件内容。 #### `std::vector load_pdf()` - **描述:** 加载 PDF 文件内容。 --- ## MemoryBase 类 ### 描述 `MemoryBase` 类是一个抽象基类,提供文本向量存储的基础功能。 ### 构造函数 #### `MemoryBase()` - **描述:** 默认构造函数。 ### 析构函数 #### `virtual ~MemoryBase()` - **描述:** 清理资源。 ### 公共方法 #### `void set_embedding(std::shared_ptr embedding)` - **描述:** 设置嵌入实例。 #### `virtual std::vector search(const std::string& query, int topk)` - **描述:** 根据查询搜索文本。 - **参数:** - `topk`:返回的结果数量。 - **返回:** 搜索结果列表。 #### `virtual void save(const std::string& path) = 0` - **描述:** 保存存储(纯虚函数)。 #### `virtual void build_vectors() = 0` - **描述:** 构建文本向量(纯虚函数)。 ### 保护方法 #### `void load_store(const std::string& path)` - **描述:** 从指定路径加载存储。 #### `void save_store(const std::string& path)` - **描述:** 将存储保存到指定路径。 --- ## ChatMemory 类 ### 描述 `ChatMemory` 类继承自 `MemoryBase`,用于管理聊天记忆。 ### 构造函数 #### `ChatMemory()` - **描述:** 默认构造函数。 ### 析构函数 #### `~ChatMemory() override` - **描述:** 清理资源。 ### 公共方法 #### `static ChatMemory* load(const std::string& path)` - **描述:** 从路径加载 `ChatMemory` 实例。 - **返回:** 加载的实例指针。 #### `void save(const std::string& path) override` - **描述:** 保存聊天记忆到指定路径。 #### `void build_vectors() override` - **描述:** 构建聊天记忆的向量。 #### `std::string get_latest(std::string key)` - **描述:** 获取指定键的最新记忆。 #### `void add(const std::vector& prompts)` - **描述:** 添加提示到记忆中。 #### `void summarize(std::shared_ptr llm)` - **描述:** 对记忆进行总结。 ### 私有成员 - `json memory_`:存储记忆的 JSON 对象。 --- ## Knowledge 类 ### 描述 `Knowledge` 类继承自 `MemoryBase`,用于管理知识库。 ### 构造函数 #### `Knowledge()` - **描述:** 默认构造函数。 ### 析构函数 #### `~Knowledge() override` - **描述:** 清理资源。 ### 公共方法 #### `static Knowledge* load(const std::string& path)` - **描述:** 从路径加载 `Knowledge` 实例。 - **返回:** 加载的实例指针。 #### `void save(const std::string& path) override` - **描述:** 保存知识库到指定路径。 #### `void build_vectors() override` - **描述:** 构建知识库的向量。 ### 私有成员 - `std::unique_ptr document_`:指向文档的智能指针。 --- ## Pipeline 类 ### 描述 `Pipeline` 类用于处理输入字符串,并管理不同的模块,包括 LLM、嵌入、知识库和聊天记忆。 ### 构造函数 #### `Pipeline()` - **描述:** 默认构造函数,用于初始化 `Pipeline` 实例。 ### 析构函数 #### `~Pipeline()` - **描述:** 析构函数,用于清理资源。 ### 公共方法 #### `static Pipeline* load(const std::string& path)` - **描述:** 从指定路径加载 `Pipeline` 实例。 - **参数:** - `path`:配置文件路径。 - **返回:** 加载的 `Pipeline` 实例指针。 #### `void invoke(const std::string& str)` - **描述:** 处理输入字符串并执行相应操作。 - **参数:** - `str`:输入字符串。 ### 私有方法 #### `bool need_memory(const std::string& str)` - **描述:** 判断输入字符串是否需要记忆模块。 #### `bool need_knowledge(const std::string& str)` - **描述:** 判断输入字符串是否需要知识库模块。 #### `std::string build_prompt(const std::string& str)` - **描述:** 根据输入字符串构建提示。 ### 私有成员 - `std::unique_ptr llm_`:指向 LLM 实例的智能指针。 - `std::shared_ptr embedding_`:指向嵌入实例的共享指针。 - `std::unique_ptr knowledge_`:指向知识库实例的智能指针。 - `std::unique_ptr memory_`:指向聊天记忆实例的智能指针。 - `std::string system_`:系统信息字符串。 - `std::string user_`:用户信息字符串。 - `std::string assistant_`:助手信息字符串。 - `std::vector prompts_`:提示的向量。 - `json config_`:配置的 JSON 对象。