文章目录
- AI(学习笔记第十五课)从langchain的v0.3到v1.0
- 1. `langchain v1.0`的`semantic search`
- 1.1 从`semantic search`开始
- 1.2 从`pdf loader`开始练习
- 1.2.1 `pdf file`的准备
- 1.2.2 `pdf loader`将`pdf`分成`documents`对象
- 1.3 使用`text splitter`对docs进行`split`
- 1.4 使用`embeddings`的`model`构建向量库`embeding vector`
- 2. 执行`vector stores and retrievers`
- 2.1 使用`InMemoryVector`来保存`vector`
- 2.2 使用`InMemoryVector`来进行`query`
- 2.2.1 执行代码
- 2.2.2 执行结果
AI(学习笔记第十五课)从langchain的v0.3到v1.0
langchain v1.0的semantic searchDocuments and document loadersText splittersEmbeddingsVector stores and retrievers
1. langchain v1.0的semantic search
langchain v1.0 learn
从这里开始继续学习。
1.1 从semantic search开始
1.2 从pdf loader开始练习
1.2.1 pdf file的准备
示例的代码工程中已经准备好了pdf文件,可以作为示例使用。langchain_from_v1.0/docs/examples_data/nke-10k-2023.pdf
1.2.2 pdf loader将pdf分成documents对象
from langchain_core.documents import Document
from langchain_community.document_loaders import PyPDFLoader
def main():
"""Main entry point for the application."""
print("Starting My Python Project...")
file_path = "./docs/examples_data/nke-10k-2023.pdf"
loader = PyPDFLoader(file_path)
docs = loader.load()
print(len(docs))
print(f"{docs[0].page_content[:200]}\n")
print(docs[0].metadata)
这里看到,整个一个pdf文件已经被load成复数的docs。
1.3 使用text splitter对docs进行split
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200, add_start_index=True
)
all_splits = text_splitter.split_documents(docs)
print(len(all_splits))
可见,langchain对文本的处理是基于split之后的chunk的。
- 每个
chunk的size可以设定,这里设定成1000。 - 另外这里的
chunk_overlap=200也是有意义的,这里表示每个chunk之间的互相overlap的size,因为如果不互相overlap,那么chunk交界的部分很容易就会弄错,因为边界的文本会有很大的关系。
1.4 使用embeddings的model构建向量库embeding vector
embeddings = OllamaEmbeddings(
model="nomic-embed-text",
base_url=OLLAMA_BASE_URL)
vector_1 = embeddings.embed_query(all_splits[0].page_content)
vector_2 = embeddings.embed_query(all_splits[1].page_content)
# Example command line arguments
assert len(vector_1) == len(vector_2)
print(f"Generated vectors of length {len(vector_1)}\n")
print(vector_1[:10])
执行结果如下
可见,每个chunk的size是1000,但是最终被embeding model向量化之后,每个chunk的vector的尺寸就是768,这个vector就代表了这个chunk。这些vector是可以做相似性(cosine similarity)比较。
2. 执行vector stores and retrievers
2.1 使用InMemoryVector来保存vector

这里可以看到,516个chunks都被生成了768的固定长度的vector。接下来学习如何进行InMemoryVector的使用。
# create an empty InMemoryVectorStu'using embeding model
vector_store = InMemoryVectorStore(embeddings)
# add documents into vector store
ids = vector_store.add_documents(documents=all_splits)
2.2 使用InMemoryVector来进行query
2.2.1 执行代码
results = vector_store.similarity_search(
"How many distribution centers does Nike have in the US?"
)
print(results[0])
2.2.2 执行结果

可见,使用vector store很容易将需要的文本查询到,但是这里还没有使用big model进行分析,还只是使用了embeding model。
到这里,从langchain v0.3过渡到了langchain v1.0,接下俩继续学习langchain v1.0。
