首先要安装modelscope
pip install modelscope
安装完成后测试
from langchain_community.embeddings import ModelScopeEmbeddingsembeddings = ModelScopeEmbeddings(model_id="iic/nlp_gte_sentence-embedding_chinese-base")text = "这是一个测试句子"
query_result = embeddings.embed_query(text)
print(f"嵌入向量长度: {len(query_result)}")
运行后,会自动下载,最后输出:
以下使用 智谱AI大模型 + modelscope + LangChain 实现搜索功能
from langchain_community.embeddings import ModelScopeEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
from langchain_community.vectorstores import Chroma
from langchain_core.documents import Document# 实例化自定义语言模型
from langchain_openai import ChatOpenAIllm = ChatOpenAI(temperature=1,model='glm-4-plus',openai_api_key='*****',openai_api_base="https://open.bigmodel.cn/api/paas/v4/"
)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': '哺乳动物宠物文档'},),
]embeddings = ModelScopeEmbeddings(model_id="iic/nlp_gte_sentence-embedding_chinese-base")# 实例化向量数据库
vector_store = Chroma.from_documents(documents, embedding=embeddings)# 相似度的查询:返回相似的分数,分数越低相似度越高
# print(vector_store.similarity_search_with_score('咖啡猫'))# 检索器:bind(k=1) 返回相似度最高的第一个
retriever = RunnableLambda(vector_store.similarity_search).bind(k=1)
# print(retriever.batch(['咖啡猫', '鲨鱼']))# 提示模板
message = """
使用提供的上下文仅回答这个问题。
{question}
上下文:{context}
"""prompt_temp = ChatPromptTemplate.from_messages([('human', message)
])# RunnablePassthrough 允许我们将用户的问题之后再传递给 prompt 和 model
chain = {'question': RunnablePassthrough(), 'context': retriever} | prompt_temp | llm
resp = chain.invoke('请介绍一个猫?')
print(resp.content)
以上代码:
1.先定义要使用的AI大模型
2.定义documents,这里可以自己使用本地的文档内容
3.然后使用modelscope的embeddings实例化向量数据库
4.创建检索器,取向量返回的相似度最高的第一个值
5.定义一个用户提示词模板,用于上下文中问题的回答
6.构建一个chain,调用链invoke
运行之后的结果: