赞
踩
借助于无标注数据训练,可以用于大量下游任务;多个应用可以依赖于极少的几个大模型统一建设
可以对话交互
LLaMA:Meta
GLM:Tsinghua
通义千问:阿里巴巴
Baichuan:百川智能
输入给LLM的文本或问题,接收到的输出是Completion
{
"system prompt":"你是一个幽默风趣的个人知识库助手,可以根据给定的知识库内容回答用户的提问,注意,你的回答风格应是幽默风趣的",
"user prompt":"我今天有什么事务?"
}
首先需要获取密钥API Key、Secret Key,然后基于密钥获取access_token,利用access_token进行调用
定义一个继承自 LLM 类的自定义 LLM 类:
要实现自定义 Embeddings,需要定义一个自定义类继承自 LangChain 的 Embeddings 基类,然后定义三个函数:
用户原始输入与模型和示例进行组合,然后输入给大语言模型,再根据大语言模型的返回结果进行输出或者结构化处理。
import warnings warnings.filterwarnings('ignore') from langchain.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.chains import LLMChain # 这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。 # 如果你想要每次得到不一样的有新意的答案,可以尝试调整该参数。 llm = ChatOpenAI(temperature=0.0) #初始化提示模版 prompt = ChatPromptTemplate.from_template("描述制造{product}的一个公司的最佳名称是什么?") #将大语言模型(LLM)和提示(Prompt)组合成链 chain = LLMChain(llm=llm, prompt=prompt) #运行大语言模型链 product = "大号床单套装" chain.run(product)
SequentialChain 是简单顺序链的更复杂形式,允许多个输入/输出。
语言模型仅依赖预训练数据,与外界“断开”。Agent可以使得它具备计算和获取外界知识的能力。
核心点不是对模型的优化,因为大部分是直接调用模型API来实现,因此更多是一个工程问题
本地文档 -> 读取文本 -> 文本分割 -> 文本向量化(向量化的文本及其索引会存入数据库) -> question向量化 -> 在文本向量中匹配出与问句向量最相似的 top k个 -> 匹配出的文本作为上下文和问题一起添加到 prompt中 -> 提交给 LLM生成回答。
包括 LLM API 调用、向量数据库、检索问答链
-project -readme.md 项目说明 -requirements.txt 使用依赖包的版本 -llm LLM调用封装 -self_llm.py 自定义 LLM 基类 -wenxin_llm.py 自定义百度文心 LLM -spark_llm.py 自定义讯飞星火 LLM -zhipuai_llm.py 自定义智谱AI LLM -call_llm.py 将各个 LLM 的原生接口封装在一起 -test.ipynb 使用示例 -embedding embedding调用封装 -zhipuai_embedding.py 自定义智谱AI embedding -call_embedding.py 调用 embedding 模型 -data 源数据路径 -database 数据库层封装 -create_db.py 处理源数据及初始化数据库封装 -qa_chain 应用层封装 -qa_chain.py 封装检索问答链,返回一个检索问答链对象 -chat_qa_chian.py:封装对话检索链,返回一个带有历史记录的对话检索链对象 -get_vectordb.py 返回向量数据库对象 -model_to_llm.py 调用模型 -test.ipynb 使用示例 -serve 服务层封装 -run_gradio.py 启动 Gradio 界面 -api.py 封装 FastAPI -run_api.sh 启动 API -test.ipynb 使用示例
利用langchain.document_loaders库可以加载pdf、md、mp4文档(使用whisper)
代表性分割方法:RecursiveCharacterTextSplitter(): 按字符串分割文本,递归地尝试按不同的分隔符进行分割文本
* RecursiveCharacterTextSplitter 递归字符文本分割
RecursiveCharacterTextSplitter 将按不同的字符递归地分割(按照这个优先级["\n\n", "\n", " ", ""]),
这样就能尽量把所有和语义相关的内容尽可能长时间地保留在同一位置
RecursiveCharacterTextSplitter需要关注的是4个参数:
* separators - 分隔符字符串数组
* chunk_size - 每个文档的字符数量限制
* chunk_overlap - 两份文档重叠区域的长度:可以保持上下文信息
* length_function - 长度计算函数
vectordb = Chroma.from_documents(
documents=split_docs[:100], # 为了速度,只选择了前 100 个切分的 doc 进行生成。
embedding=embedding,
persist_directory=persist_directory # 允许我们将persist_directory目录保存到磁盘上
)
vectordb.persist() # 持久化向量数据库,以便我们在未来的课程中使用。
sim_docs = vectordb.similarity_search(question,k=3)
核心思想是在已经选择了一个相关性高的文档之后,再选择一个与已选文档相关性较低但是信息丰富的文档。
通过传入语言模型和向量数据库创建一个检索器,使用我呢提查询调用
# 导入检索式问答链
from langchain.chains import RetrievalQA
# 声明一个检索式问答链
qa_chain = RetrievalQA.from_chain_type(
llm,
retriever=vectordb.as_retriever()
)
定义了一个提示模板,包含一些关于如何使用下面的上下文片段的说明,然后有一个上下文变量的占位符。
from langchain.prompts import PromptTemplate
# Build prompt
template = """使用以下上下文片段来回答最后的问题。如果你不知道答案,只需说不知道,不要试图编造答案。答案最多使用三个句子。尽量简明扼要地回答。在回答的最后一定要说"感谢您的提问!"
{context}
问题:{question}
有用的回答:"""
QA_CHAIN_PROMPT = PromptTemplate.from_template(template)
更多文档处理方法如下:
选择用 ```,“”",< >, ,: 等做分隔符,只要能明确起到隔断作用即可。
使用分割符可以避免提示词注入:即用户输入的文本可能包含预设prompt冲突的内容
照某种格式组织的内容,例如JSON、HTML
prompt = f"""
请生成包括书名、作者和类别的三本虚构的、非真实存在的中文书籍清单,\
并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)
我们可以告诉模型先检查这些假设,如果不满足,则会指 出并停止执行后续的完整流程
少样本提示:在模型执行任务之前先给几个满足要求和期望的输出
prompt = f"""
您的任务是以一致的风格回答问题(注意:文言文和白话的区别)。
<学生>: 请教我何为耐心。
<圣贤>: 天生我材必有用,千金散尽还复来。
<学生>: 请教我何为坚持。
<圣贤>: 故不积跬步,无以至千里;不积小流,无以成江海。骑骥一跃,不能十步;驽马十驾,功在不舍。
<学生>: 请教我何为孝顺。
"""
response = get_completion(prompt)
print(response)
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(llm,
retriever=vectordb.as_retriever(),
return_source_documents=True,
chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})# 加上我们的本地知识,就可以帮助 LLM 做出更好的回答
使用 ConversationBufferMemory ,它保存聊天消息历史记录的列表,这些历史记录将在回答问题时与问题一起传递给聊天机器人,从而将它们添加到上下文中。
将新问题放在之前对话的语境中进行检索,可以处理依赖历史信息的查询。并保留所有信 息在对话记忆中,方便追踪。
在遇到一些棘手的例子无法通过Prompt或者算法解决时,需要手动将这些添加到测试集合之中,并且对这些小样本集性能进行评估
让模型选择一个答案,但还是可能输出不止一个文字,这里可以设计一个函数进行解析
将一个模型输出给另一个大模型,同时给它评分规则和知识片段。
这里尽量使用比当前模型性能更好的模型来评分
由于需要调用不同的大模型,这里首先定义一个自定义的大模型基类,在此基础上对不同大模型区别于基类调用的地方进行重写
可以让你从 Python 中通过友好的 Web 界面演示机器学习模型。在
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。