LLM 大语言模型
LLM 大语言模型
基于qwen的agent demo
https://github.com/owenliang/agent
AI工具中文文档库
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
低价购买gpt试用账号
OpenAI API 代理
https://www.openai-proxy.com/
直接将官方接口域名 api.openai.com 替换为 https://api.openai-proxy.com 即可在国内网络环境下直接调用,支持SSE。
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 大模型聚合
从零开始写一个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)
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
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
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: