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

LLM 大语言模型

LLM 大语言模型

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


大语言模型综述

https://github.com/RUCAIBox/LLMSurvey

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


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 智能体

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


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

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

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

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

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/


coze/扣子-智能体编排

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


特定领域大模型

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

阅读
评论
2.8k
阅读预计12分钟
创建日期 2023-09-17
修改日期 2024-04-17
类别

页面信息

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

评论