写点什么

AnythingLLM - 全功能 AI 应用,轻松与文档对话

作者:qife
  • 2025-07-09
    福建
  • 本文字数:2318 字

    阅读完需:约 8 分钟

AnythingLLM - 全功能 AI 应用

<p align="center"><a href="https://anythingllm.com"><img src="https://github.com/Mintplex-Labs/anything-llm/blob/master/images/wordmark.png?raw=true" alt="AnythingLLM logo"></a></p>

项目概述

AnythingLLM 是一款开源的 AI 应用程序,允许您与文档聊天、使用 AI 代理,具有高度可配置性、多用户支持和简单部署的特点。它支持多种 LLM 提供商,并提供了完整的开发环境和多种部署选项。

功能特性

  • 文档对话:直接与上传的文档进行对话

  • 多用户支持:支持团队协作使用

  • AI 代理:内置 AI 代理功能

  • 高度可配置:支持多种 LLM 提供商和自定义设置

  • 简单部署:提供 Docker 容器、AWS 和 DigitalOcean 等多种部署方式

  • 多语言支持:内置多国语言界面

  • 安全认证:支持密码保护和 API 密钥管理

  • 数据隐私:可完全控制数据处理和存储

安装指南

最低要求

  • 至少 2GB 内存

  • 10GB 以上存储空间(根据文档和向量数据量增加)

  • NodeJS v18

  • Yarn

快速开始(Docker 推荐方式)

docker pull mintplexlabs/anythingllm
复制代码


Linux/MacOS 运行命令:


export STORAGE_LOCATION=$HOME/anythingllm && \mkdir -p $STORAGE_LOCATION && \touch "$STORAGE_LOCATION/.env" && \docker run -d \  --name anythingllm \  -p 3001:3001 \  -v "$STORAGE_LOCATION:/app/server/storage" \  mintplexlabs/anythingllm
复制代码

非 Docker 安装

  1. 克隆仓库:


git clone git@github.com:Mintplex-Labs/anything-llm.git
复制代码


  1. 安装依赖:


cd anything-llm && yarn setup
复制代码


  1. 配置环境变量:


cp server/.env.example server/.env
复制代码


  1. 启动应用:


# 构建前端cd frontend && yarn build# 复制到服务器目录cp -R frontend/dist server/public# 启动服务cd server && NODE_ENV=production node index.js &# 启动收集器cd collector && NODE_ENV=production node index.js &
复制代码

使用说明

基础使用

应用启动后,访问 http://localhost:3001 即可使用。

API 使用示例

处理文档的 API 示例:


const response = await fetch('http://localhost:3001/api/process', {  method: 'POST',  headers: {    'Content-Type': 'application/json',  },  body: JSON.stringify({    filename: 'example.pdf',    options: {}  })});
复制代码


处理链接的 API 示例:


const response = await fetch('http://localhost:3001/api/process-link', {  method: 'POST',  headers: {    'Content-Type': 'application/json',  },  body: JSON.stringify({    link: 'https://example.com',    scraperHeaders: {}  })});
复制代码

核心代码

文档处理核心逻辑

async function processSingleFile(targetFilename, options = {}) {  const fullFilePath = path.resolve(    WATCH_DIRECTORY,    normalizePath(targetFilename)  );    if (!isWithin(path.resolve(WATCH_DIRECTORY), fullFilePath))    return {      success: false,      reason: "Filename is a not a valid path to process.",      documents: [],    };
const fileExtension = path.extname(fullFilePath).toLowerCase(); let processFileAs = fileExtension; if (!SUPPORTED_FILETYPE_CONVERTERS.hasOwnProperty(fileExtension)) { if (isTextType(fullFilePath)) { processFileAs = ".txt"; } else { trashFile(fullFilePath); return { success: false, reason: `File extension ${fileExtension} not supported for parsing.`, documents: [], }; } }
const FileTypeProcessor = require(SUPPORTED_FILETYPE_CONVERTERS[processFileAs]); return await FileTypeProcessor({ fullFilePath, filename: targetFilename, options, });}
复制代码

链接处理核心逻辑

async function processLink(link, scraperHeaders = {}) {  if (!validURL(link)) return { success: false, reason: "Not a valid URL." };  return await scrapeGenericUrl({    link,    captureAs: "text",    processAsDocument: true,    scraperHeaders,  });}
async function getLinkText(link, captureAs = "text") { if (!validURL(link)) return { success: false, reason: "Not a valid URL." }; return await scrapeGenericUrl({ link, captureAs, processAsDocument: false, });}
复制代码

文本处理核心逻辑

async function processRawText(textContent, metadata) {  if (!textContent || textContent.length === 0) {    return {      success: false,      reason: "textContent was empty - nothing to process.",      documents: [],    };  }
const data = { id: v4(), url: METADATA_KEYS.possible.url(metadata), title: METADATA_KEYS.possible.title(metadata), docAuthor: METADATA_KEYS.possible.docAuthor(metadata), description: METADATA_KEYS.possible.description(metadata), docSource: METADATA_KEYS.possible.docSource(metadata), chunkSource: METADATA_KEYS.possible.chunkSource(metadata), published: METADATA_KEYS.possible.published(metadata), wordCount: textContent.split(" ").length, pageContent: textContent, token_count_estimate: tokenizeString(textContent), };
const document = writeToServerDocuments( data, `raw-${stripAndSlug(metadata.title)}-${data.id}` ); return { success: true, reason: null, documents: [document] };}
复制代码


更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)公众号二维码


办公AI智能小助手


用户头像

qife

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
AnythingLLM - 全功能AI应用,轻松与文档对话_AI_qife_InfoQ写作社区