1)示例选择器、提示词、大语言模型的协作流程机制
1、输入处理:
用户提供输入(例如一个问题或任务描述)。
示例选择器根据输入内容,从预定义的示例集中选择最相关的示例。选择依据可以是语义相似度、长度限制或其他策略。
2、动态构建提示词:
选择的示例被注入到提示词模板(PromptTemplate)中,与用户输入一起组成完整的提示词。
提示词通常包含:
1)系统指令(System Prompt):定义模型的任务或角色。
2)选择的示例:作为上下文或示范,展示输入-输出的范例。
3)用户输入:当前需要模型处理的内容。
3、提示词传递给模型:
完整的提示词被发送到大语言模型(LLM)或嵌入模型。
模型根据提示词中的示例和输入生成输出,示例起到引导作用,帮助模型理解期望的输出格式或内容。
4、模型生成输出:
模型利用提示词中的示例作为参考,生成与输入匹配的回答。
示例选择器的作用在于通过提供高质量的上下文示例,减少模型生成无关或错误内容的可能性。
5、后处理(可选):
如果需要,LangChain 可以通过输出解析器(Output Parser)对模型的输出进行结构化处理,确保格式符合预期。
2)常见示例选择器类型
LangChain 提供多种内置示例选择器,包括:
SemanticSimilarityExampleSelector:基于语义相似度(使用嵌入模型和向量数据库)选择与输入最接近的示例。
MaxMarginalRelevanceExampleSelector:结合语义相似度和示例多样性,选择既相关又多样化的示例。
LengthBasedExampleSelector:根据提示词长度限制选择示例,确保不超过上下文窗口。
RandomExampleSelector:随机选择示例,适用于不需要严格语义匹配的场景。
3)代码示例
# 示例选择器
import os
from dotenv import load_dotenv
from langchain_community.vectorstores import FAISS
from langchain_core.example_selectors import SemanticSimilarityExampleSelector, MaxMarginalRelevanceExampleSelector
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_ollama import ChatOllama, OllamaEmbeddings
class ExampleSelector:
# llm模型
llm = None
__dict__ = "示例集合,根据用户的输出,匹配到最相似的示例,从而根据其样式返回"
examples = None
# 提示词模板
prompt = None
def __init__(self):
self.llm = ChatOllama(model="llama3.1", base_url="http://localhost:11434")
self.examples = [
{"input": "北京今天天气如何?", "output": "北京今天晴,温度25-30°C。"},
{"input": "上海明天会下雨吗?", "output": "上海明天多云,无降雨。"},
{"input": "广州湿度是多少?", "output": "广州今天湿度70%。"},
{"input": "北京明天天气如何?", "output": "北京明天晴,温度25-30°C。"},
]
self.prompt = PromptTemplate(
input_variables=["input"],
template="你是一个天气助手,根据用户输入提供准确的天气信息。\n\n相关示例:\n{examples}\n\n用户输入: {input}\n回答:"
)
__doc__ = "语义相似度示例选择器,它通过找到具有与输入具有最大余弦相似度的嵌入的示例来实现这一点"
def similarity_example(self, input):
load_dotenv()
tavilyKey = os.getenv("TAVILY_API_KEY")
print("tavilyKey is:", tavilyKey)
# 初始化嵌入模型embeddings:该模型可以将文本(句子或文档)转换成高纬度向量表示;
embeddings = OllamaEmbeddings(model="llama3.1", base_url="http://localhost:11434")
# 创建 FAISS 向量存储
vectorstore = FAISS.from_texts(
texts=[ex["input"] for ex in self.examples],
embedding=embeddings,
metadatas=self.examples
)
# 创建示例选择器
example_selector = SemanticSimilarityExampleSelector(
vectorstore=vectorstore,
# 选择的示例数量
k=1
)
# 动态选择示例
selected_examples = example_selector.select_examples({"input": input})
# 格式化提示词
prompt_text = self.prompt.format(
input=input,
examples="\n".join([f"Q: {ex['input']} A: {ex['output']}" for ex in selected_examples])
)
response = self.llm.invoke(prompt_text)
print(response.content)
return
__doc__ = "最大边际相关性选择示例。该方法结合了与输入最相似的示例以及优化多样性。它通过找到嵌入与输入具有最大余弦相似度的示例,然后在惩罚已选择示例的近似度的同时迭代地添加它们。"
def maxmarginal_relevance_example(self, input):
load_dotenv()
tavilyKey = os.getenv("TAVILY_API_KEY")
print("tavilyKey is:", tavilyKey)
# 初始化嵌入模型embeddings:该模型可以将文本(句子或文档)转换成高纬度向量表示;
embeddings = OllamaEmbeddings(model="llama3.1", base_url="http://localhost:11434")
# 创建 FAISS 向量存储
vectorstore = FAISS.from_texts(
texts=[ex["input"] for ex in self.examples],
embedding=embeddings,
metadatas=self.examples
)
example_selector = MaxMarginalRelevanceExampleSelector(
vectorstore=vectorstore,
k=2, # 选择 2 个示例
fetch_k=3 # 初始获取 3 个最相似的示例,再从中选择 2 个多样化的示例
)
# 定义提示词模板 FewShotPromptTemplate 少样本示例FewShotPromptTemplate 是 LangChain 中的一种提示词模板,
# 专门用于少样本学习场景。它通过在提示词中嵌入少量输入-输出示例(few-shot examples),指导模型理解任务的模式和期望输出格式。
fewShotPromptTemplate = FewShotPromptTemplate(
example_selector=example_selector, #示例选择器
example_prompt=PromptTemplate( #提示词模板
input_variables=["input", "output"],
template="Q: {input}\nA: {output}\n"
),
prefix="你是一个天气助手,根据用户输入提供准确的天气信息2。\n\n相关示例:\n", #提示词开头的固定文本,通常描述任务或模型角色
suffix="\n用户输入: {input}\n回答:", #提示词结尾的固定文本,通常包含用户输入和输出占位符。
input_variables=["input"]
)
# 格式化提示词
prompt_text = fewShotPromptTemplate.format(input=input)
# 调用模型生成回答
response = self.llm.invoke(prompt_text)
print(response.content)
return