Clj临时
参考资料:
https://techdiylife.github.io/blog/topic.html?category2=t07&blogid=0039
https://blog.csdn.net/qq_46106285/article/details/137430941 LangChain|Ollama结合LangChain使用的速通版(包含代码以及切换各种模型的方式)
https://cloud.tencent.com/developer/article/2324375 示例选择器
1. 安装anaconda
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
下载Anaconda3-4.1.1-Windows-x86_64.exe。
安装完成后,创建虚拟环境
conda create -n clj python==3.10
conda activate clj
2.安装langChain
https://python.langchain.com/v0.1/docs/get_started/installation/#langchain-cli
在虚拟环境中执行
conda install langchain -c conda-forge
langchain还有一些依赖可以安装,暂时不安装跳过这步
LangServe助力开发者以REST API的形式部署LangChain可运行文件和链条。通过LangChain CLI安装时,LangServe会自动安装。如果您不通过LangChain CLI安装,可以使用以下命令分别安装客户端和服务器所需的依赖:
- 安装所有依赖项:
pip install “langserve[all]”
- 仅安装客户端依赖项:
pip install “langserve[client]”
- 仅安装服务器依赖项:
pip install “langserve[server]”
LangChain CLI
LangChain CLI是一个非常实用的工具,它可以帮助您管理LangChain模板和其他LangServe项目。安装命令如下:
pip install langchain-cli
3. 安装jupyternotebook
安装命令:conda install -y jupyter
并不必须,但是便于学习,建议使用。
安装完后,执行jupyter notebook,可指定端口号,默认端口8888,在浏览器中打开http://localhost:8888/,即可进入交互界面。
4. 安装ollama
https://ollama.com/download/windows
安装完成后,执行ollama run codellama,将模型(3.8G)pull到本地。
用langchain调用ollama的模型(官方教程使用的是llama2)
5. LLM Chain链条
为什么用LangChain
LangChain 包的主要价值主张是:
- 组件:用于处理语言模型的可组合工具和集成。无论你是否使用 LangChain 框架的其余部分,组件都是模块化的,易于使用
- 现成的链:用于完成高级任务的组件的内置组合
LLM Chain的一个例子,下面链条中包括了模型、提示、输出解析。
6. 提示工程
p.s. 内容参考LangChain(https://cookbook.langchain.com.cn/docs/langchain-prompt-templates/)。
提示工程领域,一个典型的提示结构包括以下组件(并非所有的提示都使用这些组件,但是一个好的提示通常会使用两个或更多组件)
指令(instruction) :告诉模型该怎么做,如何使用外部信息(如果提供),如何处理查询并构建 Out。
外部信息 或 上下文 (contexts):充当模型的附加知识来源。这些可以手动插入到提示中,通过向量数据库 (Vector Database) 检索(检索增强)获得,或通过其他方式(API、计算等)引入。
用户输入或 查询 :通常(但不总是)是由人类用户(即提示者)输入到系统中的查询。
输出指示器(output indicator) :标记要生成的文本的 开头。(如果生成 Python 代码,我们可以使用import来指示模型必须开始编写 Python 代码(因为大多数 Python 脚本以import开头)。
)
下面的例子中包括了指令、上下文、用户输入。
实际上,不太可能硬编码上下文和用户问题。我们会通过一个 模板 PromptTemplate 将它们输入。
在LangChain里,像介绍LLM Chain链条的例子里,提示(prompt)用到了ChatPromptTemplate,是一种模板。那么什么是模板:
我们在使用AI时,AI回复的效果通常取决于我们的提问方式,例如:
1.你期望AI回答物理问题时,会先和AI约定说”你现在是一个物理学教授“;
2.你不希望AI自由发挥无中生有,你会在问题最后补上一句“如果你不知道,就说不知道,不要创造答案”(If you don't know the
answer, just say that you don’t know, don’t try to make up an answer)
而这些成规律的对话内容就形成了所谓对话的“模板”。Langchain 中的提示模板类旨在简化使用动态输入构建提示的过程。
构建一个模板prompt_template:
使用这个模板的时候,print(openai( prompt_template.format( query = “Which libraries and model providers offer LLMs?” )))
看上去只是将原本的输入query替换掉了,python可以用f-string轻松实现这个过程,但是 Langchain 的 PromptTemplate 对象,可以规范化这个过程,添加多个参数,并以面向对象的方式构建提示。
除了可以自己创造模板并调试外,LangChain也内置了很多种的模板。langchain官网对ChatPromptTemplate的封装:https://api.python.langchain.com/en/latest/prompts/langchain_core.prompts.chat.ChatPromptTemplate.html,下面是一个使用ChatPromptTemplate模板的例子。
7. 少样本提示
少样本提示(ref. https://www.promptingguide.ai/zh/techniques/fewshot . https://arxiv.org/pdf/2001.08361),当模型足够大时,仅需要给出少量提示,模型就能从少量样本中学习到如何执行认为。
在LangChain中,少样本提示适合使用FewShotPromptTemplate。
|
|
8. 示例选择器(Example Selector)
在上面少样本提示的例子中,有很多参数设置,看上去好像把例子一口气丢给模型就行了,使用少样本模板看上去复杂化了使用大模型的方法,实际上规范化使用模板更重要的是为了使用LangChain的示例选择器。
我们的提示和补全 (completion)的最大长度是有限的。这个限制通过 最大上下文窗口 maximum context window 进行衡量。
上下文窗口 (ontext window) = input_tokens + output tokens。模型的输入内容数量是有上限的,上下文窗口的大小设定应该考虑硬件限制,合适的窗口大小才能带来更快的LLM补全。
有多种示例选择器,最简单的是LengthBasedExampleSelector ,他会根据示例的长度来选择,以适应特定的提示长度限制。如果询问的内容较长,那么他选择的示例就会更少;如果询问的内容较少,那么他选择的示例就会更多。这个选择器使用起来很简单,指定长度就行了,这里的长度就是token的个数,通常一个单词就是一个token。下面是一个示例:
|
|
SemanticSimilarityExampleSelector和MaxMarginalRelevanceExampleSelector.这两个selector是根据相似度来进行example的查找的。MaxMarginalRelevanceExampleSelector是SemanticSimilarityExampleSelector的字类,他是对SemanticSimilarityExampleSelector进行了一些算法上的优化.