目录

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到本地。

image-20240605224207110用langchain调用ollama的模型(官方教程使用的是llama2)

image-20240605225039103

5. LLM Chain链条

为什么用LangChain

LangChain 包的主要价值主张是:

  1. 组件:用于处理语言模型的可组合工具和集成。无论你是否使用 LangChain 框架的其余部分,组件都是模块化的,易于使用
  2. 现成的:用于完成高级任务的组件的内置组合

LLM Chain的一个例子,下面链条中包括了模型、提示、输出解析。

image-20240605225050951

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开头)。

下面的例子中包括了指令、上下文、用户输入。

image-20240605225102384

实际上,不太可能硬编码上下文和用户问题。我们会通过一个 模板 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:

image-20240605225154718

使用这个模板的时候,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模板的例子。

image-20240605225238497

7. 少样本提示

少样本提示(ref. https://www.promptingguide.ai/zh/techniques/fewshot . https://arxiv.org/pdf/2001.08361),当模型足够大时,仅需要给出少量提示,模型就能从少量样本中学习到如何执行认为。

在LangChain中,少样本提示适合使用FewShotPromptTemplate。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from langchain import FewShotPromptTemplate
llm = Ollama(model="llama2")
from langchain import FewShotPromptTemplate

# create our examples
examples = [
    {
        "query": "How are you?",
        "answer": "I can't complain but sometimes I still do."
    }, {
        "query": "What time is it?",
        "answer": "It's time to get a watch."
    }
]

# create a example template
example_template = """
User: {query}
AI: {answer}
"""

# create a prompt example from above template
example_prompt = PromptTemplate(
    input_variables = ["query", "answer"],
    template = example_template
)
# now break our previous prompt into a prefix and suffix
# the prefix is our instructions
prefix = """ The following are exerpts from conversations with an AI
assistant. The assistant is typically sarcastic and witty, producing
creative and funny responses to the users questions. Here are some
examples: input
"""
# and the suffix our user input and output indicator
suffix = """
User: {query}
AI: """
# now create the few shot prompt template
few_shot_prompt_template = FewShotPromptTemplate(
    examples = examples,
    example_prompt = example_prompt,
    prefix = prefix,
    suffix = suffix,
    input_variables = ["query"],
    example_separator = "\n\n"
)
query = "What is the meaning of life?"
print(few_shot_prompt_template.format(query = query))
chain = few_shot_prompt_template | llm
chain.invoke({"query": "What is the meaning of life?"})

image-20240605225324806

8. 示例选择器(Example Selector)

在上面少样本提示的例子中,有很多参数设置,看上去好像把例子一口气丢给模型就行了,使用少样本模板看上去复杂化了使用大模型的方法,实际上规范化使用模板更重要的是为了使用LangChain的示例选择器。

我们的提示和补全 (completion)的最大长度是有限的。这个限制通过 最大上下文窗口 maximum context window 进行衡量。

上下文窗口 (ontext window) = input_tokens + output tokens。模型的输入内容数量是有上限的,上下文窗口的大小设定应该考虑硬件限制,合适的窗口大小才能带来更快的LLM补全。

有多种示例选择器,最简单的是LengthBasedExampleSelector ,他会根据示例的长度来选择,以适应特定的提示长度限制。如果询问的内容较长,那么他选择的示例就会更少;如果询问的内容较少,那么他选择的示例就会更多。这个选择器使用起来很简单,指定长度就行了,这里的长度就是token的个数,通常一个单词就是一个token。下面是一个示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from langchain.prompts.example_selector import LengthBasedExampleSelector
example_selector = LengthBasedExampleSelector(
    examples = examples,
    example_prompt = example_prompt,
    max_length = 50  # this sets the max length that examples should be
)
# now create the few shot prompt template
dynamic_prompt_template = FewShotPromptTemplate(
    example_selector = example_selector,  # use example_selector instead of examples
    example_prompt = example_prompt,
    prefix = prefix,
    suffix = suffix,
    input_variables = ["query"],
    example_separator = "\n"
)

SemanticSimilarityExampleSelector和MaxMarginalRelevanceExampleSelector.这两个selector是根据相似度来进行example的查找的。MaxMarginalRelevanceExampleSelector是SemanticSimilarityExampleSelector的字类,他是对SemanticSimilarityExampleSelector进行了一些算法上的优化.

点击下载