langchain-RAG
向量模型
from langchain_community.embeddings import DashScopeEmbeddings
embedding_model = DashScopeEmbeddings(
model="text-embedding-v1",
dashscope_api_key=os.environ.get("ALI_API_KEY")
)
rest = embedding_model.embed_query("你好")
print(rest) #向量结果
print(len(rest))#向量维度
向量数据库
from langchain_core.vectorstores import InMemoryVectorStore
# 基于内存的向量数据库
store = InMemoryVectorStore(embedding_model)
#添加向量
store.add_texts(["苹果很甜","香蕉好吃","西瓜又大又圆"])
检索器
#检索
rests = store.similarity_search_with_score("很甜的水果是什么",k=3)
for doc,score in rests:
print(f"{doc.page_content}-{score}")
#构建检索器 类型为similarity,检索文档数量为3
retriever = store.as_retriever(search_type="similarity",search_kwargs={"k":3})
rests2 = retriever.invoke("又大又圆的是什么")
for doc in rests2:
print(f"{doc.page_content}")
检索器也可用使用lcel
#提示词模板
prompt = ChatPromptTemplate.from_messages([
("human","{text}")
])
#格式转换函数
def format_prompt_value(prompt_value):
return prompt_value.to_string()
#构建检索器 类型为similarity,检索文档数量为3
retriever = store.as_retriever(search_type="similarity",search_kwargs={"k":3})
#构建lcel
chain = prompt | format_prompt_value | retriever
#执行
rests2 = chain.invoke({"text":"又大又圆的是什么"})
for doc in rests2:
print(f"{doc.page_content}")
DEMO
开发一个园区客服
基础环境
import os
from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import ChatOpenAI
from langchain_text_splitters import CharacterTextSplitter
# 大模型
llm = ChatOpenAI(
api_key=os.environ.get("ALI_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
model="qwen-max"
)
#向量模型
embedding_model = DashScopeEmbeddings(
model="text-embedding-v1",
dashscope_api_key=os.environ.get("ALI_API_KEY")
)
#向量数据库
store = InMemoryVectorStore(embedding_model)
#检索器
retriever = store.as_retriever(search_kwargs={"k":1})
#提示词模板
prompt=ChatPromptTemplate.from_messages([
("human","""
你是一个园区客服机器人,你要根据以下指定信息回答用户问题
已知信息:{info}
用户问题:{text}
""")
])
索引阶段
#加载并解析文档
loader = TextLoader("data.txt",encoding="utf-8")
document = loader.load()
#切分文档
text_splitter = CharacterTextSplitter(chunk_size=500,chunk_overlap=0,separator="\n",keep_separator=True)
segments = text_splitter.split_documents(document)
# 文本向量化
store.add_documents(segments)
检索阶段
query = "退票多少钱"
#向量检索
retriever_info = retriever.invoke(query)
#构建提示词
infos = []
for segment in retriever_info:
infos.append(segment.page_content)
# lcel
chain = prompt| llm |StrOutputParser()
response = chain.invoke({"info":infos,"text":query})
print(response)