测试 token 数量的站点
https://gpt-tokenizer.dev/
GPT-4O 参数设置
max_tokens: 限定最大返回 token 数量
temperature: 文风的温度, 越大创造性越强 0.8
n: 生成几条答案: 1,2,3
top_p:代替 temperature 参数,越大越有多样性的。 1.0
presence_penalty:增加多样性,避免生成重复内容: 0, (1.0)
frequency_penalty: 增加多样性,减少重复内容,增加流畅度,用于营销。0 (1.0)


AI-Langchain
LLMs
指的是将外界的大模型统一的再度封装。封装为一层模型的标准
Message(通信消息模板):
AIMessage
{
"response_metadata": "将大模型返回的内容进行一层封装",
"tool_calls": "用于调用tools的一个入口"
}
SystemMessage 系统(功能/角色)设定, 例如,现在需要一个专门的翻译模型,那么就可以定义 SystemMessage 为:"请将下面我输入的内容翻译为英文"。
PromptTemplate(提示词模板)
ChatPromptTemplate.from_message 用于声明聊天的提示词模板,会将你输入的消息转义为: AIMessage | HumanMessage
MessagePlaceholder 聊天模板占位符。在使用模板的时候,可以使用
llm.invoke({args: "xxx"})
用来转移问题中的占位符。但是这个,可以直接将消息声明为模板占用。
OutputParser(输出格式解析)
StrOutputParser 在前面有提到过,大模型的返回,langchain 会将其进行封装为一个对象,但是在只需要内容时,可以使用其将内容只转换为一个数据内容。而不是一个返回对象。
JsonOutoutParser 将大模型的返回,转换为 json 对象。
Chains (链式调用)
链式写法,采用 "|" 来进行链式的调用。
chain = model | parser | xxx chain.invoke(message)
stream、invoke 是同步的,如果要异步的可以使用: astream 与 ainvoke。
Few shot、Example Selector(批量提示词)
FewShortPromptTemplate 对于一些短的,已经存在的问题和答案模板,作为上下文,将其转化为一定的格式。
semanticSimilarityExampleSelector.from_examples 需要配合 embeddings、vectorStorages(向量数据库)、k(匹配顺序) 达成效果 这个是一个基础版本的 rag,将长的模板,转使用 embedding 转换为向量,存储数据库中,在进行数据库相似度检索,作为上下文。
LangServer(基于 FastAPI)
模型代理服务器(省略简介,内容角度,可去官网查看。)
Message History、Chat History
建议采用 redis 存储会话消息 两种不同的消息历史记录,需要安装 redis 的包,将消息历史存储在 redis 中,并进行消息上下文的存储。
Cache Model response(问题缓存命中)
langchain_core.caches InMemoryCache(内存 cache)|SqLiteCache(数据库 cache) 配合 set_llm_cache、sqlLite 保存 相同的问题,可以直接取缓存中的回复,采用 SqlLiteCache 将回复的内容,全部存储本地数据库,随后在下次提问时,直接从数据中得到答案。
多模态
OutputParser: JSON、XML
自定义 JSON 字段:pydantic_object、pydantic 库
xml defusedxsl 库、XMLOutputParser 最终去 parser 不能直接通过 chain 的方式 parser
Tools
联网搜索的功能,类似于 hooks
一般的工具都可以写为异步函数
StructuredTool, 支持同步调用和异步调用,以及自定义传参 handle_tool_error: 自定义全局异常后的错误内容
ToolException 错误处理 handle_tool_error: True(只打印错误内容)、False(直接抛出异常)
如何使用 Tool tool.invoke()
内建 Tools
Agent(重点)
create_tool_calling_agent 参数分为三部分:model、tools:[xxx,xxx]、prompt 执行: invoke
回答多个问题
意图匹配、向量检索(余弦相似度)
Rag search (mmr 检索)
Faiss 一般是用来做内存数据库的查询,本地数据库使用一般是 chroma、milvus
Rag 识别图像- 采用:OCR 工具(图像转换数据-(ragidocr-onnxruntime, 此库可以识别验证码))
PyPDFLoader(filepath, extract_images=True)
RecursiveCharacterTextSplitter 递归文字分割。
分割时按照这种分割,性能较好,分割时,支持正则表达式
语义化进行分块(langchain_experimental -> SemanticChunker)
SemanticChunker(embedding, breakpoint_threshold_type="percentile", breakpoint_threshold_amount=50)
文章内容什么的,适合此种方式切分。固定的格式,没有语义的文章,适合普通的方式拆分。 语义拆分,是将文章本身按照关键词拆分后,在按照语义进行分块合并后,再次拆分、普通的拆分,直接按照文章本身关键词进行拆分。
agent 其实也是不知道什么时候去调用什么工具的,所以只能通过提示词来让 agent 来决策。这个就叫做: React
让 agent 具备上下文的功能,在 AgentExecutor 中传递 memory 字段即可
如何获取到 agent 的执行过程以及思考过程
callback 的回调方式 如图:
chain 的 callback 回调函数
使用 chain 的时候,使用回调函数
自定义 callback
自定义模型的回调函数
rag 检索时,需要自定义检索的逻辑。可以尝试自定义 retriever 来实现
自定义一个 retriever,继承 BaseRetriever
当有有一些特定格式或特殊格式文件时,如果需要 loader 加载,可以使用 自定义 loader
自定义一个类,继承 BaseLoader
LangGraph
Graphs(整个流程/图)、State(节点之前的共享数据(Redux、Vuex))、Nodes(节点)、Edges(边,节点之间的联系边)
持久化、多 Agent 协作
Hugging Face(类似于 AI 界的 github):
transformer
编码器(bert):情感分类,文本分析。做分析所使用的。
解码器(gpt):解压、特征还原、文章生成。做生成所使用的。 gpt2 模型是一个续写模型(接着你的问题进行继续描述的),现在的大模型都是基于此模型上的数据集训练的。
datasets、
tokenizers
hugging face 的使用
安装必要的包:使用清华镜像源下载:pip install transformers datasets tokenizers -i https://xxxx
模型 API 调用:https://api-inference.huggingface.co/madels/uer/{model-name}
hugging face 模型下载 pipeline 下载,指定模型类型以及模型的名称就可以下载了
hugging face 的本地模型一般分为三类 文本续写、文本分类()、问答系统(阅读理解)
模型微调,训练 数据集(datasets):开源数据集、自定义数据集
load_datasets:加载数据集,split:训练集、测试集、cache_dir:将训练集数据下载到本地 加载数据集分为:加载本地数据集(加载本地数据集时,必须使用 load_datasets 下载后,在使用 save_to_disk 保存在本地后再次进行加载。、支持加载 csv 格式的数据集)、加载在线的数据集、将数据集转换为其它格式,如:csv
模型的 max_length 是可以动态调整的。
模型本身就是一个数学矩阵,因此其是只识别数字的,因此,我们的训练数据集是需要将单词或字符转换为数字的。可以使用 tokenizer 在 vocab.txt 中去查看每个单词或字符对用的索引。这个索引就是模型识别的数值。
一般的训练都是增量微调,精度到 .9 就可以了。或者计算损失度下降的阀值也可以
模型最大长度中,训练文本超出模型最大长度问题处理:
一个中文字符占 4 个 token、特殊字符两个
bert 模型的训练一般是下游,本身的特征提取部分是不会参与训练的。 gpt 模型的训练一般都是基于特征提取部分训练。(训练有难度加大) gpt 的模型训练,在训练时,一定是要去掉最后一轮的。 drop_last = True。在训练时,顺序是打乱的,因此在多轮训练的情况下,舍弃掉的数据在下次的训练中会被继续训练到 批次太小的话,会导致在训练时,损失度会来回上下波动 batch_size 给到设备的最大上限是最好的。因为模型本身的训练其实就是学些数据集的特征,如果批次给的太小,那么模型的每次训练的特征占比整个数据集是很小的。(不论是 bert 模型还是 gpt 模型)
bert 模型一般就是做分类任务的。(特征提取)