下图为典型的向量存储应用,即典型的RAG路程:

上图为典型的向量存储应用,即典型的RAG路程。开发设计:
- 如何文本转向量
- 创建向量存储,基于向量存储完成:
- 存入向量
- 删除向量
- 向量检索
LangChain内置向量存储功能, 可以基于:
- InMemoryVectorStore, 完成内存向量存储
- Chroma, 外部数据库向量存储
向量存储类均提供3个通用API接口:
- add_document, 添加文档到向量存储
- delete,从向量存储删除文档
- similarity_search:相似度搜索
from langchain_chroma import Chroma
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.document_loaders import CSVLoader
#Chroma 向量数据库(轻量级)
#依赖langchain_chroma,chromadb
vector_store = Chroma(
collection_name="my_collection", #集合名称,类型:str,默认"langchain_store"
embedding_function=DashScopeEmbeddings(), #用于生成向量的嵌入函数,类型:BaseEmbeddings,默认None
persist_directory="./chroma_db", #持久化目录,存放文件夹,类型:str,
)
""" loader = CSVLoader(
file_path="./data/info.csv",
encoding="utf-8",
source_column="source",)
documents = loader.load()
print(documents[0])
vector_store.add_documents(
documents = documents, #被添加的文档,类型:List[Document]
ids = ["id"+str(i) for i in range(1, len(documents) + 1)], #文档对应的id,类型:List[str],默认None,表示由向量存储自动生成id
)
#删除指定id的文档
vector_store.delete(ids=["id1", "id2"]) """
#检索与查询文本最相似的前k个文档
result = vector_store.similarity_search(
query="Python是不是简单易学", #查询文本,类型:str
k=3, #返回的文档数量,类型:int,默认4
filter = {"source": "黑马程序员"}
)
print(result)
from langchain_community.chat_models import ChatTongyi
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
model = ChatTongyi(model="qwen3-max")
prompt = ChatPromptTemplate.from_messages(
[
("system", "以我提供的参考资料为主,简洁专业回答用户问题,参考资料:{context}。如果参考资料无法回答用户问题,请直接说不知道,不要编造答案。"),
("user", "用户提问:{input}")
]
)
vector_store = InMemoryVectorStore(
embedding = DashScopeEmbeddings(model="text-embedding-v4"))
# add_texts 传入一个list[str]
vector_store.add_texts(
texts = [
"Python是一种简单易学的编程语言,适合初学者入门。",
"Python具有丰富的库和框架,适用于数据分析、人工智能、Web开发等领域。",
"Python的语法简洁明了,代码可读性强,适合快速开发和原型设计。"
]
)
input_text = "Python是不是简单易学?"
#检索与查询文本最相似的前k个文档
result = vector_store.similarity_search(
query=input_text, #查询文本,类型:str
k=2, #返回的文档数量,类型:int,默认4
)
# print(result)
reference_test = "["
for doc in result:
reference_test += doc.page_content + "\n"
reference_test += "]"
#print (reference_test)
def print_prompt(full_prompt):
print("="*20, full_prompt.to_string(), "="*20)
return full_prompt
chain = prompt | print_prompt |model | StrOutputParser()
res = chain.invoke({"input": input_text, "context": reference_test})
print(res)
RunnablePassthrough
from langchain_community.chat_models import ChatTongyi
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
model = ChatTongyi(model="qwen3-max")
prompt = ChatPromptTemplate.from_messages(
[
("system", "以我提供的参考资料为主,简洁专业回答用户问题,参考资料:{context}。如果参考资料无法回答用户问题,请直接说不知道,不要编造答案。"),
("user", "用户提问:{input}")
]
)
vector_store = InMemoryVectorStore(
embedding = DashScopeEmbeddings(model="text-embedding-v4"))
# add_texts 传入一个list[str]
vector_store.add_texts(
texts = [
"Python是一种简单易学的编程语言,适合初学者入门。",
"Python具有丰富的库和框架,适用于数据分析、人工智能、Web开发等领域。",
"Python的语法简洁明了,代码可读性强,适合快速开发和原型设计。"
]
)
#input_text = "Python是不是简单易学?"
input_text = "牛牛渴了怎么办?"
#langchain中向量存储对象,有一个方法,as_retriever,可以返回一个Runable接口的子类实例
retriever = vector_store.as_retriever(
search_kwargs={"k": 2} #检索参数,类型:dict,默认None
)
def format_func(docs: list):
if not docs:
return "没有找到相关资料"
formatted_str = "["
for doc in docs:
formatted_str += doc.page_content + ", "
formatted_str += "]"
return formatted_str
def print_prompt(full_prompt):
print("="*20, full_prompt.to_string(), "="*20)
return full_prompt
#chain
chain = (
{"input": RunnablePassthrough(), "context": retriever | format_func} | prompt | print_prompt | model | StrOutputParser()
)
res = chain.invoke(input_text)
print(res)
"""
retriever:
输入:用户的提问 str
输出:向量库的检索结果 list[Document]
prompt:
输入:用户的提问和向量库的检索结果 dict
输出:模型的输入文本 prmptValue