3、LangChain基础:LangChain Chat Model
Prompt templates: Few shot、Example selector
Few shot(少量示例)
创建少量示例的格式化程序
创建一个简单的提示模板,用于在生成时向模型提供示例输入和输出。向LLM提供少量这样的示例被称为少量示例,这是一种简单但强大的指导生成的方式,在某些情况下可以显著提高模型性能。
少量示例提示模板可以由一组示例或一个负责从定义的集合中选择一部分示例的示例选择器类构建。
配置一个格式化程序,将少量示例格式化为字符串。这个格式化程序应该是一个<font style="color:rgb(28, 30, 33);">PromptTemplate</font>
对象。
from langchain_core.prompts import PromptTemplate
example_prompt = PromptTemplate.from_template("问题:{question}\n{answer}")
创建示例集合
接下来,我们将创建一个少量示例的列表。每个示例应该是一个字典,表示我们上面定义的格式化提示的示例输入。
examples = [{"question": "谁活得更长,穆罕默德·阿里还是艾伦·图灵?","answer": """
是否需要后续问题:是的。
后续问题:穆罕默德·阿里去世时多大年纪?
中间答案:穆罕默德·阿里去世时74岁。
后续问题:艾伦·图灵去世时多大年纪?
中间答案:艾伦·图灵去世时41岁。
所以最终答案是:穆罕默德·阿里
""",},{"question": "克雷格斯列表的创始人是什么时候出生的?","answer": """
是否需要后续问题:是的。
后续问题:克雷格斯列表的创始人是谁?
中间答案:克雷格斯列表的创始人是克雷格·纽马克。
后续问题:克雷格·纽马克是什么时候出生的?
中间答案:克雷格·纽马克于1952年12月6日出生。
所以最终答案是:1952年12月6日
""",},{"question": "乔治·华盛顿的外祖父是谁?","answer": """
是否需要后续问题:是的。
后续问题:乔治·华盛顿的母亲是谁?
中间答案:乔治·华盛顿的母亲是玛丽·波尔·华盛顿。
后续问题:玛丽·波尔·华盛顿的父亲是谁?
中间答案:玛丽·波尔·华盛顿的父亲是约瑟夫·波尔。
所以最终答案是:约瑟夫·波尔
""",},{"question": "《大白鲨》和《皇家赌场》的导演都来自同一个国家吗?","answer": """
是否需要后续问题:是的。
后续问题:《大白鲨》的导演是谁?
中间答案:《大白鲨》的导演是史蒂文·斯皮尔伯格。
后续问题:史蒂文·斯皮尔伯格来自哪个国家?
中间答案:美国。
后续问题:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是马丁·坎贝尔。
后续问题:马丁·坎贝尔来自哪个国家?
中间答案:新西兰。
所以最终答案是:不是
""",},
]
让我们使用其中一个示例测试格式化提示:
print(example_prompt.invoke(examples[0]).to_string())
问题:谁活得更长,穆罕默德·阿里还是艾伦·图灵?是否需要后续问题:是的。
后续问题:穆罕默德·阿里去世时多大年纪?
中间答案:穆罕默德·阿里去世时74岁。
后续问题:艾伦·图灵去世时多大年纪?
中间答案:艾伦·图灵去世时41岁。
所以最终答案是:穆罕默德·阿里
将示例和格式化程序传递给<font style="color:rgb(28, 30, 33);">FewShotPromptTemplate</font>
最后,创建一个FewShotPromptTemplate对象。该对象接受少量示例和少量示例的格式化程序。当格式化此<font style="color:rgb(28, 30, 33);">FewShotPromptTemplate</font>
时,它使用<font style="color:rgb(28, 30, 33);">example_prompt</font>
格式化传递的示例,然后将它们添加到<font style="color:rgb(28, 30, 33);">suffix</font>
之前的最终提示中:
from langchain_core.prompts import FewShotPromptTemplate
prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,suffix="问题:{input}",input_variables=["input"],
)
print(prompt.invoke({"input": "乔治·华盛顿的父亲是谁?"}).to_string()
)
问题:谁活得更长,穆罕默德·阿里还是艾伦·图灵?是否需要后续问题:是的。
后续问题:穆罕默德·阿里去世时多大年纪?
中间答案:穆罕默德·阿里去世时74岁。
后续问题:艾伦·图灵去世时多大年纪?
中间答案:艾伦·图灵去世时41岁。
所以最终答案是:穆罕默德·阿里问题:克雷格斯列表的创始人是什么时候出生的?是否需要后续问题:是的。
后续问题:克雷格斯列表的创始人是谁?
中间答案:克雷格斯列表的创始人是克雷格·纽马克。
后续问题:克雷格·纽马克是什么时候出生的?
中间答案:克雷格·纽马克于1952年12月6日出生。
所以最终答案是:1952年12月6日问题:乔治·华盛顿的外祖父是谁?是否需要后续问题:是的。
后续问题:乔治·华盛顿的母亲是谁?
中间答案:乔治·华盛顿的母亲是玛丽·波尔·华盛顿。
后续问题:玛丽·波尔·华盛顿的父亲是谁?
中间答案:玛丽·波尔·华盛顿的父亲是约瑟夫·波尔。
所以最终答案是:约瑟夫·波尔问题:《大白鲨》和《皇家赌场》的导演都来自同一个国家吗?是否需要后续问题:是的。
后续问题:《大白鲨》的导演是谁?
中间答案:《大白鲨》的导演是史蒂文·斯皮尔伯格。
后续问题:史蒂文·斯皮尔伯格来自哪个国家?
中间答案:美国。
后续问题:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是马丁·坎贝尔。
后续问题:马丁·坎贝尔来自哪个国家?
中间答案:新西兰。
所以最终答案是:不是问题:乔治·华盛顿的父亲是谁?
通过向模型提供这样的示例,我们可以引导模型做出更好的回应。
Example selectors(示例选择器)
我们将重用上一节中的示例集和格式化程序。但是,我们不会直接将示例馈送到 <font style="color:rgb(28, 30, 33);">FewShotPromptTemplate</font>
对象中,而是将它们馈送到名为 SemanticSimilarityExampleSelector 的 <font style="color:rgb(28, 30, 33);">ExampleSelector</font>
实现实例中。该类根据输入与少样本示例的相似性选择初始集合中的少样本示例。它使用嵌入模型计算输入与少样本示例之间的相似性,以及向量存储库执行最近邻搜索。
为了展示它的样子,让我们初始化一个实例并在隔离环境中调用它:
from langchain_chroma import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings
example_selector = SemanticSimilarityExampleSelector.from_examples(# 这是可供选择的示例列表。examples,# 这是用于生成嵌入的嵌入类,用于衡量语义相似性。OpenAIEmbeddings(),# 这是用于存储嵌入并进行相似性搜索的 VectorStore 类。Chroma,# 这是要生成的示例数量。k=1,
)
# 选择与输入最相似的示例。
question = "玛丽·波尔·华盛顿的父亲是谁?"
selected_examples = example_selector.select_examples({"question": question})
print(f"与输入最相似的示例: {question}")
for example in selected_examples:print("\n")for k, v in example.items():print(f"{k}: {v}")
与输入最相似的示例: 玛丽·波尔·华盛顿的父亲是谁?
answer:
是否需要后续问题:是的。
后续问题:乔治·华盛顿的母亲是谁?
中间答案:乔治·华盛顿的母亲是玛丽·波尔·华盛顿。
后续问题:玛丽·波尔·华盛顿的父亲是谁?
中间答案:玛丽·波尔·华盛顿的父亲是约瑟夫·波尔。
所以最终答案是:约瑟夫·波尔
question: 乔治·华盛顿的外祖父是谁?
Chroma 安装报错
pip install langchain-chroma
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
[end of output]
解决方案:需要先下载visual-cpp-build-tools,再执行pip install langchain-chroma
下载地址:https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/
现在,让我们创建一个 <font style="color:rgb(28, 30, 33);">FewShotPromptTemplate</font>
对象。该对象接受示例选择器和用于少样本示例的格式化程序提示。
prompt = FewShotPromptTemplate(example_selector=example_selector,example_prompt=example_prompt,suffix="Question: {input}",input_variables=["input"],
)
print(prompt.invoke({"input": "玛丽·波尔·华盛顿的父亲是谁?"}).to_string()
)
问题:乔治·华盛顿的外祖父是谁?
是否需要后续问题:是的。
后续问题:乔治·华盛顿的母亲是谁?
中间答案:乔治·华盛顿的母亲是玛丽·波尔·华盛顿。
后续问题:玛丽·波尔·华盛顿的父亲是谁?
中间答案:玛丽·波尔·华盛顿的父亲是约瑟夫·波尔。
所以最终答案是:约瑟夫·波尔
Question: 玛丽·波尔·华盛顿的父亲是谁?
LangServe
概述
LangServe 🦜️🏓 帮助开发者将 <font style="color:rgb(28, 30, 33);">LangChain</font>
可运行和链部署为 REST API。
该库集成了 FastAPI 并使用 pydantic 进行数据验证。
Pydantic 是一个在 Python中用于数据验证和解析的第三方库,现在是Python中使用广泛的数据验证库。
- 它利用声明式的方式定义数据模型和Python 类型提示的强大功能来执行数据验证和序列化,使您的代码更可靠、更可读、更简洁且更易于调试。。
- 它还可以从模型生成 JSON 架构,提供了自动生成文档等功能,从而轻松与其他工具集成
此外,它提供了一个客户端,可用于调用部署在服务器上的可运行对象。JavaScript 客户端可在 LangChain.js 中找到。
特性
- 从 LangChain 对象自动推断输入和输出模式,并在每次 API 调用中执行,提供丰富的错误信息
- 带有 JSONSchema 和 Swagger 的 API 文档页面(插入示例链接)
- 高效的
<font style="color:rgb(28, 30, 33);">/invoke</font>
、<font style="color:rgb(28, 30, 33);">/batch</font>
和<font style="color:rgb(28, 30, 33);">/stream</font>
端点,支持单个服务器上的多个并发请求 <font style="color:rgb(28, 30, 33);">/stream_log</font>
端点,用于流式传输链/代理的所有(或部分)中间步骤- 新功能 自 0.0.40 版本起,支持
<font style="color:rgb(28, 30, 33);">/stream_events</font>
,使流式传输更加简便,无需解析<font style="color:rgb(28, 30, 33);">/stream_log</font>
的输出。 - 使用经过严格测试的开源 Python 库构建,如 FastAPI、Pydantic、uvloop 和 asyncio。
- 使用客户端 SDK 调用 LangServe 服务器,就像本地运行可运行对象一样(或直接调用 HTTP API)
限制
- 目前不支持服务器发起的事件的客户端回调
- 当使用 Pydantic V2 时,将不会生成 OpenAPI 文档。FastAPI 不支持混合使用 pydantic v1 和 v2 命名空间。更多细节请参见下面的章节。
安装
对于客户端和服务器:
pip install --upgrade "langserve[all]"
或者对于客户端代码,<font style="color:rgb(28, 30, 33);">pip install "langserve[client]"</font>
,对于服务器代码,<font style="color:rgb(28, 30, 33);">pip install "langserve[server]"</font>
。
LangChain CLI 🛠️
使用 <font style="color:rgb(28, 30, 33);">LangChain</font>
CLI 快速启动 <font style="color:rgb(28, 30, 33);">LangServe</font>
项目。
要使用 langchain CLI,请确保已安装最新版本的 <font style="color:rgb(28, 30, 33);">langchain-cli</font>
。您可以使用 <font style="color:rgb(28, 30, 33);">pip install -U langchain-cli</font>
进行安装。
设置
注意:我们使用 <font style="color:rgb(28, 30, 33);">poetry</font>
进行依赖管理。请参阅 poetry