learn from https://learn.deeplearning.ai/langchain
import os
import pandas as pd
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import CSVLoader
from langchain.vectorstores import DocArrayInMemorySearch
from IPython.display import display, Markdown
from langchain.indexes import VectorstoreIndexCreator
自己编的文档
names = ["Alice", "Bob", "Charlie", "David", "Eva", "Frank"]
descriptions = [
"是一位优秀的科学家,专注于研究人工智能。",
"是一位出色的艺术家,擅长绘画和雕塑。",
"是一位杰出的企业家,创办了多家成功的公司。",
"是一位卓越的音乐家,精通多种乐器。",
"是一位卓越的运动员,多次获得世界冠军。",
"是一位杰出的作家,创作了多部畅销书籍。"
]
file = "people.csv"
df = pd.DataFrame({"name": names, "description": descriptions})
df.to_csv(file, index=False)
loader = CSVLoader(file_path=file)
index = VectorstoreIndexCreator(vectorstore_cls=DocArrayInMemorySearch).from_loaders([loader])
query = '谁喜欢计算机,为什么呢'
response = index.query(query)
print(response)
输出:Alice喜欢计算机,因为她是一位优秀的科学家,专注于研究人工智能。
loader
后的文档docs = loader.load()
docs[0]
输出
Document(page_content='name: Alice\ndescription: 是一位优秀的科学家,专注于研究人工智能。',
metadata={'source': 'people.csv', 'row': 0})
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
embed = embeddings.embed_query("我喜欢研究算法")
print(len(embed)) # 1536
print(embed[:5])
# [-0.0059773544780910015, -0.0027380685787647963, 0.004629486706107855, -0.05253298953175545, -0.016336973756551743]
是 768*2 = 1536 维的编码
db = DocArrayInMemorySearch.from_documents(
docs,
embeddings
)
docs = db.similarity_search("我喜欢弹琴")
print(docs[0])
输出:
Document(page_content='name: David\ndescription: 是一位卓越的音乐家,精通多种乐器。',
metadata={'source': 'people.csv', 'row': 3})
retriever = db.as_retriever()
llm = ChatOpenAI(temperature = 0.0)
qdocs = "".join([docs[i].page_content for i in range(len(docs))])
qdocs:'name: David\ndescription: 是一位卓越的音乐家,精通多种乐器。name: Bob\ndescription: 是一位出色的艺术家,擅长绘画和雕塑。name: Alice\ndescription: 是一位优秀的科学家,专注于研究人工智能。name: Eva\ndescription: 是一位卓越的运动员,多次获得世界冠军。'
response = llm.call_as_llm(f"{qdocs} 问题:请列出跟科学艺术相关的人")
输出:Bob和Alice是与科学艺术相关的人。Bob是一位出色的艺术家,擅长绘画和雕塑,而Alice是一位优秀的科学家,专注于研究人工智能。
qa_stuff = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
verbose=True
)
query = "喜欢弹琴的是谁,为什么?"
response = qa_stuff.run(query)
输出:'喜欢弹琴的是David,因为他是一位卓越的音乐家,精通多种乐器。'
index = VectorstoreIndexCreator(
vectorstore_cls=DocArrayInMemorySearch,
embedding=embeddings,
).from_loaders([loader])
query = "喜欢写博客的是谁,为什么?"
response = index.query(query, llm=llm)
输出:'喜欢写博客的人是Frank,因为他是一位杰出的作家,创作了多部畅销书籍。写博客可以让他与读者分享自己的想法和经验,同时也可以扩大他的影响力和读者群体。'