FastGPT源碼解析 Agent 大模型對接接口和使用詳解

FastGPT 大模型對接核心代碼分析

核心架構概覽

FastGPT 采用統一模型抽象層設計,通過標準化接口對接多種大模型,支持 LLM、Embedding、ReRank、TTS、STT 等多種 AI 能力。

支持各種大模型能力的配置,包括本地ollama、各個AI云廠商的API接入配置,支持知識庫的分詞、排序、向量化處理,支持Agent的對話和業務邏輯處理,完成完整的Agent可視化配置支撐。

核心文件主要主要在packages/global/core/ai/目錄,有model.ts、model.d.ts、config.ts、index.ts、ReRank.ts等

1. 模型管理架構

全局模型映射

// 全局模型存儲結構
declare global {var llmModelMap: Map<string, LLMModelItemType>;var embeddingModelMap: Map<string, EmbeddingModelItemType>;var reRankModelMap: Map<string, ReRankModelItemType>;var ttsModelMap: Map<string, TTSModelType>;var sttModelMap: Map<string, STTModelType>;var systemDefaultModel: {llm: LLMModelItemType;embedding: EmbeddingModelItemType;rerank?: ReRankModelItemType;tts?: TTSModelType;stt?: STTModelType;};
}

模型獲取接口

// 統一的模型獲取接口
export const getLLMModel = (model?: string) => {if (!model) return getDefaultLLMModel();return global.llmModelMap.get(model) || getDefaultLLMModel();
};export const getEmbeddingModel = (model?: string) => {if (!model) return getDefaultEmbeddingModel();return global.embeddingModelMap.get(model) || getDefaultEmbeddingModel();
};export const getReRankModel = (model?: string) => {if (!model) return getDefaultRerankModel();return global.reRankModelMap.get(model) || getDefaultRerankModel();
};// 通用模型查找
export const findAIModel = (model: string) => {return (global.llmModelMap.get(model) ||global.embeddingModelMap.get(model) ||global.ttsModelMap.get(model) ||global.sttModelMap.get(model) ||global.reRankModelMap.get(model));
};

2. LLM 模型對接

模型配置結構

export type LLMModelItemType = {provider: ModelProviderIdType;           // 提供商: OpenAI/Claude/GLM等model: string;                           // 模型名稱name: string;                            // 顯示名稱// 能力參數maxContext: number;                      // 最大上下文長度maxResponse: number;                     // 最大響應長度quoteMaxToken: number;                   // 最大引用TokenmaxTemperature?: number;                 // 最大溫度值// 功能支持vision?: boolean;                        // 視覺能力reasoning?: boolean;                     // 推理能力functionCall: boolean;                   // 函數調用toolChoice: boolean;                     // 工具選擇// 專用功能datasetProcess?: boolean;                // 知識庫處理usedInClassify?: boolean;               // 問題分類usedInExtractFields?: boolean;          // 內容提取usedInToolCall?: boolean;               // 工具調用// 自定義配置defaultSystemChatPrompt?: string;        // 默認系統提示詞defaultConfig?: Record<string, any>;     // 默認請求配置fieldMap?: Record<string, string>;       // 字段映射// 直連配置requestUrl?: string;                     // 自定義請求URLrequestAuth?: string;                    // 自定義認證
};

統一 API 客戶端

export const getAIApi = (props?: { userKey?: OpenaiAccountType; timeout?: number 
}) => {const { userKey, timeout } = props || {};// 優先級: 用戶配置 > 全局配置 > 環境變量const baseUrl = userKey?.baseUrl || global?.systemEnv?.oneapiUrl || openaiBaseUrl;const apiKey = userKey?.key || global?.systemEnv?.chatApiKey || openaiBaseKey;return new OpenAI({baseURL: baseUrl,apiKey,httpAgent: global.httpsAgent,timeout,maxRetries: 2});
};

聊天完成接口

export const createChatCompletion = async ({body, userKey, timeout, options
}) => {const modelConstantsData = getLLMModel(body.model);const ai = getAIApi({ userKey, timeout });// 支持自定義請求路徑和認證const response = await ai.chat.completions.create(body, {...options,...(modelConstantsData.requestUrl ? { path: modelConstantsData.requestUrl } : {}),headers: {...options?.headers,...(modelConstantsData.requestAuth ? { Authorization: `Bearer ${modelConstantsData.requestAuth}` } : {})}});// 判斷響應類型const isStreamResponse = typeof response === 'object' && response !== null && ('iterator' in response || 'controller' in response);return { response, isStreamResponse };
};

3. Embedding 模型對接

Embedding 配置

export type EmbeddingModelItemType = {provider: ModelProviderIdType;model: string;name: string;// Token 配置defaultToken: number;                    // 默認分塊TokenmaxToken: number;                        // 最大Tokenweight: number;                          // 訓練權重// 處理配置normalization?: boolean;                 // 歸一化處理hidden?: boolean;                        // 是否隱藏// 自定義配置defaultConfig?: Record<string, any>;     // 通用配置dbConfig?: Record<string, any>;          // 存儲配置queryConfig?: Record<string, any>;       // 查詢配置
};

向量化實現

export async function getVectorsByText({ model, input, type 
}: GetVectorProps) {const ai = getAIApi();// 根據類型選擇配置const config = {...model.defaultConfig,...(type === EmbeddingTypeEnm.db && model.dbConfig),...(type === EmbeddingTypeEnm.query && model.queryConfig),model: model.model,input: [input]};const result = await ai.embeddings.create(config,model.requestUrl ? {path: model.requestUrl,headers: model.requestAuth ? {Authorization: `Bearer ${model.requestAuth}`} : undefined} : {});// 處理向量數據const vectors = await Promise.all(result.data.map(item => unityDimensional(item.embedding))  // 統一維度.map(item => {if (model.normalization) return normalization(item);  // 歸一化return item;}));return { tokens: await countPromptTokens(input), vectors };
}// 統一向量維度到1536
function unityDimensional(vector: number[]) {if (vector.length > 1536) {return vector.slice(0, 1536);}const zeroVector = new Array(1536 - vector.length).fill(0);return vector.concat(zeroVector);
}// L2歸一化處理
function normalization(vector: number[]) {if (vector.some(item => item > 1)) {const norm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));return vector.map(val => val / norm);}return vector;
}

4. ReRank 模型對接

ReRank 實現

export function reRankRecall({model = getDefaultRerankModel(),query,documents
}: {model?: ReRankModelItemType;query: string;documents: { id: string; text: string }[];
}): Promise<ReRankCallResult> {const { baseUrl, authorization } = getAxiosConfig();return POST<PostReRankResponse>(model.requestUrl ? model.requestUrl : `${baseUrl}/rerank`,{model: model.model,query,documents: documents.map(doc => doc.text)},{headers: {Authorization: model.requestAuth ? `Bearer ${model.requestAuth}` : authorization},timeout: 30000}).then(data => {return data?.results?.map(item => ({id: documents[item.index].id,score: item.relevance_score}));});
}

5. 模型配置管理

配置文件結構

{"llmModels": [{"provider": "OpenAI","model": "gpt-4o-mini","name": "gpt-4o-mini","maxContext": 128000,"maxResponse": 16000,"quoteMaxToken": 120000,"vision": true,"datasetProcess": true,"usedInClassify": true,"usedInExtractFields": true,"usedInToolCall": true,"toolChoice": true,"functionCall": false,"defaultConfig": {},"fieldMap": {}}],"vectorModels": [{"provider": "OpenAI","model": "text-embedding-3-small","name": "text-embedding-3-small","defaultToken": 512,"maxToken": 3000,"weight": 100}],"reRankModels": [],"audioSpeechModels": [{"provider": "OpenAI","model": "tts-1","name": "OpenAI TTS1","voices": [{ "label": "Alloy", "value": "alloy" },{ "label": "Echo", "value": "echo" }]}],"whisperModel": {"provider": "OpenAI","model": "whisper-1","name": "Whisper1"}
}

動態模型管理

// 模型配置更新
export const updateModelConfig = async (modelData: any) => {// 驗證模型配置const validatedModel = validateModelConfig(modelData);// 更新全局映射if (validatedModel.type === 'llm') {global.llmModelMap.set(validatedModel.model, validatedModel);} else if (validatedModel.type === 'embedding') {global.embeddingModelMap.set(validatedModel.model, validatedModel);}// 持久化配置await saveModelConfig(validatedModel);
};// 模型測試
export const testModel = async (modelConfig: any) => {try {if (modelConfig.type === 'llm') {const response = await createChatCompletion({body: {model: modelConfig.model,messages: [{ role: 'user', content: 'Hello' }],max_tokens: 10}});return { success: true, response };}if (modelConfig.type === 'embedding') {const result = await getVectorsByText({model: modelConfig,input: 'test text'});return { success: true, vectors: result.vectors };}} catch (error) {return { success: false, error: error.message };}
};

6. 多提供商支持

提供商適配

// 支持的模型提供商
export enum ModelProviderIdType {OpenAI = 'OpenAI',Anthropic = 'Anthropic',Google = 'Google',Baidu = 'Baidu',ByteDance = 'ByteDance',Moonshot = 'Moonshot',DeepSeek = 'DeepSeek',Other = 'Other'
}// 提供商特殊處理
const providerAdapters = {[ModelProviderIdType.OpenAI]: {formatRequest: (body) => body,formatResponse: (response) => response},[ModelProviderIdType.Anthropic]: {formatRequest: (body) => ({...body,// Claude 特殊格式轉換}),formatResponse: (response) => ({// 響應格式標準化})}
};

字段映射處理

// 處理不同模型的字段差異
const applyFieldMapping = (body: any, fieldMap: Record<string, string>) => {const mappedBody = { ...body };Object.entries(fieldMap).forEach(([from, to]) => {if (mappedBody[from] !== undefined) {mappedBody[to] = mappedBody[from];delete mappedBody[from];}});return mappedBody;
};// 示例: o1 模型字段映射
const o1FieldMap = {"max_tokens": "max_completion_tokens"
};

7. 錯誤處理與監控

統一錯誤處理

const handleModelError = (error: any, modelConfig: any) => {addLog.error(`Model ${modelConfig.model} error`, {error: error.message,provider: modelConfig.provider,requestUrl: modelConfig.requestUrl});// 根據錯誤類型返回友好提示if (error.code === 'insufficient_quota') {return '模型配額不足,請檢查賬戶余額';}if (error.code === 'model_not_found') {return '模型不存在,請檢查模型配置';}return `模型調用失敗: ${error.message}`;
};

性能監控

const monitorModelPerformance = async (modelCall: () => Promise<any>) => {const startTime = Date.now();try {const result = await modelCall();const duration = Date.now() - startTime;addLog.info('Model call success', {duration,tokens: result.tokens,cost: result.cost});return result;} catch (error) {const duration = Date.now() - startTime;addLog.error('Model call failed', {duration,error: error.message});throw error;}
};

總結

FastGPT 大模型對接核心實現了統一、靈活、可擴展的模型管理架構:

  1. 統一抽象: 通過標準化接口屏蔽不同模型的差異
  2. 多模型支持: LLM、Embedding、ReRank、TTS、STT 全覆蓋
  3. 靈活配置: 支持自定義請求路徑、認證、字段映射
  4. 動態管理: 運行時模型配置更新和測試
  5. 錯誤處理: 完善的錯誤處理和性能監控
  6. 提供商適配: 支持主流 AI 服務提供商

這套架構為 FastGPT 提供了強大的 AI 能力集成基礎,支持快速接入新的模型和提供商。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95839.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95839.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95839.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI Compass前沿速覽:Kimi K2、InfinityHuman-AI數字人、3D-AI桌面伴侶、疊疊社–AI虛擬陪伴

AI Compass前沿速覽&#xff1a;Kimi K2、InfinityHuman-AI數字人、3D-AI桌面伴侶、疊疊社–AI虛擬陪伴 AI-Compass 致力于構建最全面、最實用、最前沿的AI技術學習和實踐生態&#xff0c;通過六大核心模塊的系統化組織&#xff0c;為不同層次的學習者和開發者提供從完整學習路…

如何下載B站視頻,去水印,翻譯字幕

首先先來看下如何下載B站視頻及音頻工具&#xff1a;手機下載視頻打開文件管理器&#xff0c;找到video.m4s和audio.m4s兩個文件更改文件后綴名第一步到此為止然后我們再來看一下如何去水印&#xff0c;去字幕工具&#xff1a;剪映導入視頻選擇蒙版 > 鏡面點擊反轉點擊基礎&…

用 Cursor AI 快速開發你的第一個編程小程序

Cursor AI 作為新一代 AI 編程助手&#xff0c;集成了代碼補全、智能調試、自動生成等強大功能&#xff0c;非常適合用來開發小型應用或小程序。本文我將手把手帶你用 Cursor AI 開發一個簡單的天氣查詢小程序&#xff0c;并在文中推薦一門實用的商業變現課程&#xff0c;助你走…

MacOS 使用 luarocks+wrk+luajit

MacOS 使用 luarockswrkluajit luarocks 默認使用的是 lua 5.4 版本&#xff0c;一些工具&#xff0c;例如 wrk 使用的 lua 5.1&#xff0c;那么 luarocks 在安裝依賴的時候就需要指定 lua 5.1。 luarocks config 配置 lua 5.1 請確保已經安裝了 lua5.1 或者 luajit&#xff0c…

PostgreSQL18-FDW連接的 SCRAM 直通身份驗證

PostgreSQL18-FDW連接的 SCRAM 直通身份驗證 PostgreSQL 18 為使用 postgres_fdw 或 dblink_fdw 的人帶來了很好的改進&#xff1a;SCRAM 直通身份驗證。設置外部服務器連接時&#xff0c;您不再需要在“用戶映射”選項中存儲純文本密碼。 這是實現它的提交&#xff1a; commit…

“臥槽,系統又崩了!”——別慌,這也許是你看過最通俗易懂的分布式入門

在分布式系統中&#xff0c;有效應對節點故障、網絡分區延遲和數據一致性等挑戰至關重要。本文將剖析保障分布式系統可靠性的核心機制&#xff1a;數據分片實現水平擴展&#xff0c;冗余副本保障數據高可用&#xff0c;租約&#xff08;Lease&#xff09;機制優化節點狀態共識與…

【代碼隨想錄算法訓練營——Day4】鏈表——24.兩兩交換鏈表中的節點、19.刪除鏈表的倒數第N個節點、面試題02.07.鏈表相交、142.環形鏈表II

LeetCode題目鏈接 https://leetcode.cn/problems/swap-nodes-in-pairs/ https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/ https://leetcode.cn/problems/linked-list-cycle…

C#中一段程序類比博圖

using system //博圖中要使用自帶指令庫&#xff0c;指令庫名稱叫systemnamespace Simple//博圖建立程序&#xff0c;分診斷文件夾&#x1f4c2;&#xff0c;vision文件夾&#xff0c;通訊Db文件夾&#x1f4c2;等等&#xff0c;simple類似博圖中的文件夾名稱{class Program//程…

vue飛自在酒店管理系統(代碼+數據庫+LW)

摘 要 近年來&#xff0c;隨著科技的迅猛進步和經濟全球化的深入發展&#xff0c;互聯網技術正以前所未有的速度提升社會綜合發展的效能。這一技術的影響力已滲透到各行各業&#xff0c;其中&#xff0c;飛自在酒店管理系統在互聯網時代背景下扮演著舉足輕重的角色。信息管理…

2025年統計與數據分析領域專業認證發展指南

在數據驅動決策日益重要的背景下&#xff0c;專業認證作為提升統計學和數據分析能力的一種方式&#xff0c;受到越來越多從業者的關注。本文基于行業發展趨勢&#xff0c;分析6個相關領域的專業資格認證&#xff0c;為專業人士提供參考。一、數據分析能力認證含金量CDA數據分析…

激光頻率梳 3D 輪廓測量 - 油路板的凹槽深度和平面度測量

一、引言油路板作為液壓系統核心部件&#xff0c;其凹槽深度與平面度精度直接影響油液流動特性與密封性能。傳統測量方法在面對復雜油路結構時存在效率低、精度不足等問題。激光頻率梳 3D 輪廓測量技術憑借時頻基準優勢&#xff0c;為油路板關鍵參數測量提供了新路徑&#xff0…

七彩喜微高壓氧艙:科技與體驗的雙重革新,重新定義家用氧療新標桿

在高壓氧艙市場競爭日益激烈的今天&#xff0c;七彩喜微高壓氧艙憑借其獨特的技術創新、極致的用戶體驗和貼心的服務生態&#xff0c;在眾多品牌中脫穎而出。它不僅是一臺設備&#xff0c;更是一個“懂你需求、護你健康”的智能健康伙伴。對比其他品牌&#xff0c;七彩喜的優勢…

[光學原理與應用-418]:非線性光學 - 數學中的線性函數與非線性函數

線性函數與非線性函數是數學和工程領域中描述變量關系的基礎工具&#xff0c;二者在定義、性質、圖像特征及應用場景上存在本質差異。以下從核心概念、數學特性、圖像對比、應用場景及實際案例五個維度展開詳細分析&#xff1a;一、核心概念&#xff1a;線性 vs 非線性線性函數…

前端登錄鑒權詳解

1.cookie-session1. cookiecookie簡單來說就是瀏覽器客戶端在請求時會攜帶的一個字段數據&#xff0c;常用與保存當前用戶狀態并在請求時攜帶給服務端驗證。2. sessionsession簡單來說就是服務單對于每一個用戶生成一個用戶會話標識session /session id&#xff0c;并返回給客戶…

從零實現 LLM(上):原理講透 + 最小可運行 GPT

引言 為什么要學習 LLM&#xff1f; 當你和 ChatGPT 對話時&#xff0c;它不僅能回答你的問題&#xff0c;還能續寫故事、記住上下文&#xff0c;甚至調整風格。你可能會想&#xff1a;它是怎么做到的&#xff1f; 答案就是&#xff1a;大語言模型&#xff08;Large Languag…

浪潮科技Java開發面試題及參考答案(120道題-下)

如何給 MySQL 表添加索引?添加索引的語法是什么?添加索引時需要考慮哪些因素(如字段類型、查詢頻率、索引選擇性)? 給 MySQL 表添加索引需根據業務需求選擇合適的索引類型,不同類型的索引語法不同,同時需綜合評估字段特性、查詢模式等因素,避免無效或過度索引。 一、…

大數據畢業設計選題推薦-基于大數據的宮頸癌風險因素分析與可視化系統-Spark-Hadoop-Bigdata

?作者主頁&#xff1a;IT研究室? 個人簡介&#xff1a;曾從事計算機專業培訓教學&#xff0c;擅長Java、Python、微信小程序、Golang、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦??? Java項目 Python…

【PyTorch實戰:Tensor變形】5、 PyTorch Tensor指南:從基礎操作到Autograd與GPU加速實戰

一、Tensor核心概念解析 1.1 什么是Tensor? Tensor是PyTorch中最基本的數據結構,也是深度學習框架的核心計算單元。我們可以將Tensor理解為多維數組的統一表示,它在PyTorch中的地位相當于NumPy中的ndarray,但具有兩個關鍵增強特性:GPU加速支持和自動求導能力。 1.2 為…

2025年我國具身智能產業鏈全景分析

一、具身智能產業概述與定義 1.1 具身智能的基本概念與內涵 具身智能&#xff08;Embodied Intelligence&#xff09;是指通過物理實體與環境進行交互的智能系統&#xff0c;其核心在于將感知、決策和執行緊密結合&#xff0c;使智能體能夠在動態環境中自主感知、學習和執行任務…

VMWare上搭建大數據集群

文章目錄1. 采用軟件較新版本2. 準備三臺虛擬機3. 搭建Hadoop集群3.1 在主節點上配置Hadoop3.1.1 編輯映射文件3.1.2 配置免密登錄3.1.3 配置JDK3.1.4 配置Hadoop3.2 從主節點分發到從節點3.3 格式化名稱節點3.4 啟動Hadoop集群3.5 使用Hadoop WebUI3.6 運行MR應用&#xff1a;…