网页建设与网站设计心德体会/百度链接收录提交入口

网页建设与网站设计心德体会,百度链接收录提交入口,安康市城乡建设规划局网站,目前有做电子合同的网站吗目录 一、前言 二、前置准备 2.1 安装 Langchain必须的依赖 2.1.1 python环境 2.1.2 langchain openai 环境 2.1.3 准备一个apikey 2.1.4 langchain 核心组件 三、Langchain 各组件使用 3.1 Chat models组件 3.1.1 Invocation 使用 3.1.1.1 结果解析 3.2 提示词模板…

目录

一、前言

二、前置准备

2.1 安装 Langchain必须的依赖

2.1.1 python环境

2.1.2 langchain openai 环境

2.1.3 准备一个apikey

2.1.4 langchain 核心组件

三、Langchain 各组件使用

3.1 Chat models组件

3.1.1 Invocation 使用

3.1.1.1 结果解析

3.2 提示词模板

3.2.1 什么是提示词模板

3.2.2 创建提示词模板

3.2.2.1 PromptTemplate 简单提示词模板

3.2.2.2 ChatPromptTemplate 聊天提示词模板

3.2.2.3 MessagePlaceholer 聊天提示词模板

3.2.2.4 少样本提示词模板

3.2.2.5 示例选择器

3.3 memory组件

3.3.1 ChatMessageHistory 案例代码

3.3.2 流式输出案例代码

3.4 向量数据库与文档检索

3.4.1 安装向量数据库

3.4.2 代码操作示例

3.4.3 组合大模型组件使用

四、写在文末


一、前言

OpenAI作为人工智能领域的先锋,其提供的API为开发者打开了构建智能应用的大门。而作为LLM领域的佼佼者Langchain,随着RAG在众多的领域进行落地实践,Langchanin的热度也越来越高,然而,想要在实际项目中有效利用Langchanin提供的各种能力,了解如何使用Langchain进行集成是非常重要的。本文将详细介绍如何使用OpenAI集成Langchain,并使用Langchain的各种核心组件能力。

二、前置准备

在正式开始使用Langchain之前,你需要在本地准备基础的开发和运行环境,比如python环境、Langchain组件等,参考下面的操作步骤即可。

2.1 安装 Langchain必须的依赖

2.1.1 python环境

建议版本 3.10

2.1.2 langchain openai 环境

使用下面的命令进行安装

pip install langchain openai

2.1.3 准备一个apikey

后面程序中调用API时候需要用到

2.1.4 langchain 核心组件

langchain 官网地址如下:ChatOpenAI | 🦜️🔗 LangChain

可以基于此文档查看langchain提供的各个组件以及API

三、Langchain 各组件使用

接下来将通过实际案例展示Langchain 各组件的详细使用

3.1 Chat models组件

文档地址:Chat models | 🦜️🔗 LangChain,官方展示了可以对接LangChain的多种大模型,这里选择ChatOpenAi;

执行下面命令安装依赖组件

pip install -qU langchain-openai

3.1.1 Invocation 使用

参考官方提供案例

然后编写自己的代码,如下:


#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate#langchain的openai的sdk
from langchain_openai import ChatOpenAIllm = ChatOpenAI(# 此处需要填入openai的key,可以直接填入,但建议最好可以配置到本地环境变量中api_key ='sk-...'
)messages = [("system","You are a helpful assistant that translates English to Chinese. Translate the user sentence.",),("human", "I love programming."),
]
ai_msg = llm.invoke(messages)
print(ai_msg)

运行上面的代码,可以看到目标的英文被翻译成了中文

或者使用下面的这种写法也是可以的

#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage#langchain的openai的sdk
from langchain_openai import ChatOpenAI#llm=ChatOpenAI()model = ChatOpenAI(# 此处需要填入openai的key,可以直接填入,但建议最好可以配置到本地环境变量中api_key ='sk-...'
)msg=[SystemMessage(content="请将下面的内容翻译成英语."), HumanMessage(content="你好,请问你要去哪里")
]res = model.invoke(msg)
print(res)

3.1.1.1 结果解析

如果上面的输出结果看起来不够直观,langchain的包里面还提供了内容解析的工具,只需要导入StrOutputParser包即可

#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate#langchain的openai的sdk
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser#llm=ChatOpenAI()llm = ChatOpenAI(# 此处需要填入openai的key,可以直接填入,但建议最好可以配置到本地环境变量中api_key ='sk-...'
)prompt=ChatPromptTemplate.from_messages([("system","您是世界级的技术专家."),("user","{input}"),
])#通过langcian的链式调用,生成一个提示词的chain
chain=prompt | llmresult=chain.invoke({"input":"帮我写一篇AI的技术文章,100字以内"})print(result)parser = StrOutputParser()
parser_str = parser.invoke(result)
print(parser_str)

再次运行上面的程序,此时得到的就是纯粹的内容了

3.2 提示词模板

3.2.1 什么是提示词模板

语言模型以文本作为输入,这个文本通常被称为提示词,在开发过程中,对于提示词来说不能直接硬编码,这样不利于提示词管理,而是通过提示词模板进行维护,类似于开发过程中遇到的短信模板,邮件模板等。

提示词模板是一种特殊的文本,它 可以为特定任务提供额外的上下文信息。 在LLM 应 用中,用户输入通常不直接被传递给模型本身, 而是被添加到一个更大的文本,即提示词模板中。提示词模板为当前的具体任务提供了额外的上下文信息,这能够更好地引导模型生成预期的输出。

一个提示词模板通常包含如下内容:

  • 发给大语言模型(LLM)指令;

  • 一组问答示例,以告诉AI以什么格式返回请求;

  • 发给大语言模型的问题;

3.2.2 创建提示词模板

在LangChain中,最简单的,可以使用PromptTemplate类创建简单的提示词模板。在提示词模板可以内嵌任意数量的模板参数,然后通过参数值格式化模板内容。

也可以使用MessagePromptTemplate来创建提示词模板。可以用一个或多MessagePromptTemplate创建一个ChatPromptTemplate

如下示例

from langchain.prompts.chat import(ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate,
)template =
("You are a helpful assistant that translates [input_languagel to""(output_language}."
)system_message_prompt=SystemMessagePromptTemplate.from_template(template)human_template ="(text}"human_message_promptHumanMessagePromptTemplate.from_template(human_template)chat_prompt =ChatPromptTemplate.from_messages([system_message_prompt,human_message_promptchat_prompt.format_messages(input_language="English",output_language="French",text="I love programming."

上述代码首先定义了两个模板:

  • 一个是系统消息模板,描述了任务的上下文(翻译助手的角色和翻译任务);

  • 另一个是人类消息模板,其中的内容是用户的输入。然后,使用ChatPromptTemplate的from_messages方法将这两个模板结合起来,生成一个聊天提示词模板。

  • 当想要检查发送给模型的提示词是否确实与预期的提示词相符时,可以调用ChatPromptTemplate的format_messages方法,查看该提示词模板的最终呈现

msg=[SystemMessage(content="请将下面的内容翻译成英语."), HumanMessage(content="你好,请问你要去哪里")
]

通过这种方式,不仅可以让聊天模型包装器生成预期的输出,对开发者来说,也不用担心是否符合提示词消息列表的数据格式,只需要提供具体的任务描述即可。

3.2.2.1 PromptTemplate 简单提示词模板

这是最简单的一种提示词模板,调用PromptTemplate的from_template方法,在模板内容中预留占位符作为后续的输入参数即可

#langchain聊天的提示词模板
from langchain_core.prompts import PromptTemplateprompt_template = PromptTemplate.from_template("给我讲一个关于{topic}的历史故事")result = prompt_template.format(topic="足球")print(result)

运行一下,可以看到下面的效果,可以看到调用format方法的时候,最终“足球”就作为入参带入到模板中输出了

3.2.2.2 ChatPromptTemplate 聊天提示词模板

如下是一段基本的提示词模板代码案例,设置了两个模板参数,调用的时候动态传入

#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate#数组的每一个元素代表一个消息,每个消息元组,第一个参数代表消息角色,第二个参数代表消息内容
#消息角色:system代表系统消息,human代表人类消息,ai代表LLM返回的消息内容
#消息定义了2个模板参数name和user_input
chat_template = ChatPromptTemplate.from_messages([("system","你是一个人工智能助手,你的名字是{name}"),("human","你好"),("ai","我很好"),("human","{user_input}")]
)#通过模板参数格式化模板内容
result = chat_template.format_messages(name="小明",user_input="你叫什么名")
print(result)

运行一下看到如下的效果输出

补充:

  • ChatPromptTemplate 用于聊天对话的场景中;

  • 后续接入大模型之后,就可以将参数拼接模板一起传给大模型,大模型就可以返回预期的结果了

ChatPromptTemplate 即聊天模型(Chat Model)提示词模板,聊天模型以聊天消息列表作为输入,这个聊天消息列表的消息内容也可以通过提示词模板进行管理,这些聊天消息与原始的字符串不同,因为每个消息都与“角色(Role)”相关联。

例如在OpenAI的Chat Completion API中,OpenAI的聊天模型,给不同聊天消息定义了三种角色类型,分别是:助手(Assistant),人类(Human),或系统(System)角色:

  • 助手(Assistant)消息指的是当前消息是AI回答的内容;

  • 人类(Human)消息值得是你发给AI的内容;

  • 系统(System)消息通常是用来给AI身份进行描述;

示例代码

参考下面的案例代码,结合代码中的注释进行理解,在提示词模板中,我们传入了两个变量,后续在调用的时候,只需要给这两个变量赋值即可

#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser#langchain的openai的sdk
from langchain_openai import ChatOpenAImodel = ChatOpenAI(# 此处需要填入openai的key,可以直接填入,但建议最好可以配置到本地环境变量中api_key ='sk-...'
)#定义模板
prompt_template=ChatPromptTemplate.from_messages([("system","您是世界级的翻译专家,使用{language}语言翻译如下内容"),("user","{input}"),
])#内容输出解析器
output_parser=StrOutputParser()#得到一个链
chain = prompt_template | model | output_parser#输出结果
result = chain.invoke({'language':'中文','input':'hello world'})
print(result)

或者使用下面的这种写法

  • SystemMessage,对应着上面一种写法中的 'system',由langchain自身API提供

  • HumanMessage,对应着上面一种写法中的 'user',由langchain自身API提供

#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage#langchain的openai的sdk
from langchain_openai import ChatOpenAI#llm=ChatOpenAI()model = ChatOpenAI(# 此处需要填入openai的key,可以直接填入,但建议最好可以配置到本地环境变量中api_key ='sk-...'
)msg=[SystemMessage(content="请将下面的内容翻译成英语."), HumanMessage(content="你好,请问你要去哪里")
]res = model.invoke(msg)
print(res)
3.2.2.3 MessagePlaceholer 聊天提示词模板

这个提示词模板负责在特定的位置添加消息列表,在上面的ChatPromptTemplate中,我们看到了如何格式化两条消息,每条消息都是一个字符串。但是如果我们希望用户传入一个消息列表,并将其插入到特定的位置该怎么办呢?这就需要使用到MessagePlaceholer 的方式。如下示例代码:

#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholderfrom langchain_core.messages import SystemMessage, HumanMessageprompt_template = ChatPromptTemplate.from_messages([('system', 'You are a helpful assistant '),#这里可以传入一组消息MessagesPlaceholder('msgs')
])result = prompt_template.invoke({"msgs":[HumanMessage(content="你好")]})
print(result)

通过上面的运行结果不难看出,结果生成了2条消息,第一条是系统消息,第二条是我们传入的HumanMessage,如果我们传入了5条消息,那么一共会生成6条消息(系统消息加上传入的5条),这对于将一系列消息插入到特定的位置非常有用。

还有一种实现相同效果的的替代方法是,不直接使用MessagesPlaceholder,而是下面这种:

#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholderfrom langchain_core.messages import SystemMessage, HumanMessageprompt_template = ChatPromptTemplate.from_messages([('system', 'You are a helpful assistant '),#这里可以传入一组消息# MessagesPlaceholder('msgs')('placeholder','{msgs}')
])result = prompt_template.invoke({"msgs":[HumanMessage(content="你好")]})
print(result)

效果是一样的

3.2.2.4 少样本提示词模板

即Few-shot prompt template , 这种提示词模板中包含了少量的样本信息,这样做的目的是为了帮助模型更好的理解用户的意图,从而更好的回答问题或执行任务,少样本提示词模板是指使用一组少量的示例来指导模型处理新的输入。使用这些提示词可以用来训练模型,以便模型可以更好的理解或回答类似的问题。

Q:钢铁侠是谁?
A:钢铁侠是漫威中的一个英雄人物。Q:什么是AI大模型?
A:...

告诉模型,Q是问题,A是答案,按照这种格式进行交互问答。后续大模型在回答问题的时候,就会参考你提供给它的示例,一定程度上可以避免大模型回答时产生的幻觉问题。

#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate,PromptTemplate
from langchain_core.prompts.few_shot import FewShotPromptTemplatefrom langchain_core.messages import SystemMessage, HumanMessageexamples = [{"question":"什么是人工智能?","answer":"人工智能(Artificial Intelligence)是指通过计算机模拟、扩展或扩展人的智能来构建智能系统的技术。"},{"question":"钢铁侠在漫威电影中一共出现了几次变身","answer":"钢铁侠在漫威电影中一共出现了3次变身,分别是钢铁侠、浩克和美队。"},{"question":"詹姆斯一共打了多少赛季的篮球了?","answer":"詹姆斯一共打了5个赛季的篮球,包括2003-2004赛季,2004-2005赛季,2005-2006赛季,2006-2007赛季,2007-2008赛季。"}
]example_prompt = PromptTemplate(input_variables=["question","answer"],template="问题:{question}\n答案:{answer}"
)#接收examples示例数组参数,通过example_prompt提示词模板批量渲染示例内容
#suffix和input_variables参数用于在提示词模板最后追加内容,input_variables用于定义suffix中包含的模板参数
prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,suffix="问题:{input}",input_variables=["input"]
)print(prompt.format(input="詹姆斯在哪些赛季中出现过?"))

如下是一个使用openai调用的少样本案例代码

from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_openai import ChatOpenAI
import os# 设置OpenAI API密钥# 创建示例格式化器
example_prompt = PromptTemplate.from_template("Question: {question}\n{answer}")# 准备示例集
examples = [{"question": "1+1等于几?", "answer": "答案是2"},{"question": "地球是什么形状?", "answer": "地球近似于一个球体"},
]# 创建Few-Shot提示模板
prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,suffix="Question: {input}",input_variables=["input"],
)# 创建OpenAI模型实例
llm = ChatOpenAI(# 此处需要填入openai的key,可以直接填入,但建议最好可以配置到本地环境变量中api_key ='sk-...'
)# 生成提示并获取回答
user_question = "太阳系中最大的行星是哪个?"
full_prompt = prompt.invoke({"input": user_question}).to_string()
response = llm.invoke(full_prompt)print(f"问题: {user_question}")
print(f"回答: {response}")

运行一下可以看到下面的结果

3.2.2.5 示例选择器

LangChain提供示例选择器来提高效率,避免一次性发送所有示例给模型,同时减少使用的Token数量。如果有大量示例,可能需要选择要包含在提示中的示例,示例选择器是负责执行此操作的类。

LangChain有几种不同类型的示例选择器

名称

描述

SemanticSimilarityExampleSelector

使用输入和示例之间的语义相似性来决定选择哪些示例。

MaxMarginalRelevanceExampleSelector

使用输入和示例之间的最大边际相关性来决定选择哪些示例。

LengthBasedExampleSelector

根据一定长度内可以容纳的数量来选择示例

NGramOverlapExampleSelector

使用输入和示例之间的 ngram 重叠来决定选择哪些示例。

在下面的案例中,我们使用SemanticSimilarityExampleSelector类,该类根据输入的相似性选择小样本示例,它使用嵌入模型计算输入和小样本之间的相似性,然后使用向量数据库执行相似性搜索,获取输入相似的示例。

  • 这里涉及向量计算、向量数据库,在AI领域这两个主要用于数据库相似度搜索,例如,查询相似文章内容,相似图片、视频等

先安装下面的向量数据库

pip install chromadb

完整的代码如下

from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import Chromafrom langchain_openai import OpenAIEmbeddingsexamples = [{"question":"什么是人工智能?","answer":"人工智能(Artificial Intelligence)是指通过计算机模拟、扩展或扩展人的智能来构建智能系统的技术。"},{"question":"钢铁侠在漫威电影中一共出现了几次变身","answer":"钢铁侠在漫威电影中一共出现了3次变身,分别是钢铁侠、浩克和美队。"},{"question":"詹姆斯一共打了多少赛季的篮球了?","answer":"詹姆斯一共打了5个赛季的篮球,包括2003-2004赛季,2004-2005赛季,2005-2006赛季,2006-2007赛季,2007-2008赛季。"}
]# 初始化示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(#提供可选择的示例列表examples,#用于生成嵌入的嵌入类,该嵌入用于衡量语义的相似性OpenAIEmbeddings(api_key='sk-...'),#用于存储嵌入和执行相似度搜索的VectorStore类Chroma,#用于生成的示例数k=1
)question = "詹姆斯在哪些赛季打过篮球?"result_examples = example_selector.select_examples({"question":question})for example in result_examples:print("\\n")for key, value in example.items():print(f"{key}: {value}")

运行一下上述代码,在输出的结果中可以看到参考了我们给定的示例样本,选择了最接近的问题的答案

3.3 memory组件

在多轮对话中,为了使大模型能够记住上下文对话,可以考虑使用这个memory组件,提前安装依赖包

pip install langchain_community

该模块中提供了ChatHistory,它允许聊天机器人记住过去的互动,并在后续的回答问题时考虑它们;

3.3.1 ChatMessageHistory 案例代码

参考如下代码


from langchain_community.chat_message_histories import ChatMessageHistory#langchain聊天的提示词模板
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholder
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.runnables import RunnableWithMessageHistory#langchain的openai的sdk
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser#创建模型
model = ChatOpenAI(# 此处需要填入openai的key,可以直接填入,但建议最好可以配置到本地环境变量中api_key ='sk-...'
)msg=[SystemMessage(content="请将下面的内容翻译成英语."), HumanMessage(content="你好,请问你要去哪里")
]parser=StrOutputParser()#定义提示词模板
prompt_template = ChatPromptTemplate = ChatPromptTemplate.from_messages([('system','你是一个乐于助人的助手,请用{language}尽你所能回答所有问题'),MessagesPlaceholder(variable_name="my_msg")])chain = prompt_template | model#保存聊天的历史记录
store={}#定义一个获取session_id的函数,返回一共消息的历史对象
def get_history(session_id: str):if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]do_msg = RunnableWithMessageHistory(chain,get_history,input_messages_key='my_msg' #每次聊天发送消息的key
)#给当前会话添加一个session
config={'configurable':{'session_id':'xm113'}}#第一轮对话
result_1 = do_msg.invoke({"my_msg": [HumanMessage(content="你好,我是小明")],"language": "中文"},config=config
)print(result_1.content)#第二轮对话
result_2 = do_msg.invoke({"my_msg": [HumanMessage(content="请问我的名字是什么")],"language": "中文"},config=config
)
print(result_2.content)

运行上面的代码,通过控制台的输出结果不难看出,大模型在回答我们的第二个问题的时候,由于使用了ChatMessageHistory,在第一次的对话中,记住了第一轮对话的内容,所以第二轮对话中可以正确的输出答案

3.3.2 流式输出案例代码

流式输出是一种允许数据在生成的同时逐步传输的技术,而无需等待整个过程完成

流式输出技术使得数据可以实时地、逐步地传输,而不是等待所有数据生成完毕后再一次性传输。这种技术特别适用于处理大型语言模型(LLM)和聊天模型的输出,因为这些模型的运行时间通常较长,且输出数据量可能很大。通过流式输出,用户可以在数据生成的过程中就接收到部分结果,从而提高效率和用户体验。

基于上一个案例中的2轮对话,我们再加一轮对话,此时采用流式输出的方式,只需要调整下调用的api即可,如下:

#第三轮对话,此时返回的数据是流式的
for resp in do_msg.stream({"my_msg": [HumanMessage(content="给我讲一个笑话")],"language": "中文"},config=config
): print(resp.content)

运行上面的代码,观察输出效果,可以看到结果是一个一个字输出的

3.4 向量数据库与文档检索

向量数据库是实现文档检索的基础必要实现组件,类似与我们在学习es的时候,为了能从es中搜索出相似度最高的文档,es需要先将原始存入的数据进行分词之后再存储。

langchain构建的向量数据库与文档检索也是如此,不过文档存储是放在向量数据库中,即文档存储之前需要先进行向量化,而后才能进行搜索。

支持从向量数据库或其他数据源检索数据,以便与LLM(大语言模型)的工作流集成,这对于应用程序来说非常重要,这些应用程序需要获取数据以作为模型推理的一部分进行推理,就像检索增强生成(RAG)的情况类似。

3.4.1 安装向量数据库

向量数据库的可选组件有很多种,这里选用chroma,执行下面的命令安装

pip install langchain-chroma

3.4.2 代码操作示例

完整的操作步骤:

  • 初始化文档;

  • 文档存入向量数据库,进行文档向量化;

  • 使用检索器进行文档检索;

参考下面的完整代码


from langchain_community.chat_message_histories import ChatMessageHistoryfrom langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAIfrom langchain_core.documents import Document
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddingsimport osos.environ["OPENAI_API_KEY"] = 'sk-...'#提供测试数据,作为向量数据库数据的来源
documents = [Document(page_content="狗是人类的好朋友,以忠诚和友好而文明",metadata={"source": "哺乳动物手册"},),Document(page_content="猫是比较独立的宠物,喜欢有自己独立的空间,但是可以为人类提供一定的陪伴和情绪价值",metadata={"source": "哺乳动物手册"},),Document(page_content="兔子是一种乖巧而偏静的动物,既可以作为宠物,也可以作为家养动物",metadata={"source": "静态宠物手册"},),Document(page_content="老虎是一个非常凶猛的动物,但是在非洲可以作为宠物,一般是捕食性动物",metadata={"source": "大型动物手册"},),Document(page_content="长颈鹿是一种非常呆萌可爱的动物,一般在动物园才能看到",metadata={"source": "大型动物手册"}),
]#实例化向量空间
vector_store = Chroma.from_documents(documents, embedding = OpenAIEmbeddings())#相似度查询,返回相似度分数,分数越低,相似度越高
result = vector_store.similarity_search_with_score("东北虎")
print(result)

运行上述的代码,通过控制台的结果输出不难发现,由于本次检索的关键字里面包含“虎“,在原始的文档中,与虎相关的文档有一个,所以最终检索的结果中,将包含老虎的那一条放在最前面,而且分数最低,这也就符合我们的预期

当然,也可以使用检索器来做,即RunnableLambda这个对象,如下:

#实例化向量空间
vector_store = Chroma.from_documents(documents, embedding = OpenAIEmbeddings())#相似度查询,返回相似度分数,分数越低,相似度越高
# result = vector_store.similarity_search_with_score("东北虎")
# print(result)#检索器,k=1,选取相似度最高的第一个返回
retriever = RunnableLambda(vector_store.similarity_search_with_score).bind(k=1)target_doc = retriever.batch(['华南虎','橘猫'])
print(target_doc)

再次运行上面的代码,此时返回了符合条件的两个文档

3.4.3 组合大模型组件使用

事实上,在实际使用中可能会结合大模型一起使用,比如在下面的代码中,结合大模型与向量数据库一起使用,同时问题通过参数的方式传入,这样更为灵活一点


from langchain_community.chat_message_histories import ChatMessageHistoryfrom langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAIfrom langchain_core.documents import Document
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddingsfrom langchain_core.runnables import RunnableLambda,RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholderimport osos.environ["OPENAI_API_KEY"] = 'sk...'#创建模型
model = ChatOpenAI(# 此处需要填入openai的key,可以直接填入,但建议最好可以配置到本地环境变量中api_key ='sk...'
)msg=[SystemMessage(content="请将下面的内容翻译成英语."), HumanMessage(content="你好,请问你要去哪里")
]#提供测试数据,作为向量数据库数据的来源
documents = [Document(page_content="狗是人类的好朋友,以忠诚和友好而文明",metadata={"source": "哺乳动物手册"},),Document(page_content="猫是比较独立的宠物,喜欢有自己独立的空间,但是可以为人类提供一定的陪伴和情绪价值",metadata={"source": "哺乳动物手册"},),Document(page_content="兔子是一种乖巧而偏静的动物,既可以作为宠物,也可以作为家养动物",metadata={"source": "静态宠物手册"},),Document(page_content="老虎是一个非常凶猛的动物,但是在非洲可以作为宠物,一般是捕食性动物",metadata={"source": "大型动物手册"},),Document(page_content="长颈鹿是一种非常呆萌可爱的动物,一般在动物园才能看到",metadata={"source": "大型动物手册"}),
]#实例化向量空间
vector_store = Chroma.from_documents(documents, embedding = OpenAIEmbeddings())#相似度查询,返回相似度分数,分数越低,相似度越高
# result = vector_store.similarity_search_with_score("东北虎")
# print(result)#检索器,k=1,选取相似度最高的第一个返回
retriever = RunnableLambda(vector_store.similarity_search_with_score).bind(k=1)#增加提示词模板
message="""使用提供的上下文回答这个问题:{question}上下文:{context}
"""prompt_template = ChatPromptTemplate.from_messages([('human',message)
])#动态传递问题,允许用户的问题之后传递给prompt和model
chain = {'question':RunnablePassthrough(),'context':retriever} | prompt_template | modelresp = chain.invoke("请谈谈老虎")print(resp)

从输出结果不难看出,最终的回答参考了本地向量数据库的答案

四、写在文末

本文通过案例详细介绍了OpenAI 集成 Langchain 的使用,并针对Langchain的核心组件以代码的方式进行了操作演示,希望对看到的同学有用哦,本篇到此结束,感谢观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C#学习笔记04】深入掌握C语言格式化输出

引言 ​​printf()​​函数不仅可以将数据输出到控制台,还可以通过格式化字符串灵活地控制输出的格式。​​printf()​​​函数的使用规则,包括标志说明、字段宽度、转换精度、长度修饰、转换说明、转义字符和返回结果等内容。 1. ​​printf()​​函数…

python-leetcode-定长子串中元音的最大数目

1456. 定长子串中元音的最大数目 - 力扣(LeetCode) 可以使用 滑动窗口 方法来解决这个问题。步骤如下: 初始化:计算前 k 个字符中元音字母的个数,作为初始窗口的值。滑动窗口:遍历字符串,每次右…

蓝桥真题讲解

第一题 题目链接 0贪吃蛇长度 - 蓝桥云课 题目解析 题意:数#个数和个数再加上首尾 代码原理 略 代码编写 略 填空题技巧 眼看手数 当然并不是真的一个一个数,我们需要借助一些工具,不过各位小伙伴们放心,我们借助的工具…

【C++ 函数模板】—— 模板参数推导、实例化策略与编译优化

欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创&#x1…

Redis 数据持久化之RDB

Redis数据持久化策略 持久化策略之RDB RDB:在指定的时间间隔,执行数据集的时间点快照。 实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是读快照。这样一来即使故障宕机,快照文件也不会丢失&…

数据分析与AI丨AI Fabric:数据和人工智能架构的未来

AI Fabric 架构是模块化、可扩展且面向未来的,是现代商业环境中企业实现卓越的关键。 在当今商业环境中,数据分析和人工智能领域发展可谓日新月异。几乎每天都有新兴技术诞生,新的应用场景不断涌现,前沿探索持续拓展。可遗憾的是&…

MyBatis - XML 操作动态 SQL

目录 1. 前言 2. 动态插入 2.1 if 标签 2.2 trim 标签 2.2.1 注解完成动态 SQL 3. 动态查询 3.1 添加 1 1 3.2 where 标签 4. 动态更新 4.1 set 标签 5. foreach 标签 6. sql 标签 & include 标签 1. 前言 之前博文所讲的 MyBatis SQL 操作, 都必须按照注解或…

【从零开始学习计算机科学】编译原理(七)运行时刻环境

【从零开始学习计算机科学】编译原理(七)运行时刻环境 运行时刻环境存储组织空间的栈式分配活动树活动记录和控制栈简单栈式存贮分配C语言的过程调用和过程返回时的存贮管理堆式存储分配堆式存储分配的功能垃圾回收基于跟踪的垃圾回收短停顿垃圾回收运行时刻环境 存储组织 …

2025-03-08 学习记录--C/C++-PTA 习题10-1 判断满足条件的三位数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h> #include <math.h>int search( int n );int…

【ArcGIS】地理坐标系

文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面&#xff08;Datum&#xff09;的奥秘 1.3 投影坐标系&#xff1a;平面世界的诞生1.3.1 投…

化工厂防爆气象站:为石油化工、天然气等领域提供安全保障

【TH-FB02】在石油化工、天然气等高危行业中&#xff0c;安全生产是至关重要的。这些行业常常面临着易燃易爆、有毒有害等潜在风险&#xff0c;因此&#xff0c;对气象条件的监测和预警显得尤为重要。化工厂防爆气象站作为一种专门设计用于这些特殊环境的气象监测设备&#xff…

《MySQL数据库从零搭建到高效管理|库的基本操作》

目录 一、数据库的操作 1.1 展示数据库 1.2 创建数据库 1.3 使用数据库 1.4 查看当前数据库 1.5 删除数据库 1.6 小结 二、常用数据类型 2.1 数值类型 2.2 字符串类型 2.3 日期类型 一、数据库的操作 打开MySQL命令行客户端&#xff0c;安装完MySQL后会有两个客户端…

计算机考研C语言

C语言程序设计从入门到精通【2025完整版】考研复试 嵌入式 计算机二级 软考 专升本也适用_哔哩哔哩_bilibili 1、第一个C程序 helloC #include <stdio.h>int main(){printf("hehe");return 0;}每个C语言程序不管有多少行代码&#xff0c;都是从main函数开始执…

力扣hot100二刷——链表

第二次刷题不在idea写代码&#xff0c;而是直接在leetcode网站上写&#xff0c;“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路&#xff0c;编程也很流利⭐⭐Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答⭐⭐⭐Sl…

Word 小黑第2套

对应大猫42 Word1 从文件中导入新样式 样式组 -管理样式 -导入导出 -关闭Normal文件 -打开文件 -修改文件 -选中所需 -复制 调整字符宽度 调整字符间距 -字体组 加宽 适当修改磅值 文字效果通过文字组修改 另起一页&#xff0c;分隔符&#xff08;布局 -分隔符 -分节符 -下一…

【RabbitMQ】Spring Boot 结合 RabbitMQ 完成应用间的通信

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 Spring 框架与 RabbitMQ 的整合主要通过 Spring AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;模块实现&#xff0c;提供了便捷的消息队列开发能力。 引…

UVC摄像头命令推流,推到rv1126里面去

ffmpeg命令查询UVC设备 .\ffmpeg.exe -list_devices true -f dshow -i dummy 上图是查询UVC设备的效果图&#xff0c;画红框的部分是UVC设备的设备名称"USB2.0 PC CAMERA"和设备号 "device_pnp_\\?\usb#vid_1908&pid_2310&mi_00#8&39abfe5&0&a…

Linux中的基本指令(上)

目录 ls指令 判断linux中文件 pwd指令 认识路径 ​编辑 绝对路径/相对路径 cd指令 简要理解用户 理解家目录 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…

Qt 数据库操作(Sqlite)

数据库简介 关于数据库的基础知识这里就不做介绍了&#xff0c;相关博客可以查看&#xff1a; SQL基础知识 数据库学霸笔记 上面博客都写的比较详细&#xff0c;本文主要介绍如何使用Qt进行数据库相关操作&#xff0c;数据库分为关系型数据库和非关系型数据&#xff0c;关系…

网络安全 api 网络安全 ast技术

随着应用或者API被攻击利用已经越来越多&#xff0c;虽然来自开源组件的漏洞加剧了这一现象的发生&#xff0c;但是&#xff0c;其实主要还是在于应用程序或者API本身没有做好防范&#xff0c;根源在于源代码本身的质量没有严格把控。AST是指Application Security Testing&…