赞
踩
学习完大语言模型落地的关键技术:RAG的相关概念,我们今天来用代码实现一下RAG。
项目实战:基于百度ERNIE SDK 和 LangChain 搭建个人知识库。
- !pip install --upgrade erniebot
- 测试embedding
- import erniebot
- erniebot.api_type = "aistudio"
- erniebot.access_token = "<你的token>"
- response = erniebot.Embedding.create(
- model="ernie-text-embedding",
- input=[
- "我是百度公司开发的人工智能语言模型,我的中文名是文心一言,英文名是ERNIE-Bot,可以协助您完成范围广泛的任务并提供有关各种主题的信息,比如回答问题,提供定义和解释及建议。如果您有任何问题,请随时向我提问。" ])
- print(response.get_result())
!pip install chromadb
定义一个自定义的嵌入函数,用于将文本内容转换为嵌入向量。其中使用 ERNIE Bot 库来创建文本的嵌入,并且通过 Chromadb 库来管理这些嵌入向量。
- import os
- import erniebot
- from typing import Dict, List, Optional
- import chromadb
- from chromadb.api.types import Documents, EmbeddingFunction, Embeddings
- def embed_query(content):
- response = erniebot.embedding.create(
- model="ernie-text-embedding",
- input=[content])
- result = response.get_result()
- print(result)
- return result
-
- class ErnieEmbeddingFunction(EmbeddingFunction):
- def __call__(self, input: Documents) -> Embeddings:
- embeddings = []
- for text in input:
- response = embed_query(text)
- try:
- embedding = response[0]
- embeddings.append(embedding)
- except (IndexError, TypeError, KeyError) as e:
- print(f"Error processing text: {text}, Error: {e}")
-
- return embeddings
- chroma_client = chromadb.Client()
- chroma_client = chromadb.PersistentClient(path="chromac") #数据保存硬盘位置 可选
- collection = chroma_client.create_collection(name="demo", embedding_function=ErnieEmbeddingFunction())
- print(collection)

选用课程内容作为知识库:
https://aistudio.baidu.com/datasetdetail/260836
使用 LangChain 库来处理和分割文本文档
- from langchain.text_splitter import CharacterTextSplitter
- from langchain.vectorstores import Chroma
- from langchain.document_loaders import TextLoader
- loader = TextLoader('./AI大课逐字稿.txt',encoding='utf-8')
- documents = loader.load()
- text_splitter = CharacterTextSplitter(chunk_size=600, chunk_overlap=20)
- docs = text_splitter.split_documents(documents)
- docs
将分割后的文档列表转换为嵌入向量,以便进行进一步的分析和处理。
- import uuid
- docs_list=[]
- metadatas=[]
- ids=[]
- for item in docs:
- docs_list.append(item.page_content)
- metadatas.append({"source": "AI大课逐字稿"})
- ids.append(str(uuid.uuid4()))
- collection.add(
- documents=docs_list,
- metadatas=metadatas,
- ids=ids
- )
- query = "讲师说见VC有两种错误的思维方式,分别是什么"
-
- results = collection.query(
- query_texts=[query],
- n_results=2
- )
- content=results['documents'][0]
- [ ]
- prompt=f"""
- 用户问题:{query}
- <context>
- {content}
- </context>
- 根据<context>里的知识点回答用户问题
- """
- response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])
- print(response.get_result())
- #讲师说见VC有两种错误的思维方式,分别是:
- ##1. 用过去的方式套今天的人工智能,比如比喻成OS。一旦比喻成操作系统,就得出结论全世界两套到三套,你觉得必然会被垄断、没有机会了,这种是典型的刻舟求剑。
- #2. 人容易对已经成功的事委曲求全,对于创新的新生代创业者容易求全责备。特别是有些做VC容易犯这个错误,比如OpenAI做成了,已经证明了,是个傻子都能看到OpenAI做的很成功,我们容易对它顶礼膜拜,恨不得跪下。对创业者很多还不成形的想法,因为八字没有一撇,光看到了你的很多缺点,这种价值观是不对的,容易Miss掉一些有潜力的项目。

包含了之前步骤中存储的文本嵌入向量。函数的目的是接收用户的查询,从数据库中检索相关信息,并生成一个回答。
-
- def main(query):
- results = collection.query(
- query_texts=[query],
- n_results=2
- )
- content=results['documents'][0]
- prompt=f"""
- 用户问题:{query}
- <context>
- {content}
- </context>
- 根据<context>里的知识点回答用户问题
- """
- response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])
- return response.get_result()
- query=input("请输入您要查询的问题:")
- print(main(query))

代码地址:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。