当前位置 : 首页 » 文章分类 :  开发  »  LLM 大语言模型

LLM 大语言模型

LLM 大语言模型

基于qwen的agent demo
https://github.com/owenliang/agent


AI工具中文文档库

http://www.aidoczh.com/


OpenCompass 大模型排行榜

大模型榜单
https://rank.opencompass.org.cn/home

大模型竞技场,可对比多个模型的效果
https://opencompass.org.cn/arena


百度千帆文心一言免费 ERNIE-Speed 模型对接

百度智能云-千帆大模型平台

千帆ModelBuilder 部分ERNIE系列模型免费开放公告

1、注册百度智能云账号,找到自己的 ak,sk,需要实名认证后才能免费调用 ERNIE-Speed-8K
百度智能云-如何获取AKSK

2、进入 管理控制台 - 计费管理,选择免费的模型,开通计费。
虽然 ERNIE-Speed-128K 和 ERNIE-Speed-8K 是免费的,但也需要开通计费,否则接口调用报错 {“error_code”:17,”error_msg”:”Open api daily request limit reached”}
千帆 - 管理控制台 - 计费管理

3、把 postman 签名脚本加入 pre-script,配置环境变量 ak、sk
百度智能云-生成签名(认证字符串)的脚本

4、通过api调用 ERNIE-Speed
百度智能云-ERNIE-Speed-8K
百度智能云-ERNIE-Speed-128K

5、通过 AppBuilder 创建应用
千帆-AppBuilder


大语言模型综述

https://github.com/RUCAIBox/LLMSurvey

英文原版:
https://arxiv.org/abs/2303.18223


推理优化

大模型推理性能指标

大语言模型推理后端基准评测
https://zhuanlan.zhihu.com/p/711229268

Time to First Token (TTFT):表示由发送请到模型吐出第一个token的时间(以毫秒计)
Token Generation Rate (TGR):以秒为单位,衡量一秒种内系统吐出的tokens数。


多模态大模型

LLaVA-OneVision

hf:https://llava-vl.github.io/blog/2024-08-05-llava-onevision/
arxiv:https://arxiv.org/abs/2408.03326


知识库/知识加工

Embedding 模型中的“迟分”策略

长文本 Embedding 模型中的“迟分”策略
https://mp.weixin.qq.com/s?__biz=MzkyODIxMjczMA==&mid=2247501187&idx=1&sn=94fd0b8f53b39bd0adbaab86834996cd&chksm=c21eb616f5693f0003c00ccd779af415d9ef3e966fe13f93e8b970e5b5a84d9fa7e953e89d73&scene=21#wechat_redirect

JinaAI 智能切分

RAG 系统的分块难题:小型语言模型如何找到最佳断点?
https://mp.weixin.qq.com/s/_8aStJchSoHN6jYVMb0Hkw

HuggingFists

https://github.com/Datayoo/HuggingFists
https://github.com/Datayoo/HuggingFists/blob/main/README_ZH.md

HuggingFists 支持通过低代码的方式使用Hugging Face网站提供的各类模型

HuggingFists 还内置了丰富的数据接入、解析、处理等算子,方便用户搭建出复杂的数据处理及模型应用场景


RagFlow

https://github.com/infiniflow/ragflow

https://demo.ragflow.io/knowledge


ChatGPT 资源

免费chatgpt3.5

https://chat18.aichatos.xyz/

低价购买gpt试用账号

https://xedu.me/


OpenAI API 代理

https://www.openai-proxy.com/
直接将官方接口域名 api.openai.com 替换为 https://api.openai-proxy.com 即可在国内网络环境下直接调用,支持SSE。

https://openai-sb.com/


Agent 智能体

OpenAI swarm agent 编排框架

https://github.com/openai/swarm

CrewAI Agent 智能体框架

https://docs.crewai.com/introduction

LLM Powered Autonomous Agents

LLM Powered Autonomous Agents
https://lilianweng.github.io/posts/2023-06-23-agent/

剖析BabyAGI:原生多智能体案例一探究竟

https://blog.csdn.net/Attitude93/article/details/136415737


coze/扣子-智能体编排

bot编排,app商店
https://www.coze.cn/home


embedding 向量化

向量模型可以将任意文本映射为低维稠密向量,以用于检索、分类、聚类或语义匹配等任务,并可支持为大模型调用外部知识。

BGE 向量模型

智源发布最强开源可商用中英文语义向量模型BGE(BAAI General Embedding),在中英文语义检索精度与整体语义表征能力均超越了社区所有同类模型,如OpenAI 的text embedding 002等。此外,BGE 保持了同等参数量级模型中的最小向量维度,使用成本更低。
BGE模型将任意文本映射为低维稠密向量,以用于检索、分类、聚类或语义匹配等任务,并可支持为大模型调用外部知识。

https://arxiv.org/pdf/2309.07597

https://github.com/FlagOpen/FlagEmbedding/blob/master/README_zh.md

text2vec-base-chinese 中文语句转向量

中文语句转 768 维向量,可用于 语义匹配

shibing624/text2vec-base-chinese
https://huggingface.co/shibing624/text2vec-base-chinese


LLM 相关资源

LangSmith

https://www.langchain.com/langsmith
LLM DevOps平台,专门用于开发、测试、部署LLM(大语言模型)应用程序。
LangSmith的关键功能包括链路追踪调试应用、提示工具协作构建提示、数据集管理测试数据、自动评估应用质量、一键部署等。

langchain-java

https://github.com/HamaWhiteGG/langchain-java

Poe 大模型聚合

https://poe.com/

从零开始写一个gpt

https://www.youtube.com/watch?v=kCc8FmEb1nY&ab_channel=AndrejKarpathy

LangGPT prompt 学习

https://aq92z6vors3.feishu.cn/wiki/RXdbwRyASiShtDky381ciwFEnpe

Express+Vue3实现gpt页面

https://github.com/Chanzhaoyu/chatgpt-web

dify 大模型应用平台(LLMOps)

https://dify.ai/zh

FastGPT 大模型应用平台

https://github.com/labring/FastGPT


llm.c 纯c实现训练gpt-2

https://github.com/karpathy/llm.c


morphic-问答式AI搜索

https://www.morphic.sh/
https://github.com/miurla/morphic


kimi-长文档理解

kimi 超长文档、链接内容总结
https://kimi.moonshot.cn/


特定领域大模型

Awesome Domain LLM
https://github.com/luban-agi/Awesome-Domain-LLM

LawGPT 法律中文大语言模型

https://github.com/pengxiao-song/LaWGPT

chatlaw

https://chatlaw.cloud/


RAG 检索增强

RAG(Retrieval Augmented Generation,检索增强生成)是一个将大规模语言模型(LLM)与来自外部知识源的检索相结合的框架。

为什么需要 RAG?
LLM 的训练集是固定的,知识是静态、封闭、有限的,在具体细分行业使用 LLM 时,需要结合外部检索工程框架弥补 LLM 知识不足的问题。

RAG 基本流程:
1、知识索引。
事先将文本数据进行处理,通过向量化技术(embedding)将文本映射到向量空间并存储到向量数据库中,或者利用 Elasticsearch 全文索引文档,构建出可检索的知识片段。
涉及文档处理、文档分割、向量化、向量数据库。

2、知识检索。
输入问题,在知识库中进行检索(向量相似度匹配、全文检索),找到与问题最相关的一批文档。

3、问答。
把问题+检索得到的与问题最相关的文档一起输入到 LLM,让 LLM 根据相关文档回答问题,甚至返回答案所引用的文档,这里需要仔细的调整 prompt

Applying OpenAI’s RAG Strategies
https://blog.langchain.dev/applying-openai-rag/

langchain 文档分割demo

https://langchain-text-splitter.streamlit.app/

Langchain 提供多种文档分割方式,区别在怎么确定块与块之间的边界、块由哪些字符/token组成、以及如何测量块大小

  • RecursiveCharacterTextSplitter(): 按字符串分割文本,递归地尝试按不同的分隔符进行分割文本。
  • CharacterTextSplitter(): 按字符来分割文本。
  • MarkdownHeaderTextSplitter(): 基于指定的标题来分割markdown 文件。
  • TokenTextSplitter(): 按token来分割文本。
  • SentenceTransformersTokenTextSplitter(): 按token来分割文本。
  • Language(): 用于 CPP、Python、Ruby、Markdown 等。
  • NLTKTextSplitter(): 使用 NLTK(自然语言工具包)按句子分割文本。
  • SpacyTextSplitter(): 使用 Spacy按句子的切割文本。

token数计算

你提问耗费了 100 token,GPT 根据你的输入,生成文本(也就是回答)了 200 token,那么一共消费的 token 数就是 300 。

通常,4 个英文字符占一个token,而1个汉字大致是1个token

gpt 会忽略空格,用 https://charactercalculator.com/zh-cn/ 看忽略空格的字符数

OpenAI tokenizer 工具计算token数

在 openAI 网站上有工具
https://platform.openai.com/tokenizer


OpenCompass 大模型评测

困惑度 PPL(perplexity)

将问题与候选答案组合在一起,计算模型在所有组合上的困惑度(perplexity),并选择困惑度最小的答案作为模型的最终输出。
例如,若模型在 问题? 答案1 上的困惑度为 0.1,在 问题? 答案2 上的困惑度为 0.2,最终我们会选择 答案1 作为模型的输出。

infer_cfg 推理配置

infer_cfg 配置使用了 OpenICL 的思想,使用 retriever 从数据集中查询出一些 上下文样例in-context example,拼入 prompt 模板中。

infer_cfg 配置示例:

infer_cfg=dict(
    ice_template=dict(  # 用于构造 In Context Example (ice) 的模板
        type=PromptTemplate,
        template='{question}\n{answer}'
    ),
    prompt_template=dict(  # 用于构造主干 prompt 的模板
        type=PromptTemplate,
        template='Solve the following questions.\n</E>{question}\n{answer}',
        ice_token="</E>"
    ),
    retriever=dict(type=FixKRetriever, fix_id_list=[0, 1]),  # 定义 in context example 的获取方式
    inferencer=dict(type=GenInferencer),  # 使用何种方式推理得到 prediction
)

retriever 上下文样例检索方法

retriever 配置上下文样例的获取方式

ZeroRetriever(zero-shot) 零样本

retriever 是 ZeroRetriever 就是 zero-shot 零样本,不需要查询 in-context example

few-shot 少量样本

其他 retriever 是 few-shot,需要定义 ice_template 字段,设置 上下文样例 In Context Example(ICE) 的模板

inferencer 推理类型

OpenCompass 中主要支持了两种 Infernecer:GenInferencer 和 PPLInferencer

PPLInferencer 判别式推理

PPLInferencer 对应判别式推理。在推理时,模型被要求计算多个输入字符串各自的混淆度 (PerPLexity / ppl),并将其中 ppl 最小的项作为模型的推理结果。

GenInferencer 生成式推理

GenInferencer 对应生成式的推理。在推理时,模型被要求以输入的提示词为基准,继续往下续写。


OpenICL

Shark-NLP / OpenICL
https://github.com/Shark-NLP/OpenICL

OpenICL 是一个用于 上下文学习(In-context learning) 的工具包,同时也是一个 LLM 评估开源工具包,OpenCompass 中的评估就使用了 OpenICL


OpenICL 流程

OpenICL 流程:通过用户指定的检索方法(例如TopK或VoteK)从索引集中获取适当的上下文示例,插入到 prompt 模板中,一起输入到大模型。

如何快速地设计并评估fewshot示例的效果:OpenICL上下文示例学习框架推荐及实现源码
https://aibard123.com/digest/2023/1120/如何快速地设计并评估fewshot示例的效果OpenICL上下文示例学习框架推荐及实现源码/


AGIEval 中文测试集

https://opendatalab.com/OpenDataLab/AGIEval/tree/main/raw


JTokkit 用于大模型的Java分词编码库

https://github.com/knuddelsgmbh/jtokkit

计算 token 数
encoding.countTokens(“This is a sample sentence.”);

编码:
IntArrayList encoded = encoding.encode(“This is a sample sentence.”);


chat/completions ChatGPT聊天补全API

https://platform.openai.com/docs/api-reference/chat/create

基本上使用 https://api.openai.com/v1/chat/completions 这个核心 API 就行。

认证

sk 放 header 中即可

messages 角色 role

  • user 用户问的问题或指令放 messages 中的 user role
  • assistant 多轮对话时,gpt返回的内容放 assistant 中
  • system 角色扮演的 promt 放 system 中

多轮对话

传入 messages 列表,将之前 gpt 的返回放到 assistant role 中

流式返回

stream 传 true,会开启 Server-Send Events(SSE),服务端主动将回答内容流式推送给客户端。

top_p

温度参数 temperature

默认值 1
值越大(如0.8或0.9),回答越随机越有创造性,适合:写故事、创意写作等
当温度值接近0时如0.2或0.3),模型生成的文本将更加确定和一致,适合:回答问题、提供事实等

示例:

{
    "model": "gpt-3.5-turbo",
    "temperature": 0.5,
    "stream": true,
    "messages": [
        {
            "role": "user",
            "content": "如何使用Postman来测试ChatGPT的Stream API"
        }
    ]
}

Spring AI + WebSocket 对接 ChatGPT 流式 API

使用 chatgpt-spring-boot-starter 快速接入

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    <version>0.8.0</version>
</dependency>

websocket service中,调用 OpenAiChatClient.stream() 流式api,返回 Flux<ChatResponse>,subscribe 订阅每个字符,调用 jakarta.websocket.Session.getBasicRemote().sendText() 发送单个字符到 WebSocket session

@OnMessage
public void onMessage(Session session, String message) {
    log.info("Received sessionId={} message={}", session.getId(), message);
    // WebSocket是由底层的Servlet容器(如Tomcat)直接创建的,而不是由Spring创建的,所以不能直接使用@Autowired注入Spring管理的Bean,必须SpringUtil.getBean()获取
    SpringUtil.getBean(OpenAiChatClient.class)
                .stream(new Prompt(message))
                .subscribe(chatResponse ->
                        ofNullable(chatResponse.getResults()
                                                .stream()
                                                .map(Generation::getOutput)
                                                .map(AbstractMessage::getContent)
                                                .filter(StringUtils::isNotBlank)
                                                .collect(Collectors.joining()))
                                .filter(StringUtils::isNotBlank)
                                .ifPresent(resp -> {
                                    try {
                                        session.getBasicRemote().sendText(resp);
                                    } catch (IOException e) {
                                        log.error("发送消息出错:{}", e.getMessage(), e);
                                    }
                                }));
}

Spring AI
https://docs.spring.io/spring-ai/reference/index.html


langchain4j

https://github.com/langchain4j/langchain4j


前端流式输出(打字机效果)

1、一开始直接将每次返回的 choice.delta.content 内容 append 到 div 末尾,可以实现打字机流式输出,但没有 Markdown 渲染。
2、后来使用一个字符串变量累加每次回答的结果,每收到服务端发来的一次数据,都累加后用 marked 进行 Markdown 渲染并替换 div 内容,可实现打字机流式输出 + 实时 Markdown 渲染及代码高亮,但代码高亮效果不太好。

<script type="text/javascript">
  var websocket;
  var chatGptStreaming = false; // true: ChatGpt 流式回答中
  var chatGptFullResp = ""; // ChatGpt 累积完整回答

  //markdown解析,代码高亮设置
  marked.setOptions({
      highlight: function (code, language) {
          // const hljs = require('highlight.js');
          const validLanguage = hljs.getLanguage(language) ? language : 'plaintext';
          return hljs.highlight(code, { language: validLanguage }).value;
      },
  });

  if ( 'WebSocket' in window) {
    // 实例化WebSocket对象,指定要连接的服务器地址与端口建立连接
    websocket = new WebSocket("ws://localhost:8001/ws/chat");
    // 连接打开事件
    websocket.onopen = function() {
        console.log("Socket 已打开");
    };

    // 收到消息事件
    websocket.onmessage = function(msg) {
        console.log("收到消息:" + msg.data);
        // ChatGpt 流式回答结束
        if (msg.data === "[DONE]") {
            console.log("ChatGpt 流式回答结束");
            chatGptStreaming = false;
            chatGptFullResp = "";
            return;
        }
        var time = new Date().toLocaleString();
        var resp = JSON.parse(msg.data);
        $("#div-status").css("background-color", "rgb(82, 196, 26)");

        // ChatGpt 流式回答
        if (resp.object == "chat.completion.chunk") {
          if (!chatGptStreaming) {
            chatGptStreaming = true;
          }
          choices = JSON.parse(event.data).choices;
          choices.filter(choice => choice.delta.content).forEach(choice => {
              if (choice.delta.content.indexOf("\n") >= 0) {
                  choice.delta.content = choice.delta.content.replace("\n", "<br>");
              }
              console.log(chatGptFullResp);
              chatGptFullResp += choice.delta.content;
              // $(`#${resp.id}`).append(choice.delta.content); // 未加 Markdown 渲染的版本,每次往 div 末尾 append 添加返回的流式内容
              // 添加 Markdown 渲染的版本,用全局变量累加记录本地的完整回答,每次渲染后替换 div 内容
              $(`#${resp.id}`).html(marked.parse(chatGptFullResp)); 
          });
        } 
        // 始终显示滚动条最底部
        $("#div-msg").scrollTop($("#div-msg").prop("scrollHeight"));
    };
  } else {
      console.log("当前浏览器不支持WebSocket");
  }
</script>

扒一扒 Chatgpt 背后的 web 开发技术(二)
https://zhaozhiming.github.io/2023/04/18/chatgpt-technical-part-two/

使用marked和highlight.js对GPT接口返回的代码块渲染,高亮显示,支持复制,和选择不同的高亮样式
https://juejin.cn/post/7255557296951738429


上一篇 OkHttp

下一篇 H2

阅读
评论
3.6k
阅读预计15分钟
创建日期 2023-09-17
修改日期 2024-07-05
类别
目录
  1. AI工具中文文档库
  2. OpenCompass 大模型排行榜
  3. 百度千帆文心一言免费 ERNIE-Speed 模型对接
  4. 大语言模型综述
  5. 推理优化
    1. 大模型推理性能指标
  6. 多模态大模型
    1. LLaVA-OneVision
  7. 知识库/知识加工
    1. Embedding 模型中的“迟分”策略
    2. JinaAI 智能切分
    3. HuggingFists
    4. RagFlow
  8. ChatGPT 资源
    1. 免费chatgpt3.5
    2. 低价购买gpt试用账号
    3. OpenAI API 代理
  9. Agent 智能体
    1. OpenAI swarm agent 编排框架
    2. CrewAI Agent 智能体框架
    3. LLM Powered Autonomous Agents
    4. 剖析BabyAGI:原生多智能体案例一探究竟
    5. coze/扣子-智能体编排
  10. embedding 向量化
    1. BGE 向量模型
    2. text2vec-base-chinese 中文语句转向量
  11. LLM 相关资源
    1. LangSmith
    2. langchain-java
    3. Poe 大模型聚合
    4. 从零开始写一个gpt
    5. LangGPT prompt 学习
    6. Express+Vue3实现gpt页面
    7. dify 大模型应用平台(LLMOps)
    8. FastGPT 大模型应用平台
    9. llm.c 纯c实现训练gpt-2
    10. morphic-问答式AI搜索
    11. kimi-长文档理解
  12. 特定领域大模型
    1. LawGPT 法律中文大语言模型
    2. chatlaw
  13. RAG 检索增强
    1. langchain 文档分割demo
  14. token数计算
    1. OpenAI tokenizer 工具计算token数
  15. OpenCompass 大模型评测
    1. 困惑度 PPL(perplexity)
    2. infer_cfg 推理配置
      1. retriever 上下文样例检索方法
        1. ZeroRetriever(zero-shot) 零样本
        2. few-shot 少量样本
      2. inferencer 推理类型
        1. PPLInferencer 判别式推理
        2. GenInferencer 生成式推理
  16. OpenICL
  17. AGIEval 中文测试集
    1. JTokkit 用于大模型的Java分词编码库
  18. chat/completions ChatGPT聊天补全API
    1. 认证
    2. messages 角色 role
    3. 多轮对话
    4. 流式返回
    5. top_p
    6. 温度参数 temperature
  19. Spring AI + WebSocket 对接 ChatGPT 流式 API
  20. langchain4j
  21. 前端流式输出(打字机效果)

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论